<html><head><style type="text/css"><!-- DIV {margin:0px;} --></style></head><body><div style="font-family:times new roman,new york,times,serif;font-size:12pt">Na verdade, o que eu preciso é que vc coloque esse data.frame para nós ajudarmos! Coloque o negócio em "ponto de bala" e faremos apenas a otimização!<br><br>Sem isso fica difícil otimizar!<br><br>Valeu!!!<br><div> </div>            Fábio Mathias Corrêa<br>        Departamento de Estatística<br>   Universidade Estadual de Santa Cruz<br><br><br><br><div>Tel.: 73-3680-5076<br>Cel.: 73-9991-8155<div><br></div><div style="font-family: times new roman,new york,times,serif; font-size: 12pt;"><br><div style="font-family: times new roman,new york,times,serif; font-size: 12pt;"><font size="2" face="Tahoma"><hr size="1"><b><span style="font-weight: bold;">De:</span></b> Fernando Henrique Toledo
 <fernandohtoledo@gmail.com><br><b><span style="font-weight: bold;">Para:</span></b> r-br@listas.c3sl.ufpr.br<br><b><span style="font-weight: bold;">Enviadas:</span></b> Segunda-feira, 21 de Março de 2011 15:19:54<br><b><span style="font-weight: bold;">Assunto:</span></b> Re: [R-br] Res: Res: Implementação em C<br></font><br>Fabio,<br><br>A entrada da função dialelo é além dos outros argumentos explicados
abaixo uma planilha de dados \textsf{data.frame} que contêm na primeira
coluna  identificação da família do indivíduo, na segunda coluna o pai
(progenitor 1) do indivíduo, na terceira coluna a mãe do indivíduo
(progenitor 2). Da quarta até a coluna \textsl{\texttt{g + 3}} são os
valores genotípicos por loco do indivíduo, e nas últimas duas colunas
tem-se o valor genotípico total e o valor fenotípico do indivído
respectivamente.<br>
<br>A função denominada \textsl{\texttt{dialelo}} e tem com argumentos:
\textsl{\texttt{pais}} que é um vetor contendo a identificação dos
indivíduos que serão os pais no dialelo. O argumento
\textsl{\texttt{populacao}} indica de que população esses indivíduos
serão obtidos (o data.frame descrito acima), \textsl{\texttt{prole}},
assim como na função \textsl{\texttt{cruz}} é um número inteiro que
indica quantos individuos filhos serão gerados a partir de um dado
cruzamento do dialelo. Os argumentos \textsl{\texttt{h2}}, é um valor
entre zero e um, que dimensiona um ruido proposital e
\textsl{\texttt{gmd}}, pode assumir qualquer valor, mas o que será
utilizado é 0 ou 1, que simula diferentes interações alélicas!<div><span id="q_12ed861e7ac267e5_1" class="h4"><br>abraço,<br>Fernando H<br></span></div><br><br><div class="gmail_quote">2011/3/21 Fabio Mathias Corrêa <span dir="ltr"><<a rel="nofollow" ymailto="mailto:fabio.ufla@yahoo.com.br" target="_blank" href="mailto:fabio.ufla@yahoo.com.br">fabio.ufla@yahoo.com.br</a>></span><br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div><div style="font-family: times new roman,new york,times,serif; font-size: 12pt;">Fernando,<br>
<br>Faltou apenas um pequeno exemplo de como inicia a simulação!<div class="im"><br><br>Valeu!!!<br><div> </div>            Fábio Mathias Corrêa<br>        Departamento de Estatística<br>   Universidade Estadual de Santa Cruz<br>
<br><br><br></div><div>Tel.: 73-3680-5076<br>Cel.: 73-9991-8155<div><br></div><div style="font-family: times new roman,new york,times,serif; font-size: 12pt;"><br><div style="font-family: times new roman,new york,times,serif; font-size: 12pt;">
<font size="2" face="Tahoma"><hr size="1"><div class="im"><b><span style="font-weight: bold;">De:</span></b> Fernando Henrique Toledo <<a rel="nofollow" ymailto="mailto:fernandohtoledo@gmail.com" target="_blank" href="mailto:fernandohtoledo@gmail.com">fernandohtoledo@gmail.com</a>><br>
<b><span style="font-weight: bold;">Para:</span></b> <a rel="nofollow" ymailto="mailto:r-br@listas.c3sl.ufpr.br" target="_blank" href="mailto:r-br@listas.c3sl.ufpr.br">r-br@listas.c3sl.ufpr.br</a><br></div><b><span style="font-weight: bold;">Enviadas:</span></b> Segunda-feira, 21 de Março de 2011 8:43:36<br>
<b><span style="font-weight: bold;">Assunto:</span></b> Re: [R-br] Res: Implementação em C<br></font><div><div></div><div class="h5"><br>Senhores, bom dia.<br><br>A simulação que pretendo realizar implementei através das funções que estão listadas abaixo, a combinations é do pacote gtools, necessáriamente queria só melhorar o tempo de processamento do função dialelo, especificamente no for() que corre pela matriz de combinações. Fui rodando odas as etapas da função e detectei justamente nesse ponto o gargalo do calculo.<br>

<br>att,<br>Fernando H<br><br># _____________________________________________________________________<br>#_ OK<br>#_ Função para cálculo do valor genotípico<br>#_ Parâmetros:  indv = indvíduo sob análise<br>#                gmd = grau médio de dominância<br>

#______________________________________________________________________<br><br><a rel="nofollow" target="_blank" href="http://soma.vg">soma.vg</a> <- function(indv, gmd){ # argumentos da função<br>  h <- gmd # atribui o desvio de dominância ao heterozigoto<br>

  gen <- numeric() # cria um vetor qualquer - armazena os valores genotípicos<br>  for(i in 1:length(indv)){ # 'laço' - passa a regra p/ cada loco<br>    # se o loco for igual a 'r' (recessivo) valor genotípico recebe -1<br>

    # se o loco for igual a 'h' (heterozigoto) valor genotípico recebe gmd<br>    # se o loco for igual a 'd' (dominante) valor genotípico recebe 1<br>    if(indv[i] == 'r') {<br>      gen[i] <- -1<br>

    } else {<br>      if(indv[i] == 'h') gen[i] <- h else gen[i] <- 1<br>    }<br>  }<br>  return(sum(gen)) # retorna a soma dos valores genotípcos por loco<br>}<br><br># _____________________________________________________________________<br>

#_ OK<br>#_ Função para regra da segregação<br>#_ Parâmetros:  pai e mãe = indvíduos sob análise (cruzando)<br>#______________________________________________________________________<br><br>segregacao <- function(pai, mae) { # argumentos da função<br>

  filho <- numeric() # cria um vetor qualquer - armazena os valores genotípicos do filho<br>  for(i in 1:length(pai)) { # 'laço' - passa a regra de segregação p/ cada loco<br>    # se ambos pais são homozigotos dominantes (d), filho é dominante (d)<br>

    # se um pai é dominante e o outro é heterozigoto (h) filho pode ser 'h' ou 'd' 50% p/ cada<br>    # se ambos pais são heterozigoto segregação 1:2:1 'd', 'h', e 'r'<br>    # se um pai é dominante e o outro é recessivo filho é heterozigoto<br>

    # se um pai é reccessivo e o outro é heterozigoto filho pode ser 'r' ou 'r' 50% p/ cada<br>    # se ambos pais são recessivos filho é recessivo<br>    if(pai[i] == 'd' & mae[i] == 'd') filho[i] <- 'd'<br>

    if(pai[i] == 'd' & mae[i] == 'h' | pai[i] == 'h' & mae[i] == 'd'){<br>      u <- runif(1)<br>      if(u <= .5) filho[i] <- 'd' else filho[i] <- 'h'<br>

    }<br>    if(pai[i] == 'd' & mae[i] == 'r' | pai[i] == 'r' & mae[i] == 'd'){<br>      filho[i] <- 'h'<br>    }<br>    if(pai[i] == 'h' & mae[i] == 'h'){<br>

      u <- runif(1)<br>      if(u <= .25) filho[i] <- 'd' else<br>      if((u > .25) & (u <= .75)) filho[i] <- 'h' else<br>      filho[i] <- 'r'<br>    }<br>    if(pai[i] == 'h' & mae[i] == 'r' | pai[i] == 'r' & mae[i] == 'h'){<br>

      u <- runif(1)<br>      if(u <= .5) filho[i] <- 'h' else filho[i] <- 'r'<br>    }<br>    if(pai[i] == 'r' & mae[i] == 'r') filho[i] <- 'r'<br>  }<br>  return(filho) # retorna a constituição genética do filho do cruzamento<br>

}<br><br># _____________________________________________________________________<br>#_ OK<br>#_ Função para fazer cruzamentos<br>#_ Parâmetros:    pai e mae = indvíduos, 'pai' e 'mãe'<br>#                     prole = número de indivíduos na progênie     <br>

#______________________________________________________________________<br><br>cruz<-function(pai, mae, prole){ # argumentos da função<br>  progenie <- matrix(NA, ncol = length(pai), nrow = prole) # cria matriz qualquer [prole,g] - armazena a prole<br>

  for(i in 1:prole) { #'laço' - cria prole filhos do cruzamento<br>    progenie[i,] <- segregacao(pai, mae)<br>  }<br>  return(progenie) # retorna a prole do cruzamento<br>}<br><div class="gmail_quote"><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

<div><div>
><br>
> # _____________________________________________________________________<br>
> #<br>
> #_ Função para fazer um dialelo<br>
> #_ Parâmetros:  pais = indivíduos selecionados na população anterior<br>
> #          população = população dos pais<br>
> #              prole = tamanho das progênies<br>
> #                 h2 = herdabilidade do caráter<br>
> #                gmd = grau médio de dominância<br>
> #______________________________________________________________________<br>
> dialelo <- function(pais, populacao, prole, h2, gmd) { # argumentos da<br>
> função<br>
>   combinacoes <- combinations(length(pais), 2, v = pais) # cria todas as<br>
> combinações híbridas<br>
>   progenies <- vector('list', length = nrow(combinacoes)) # cria a<br>
> estrutura<br>
> das progênies<br>
>   id <- cbind(rep(c(1:nrow(combinacoes)), each = prole),<br>
>               rep(combinacoes[,1], each = prole),<br>
>               rep(combinacoes[,2], each = prole)) # cria a estrutura de<br>
> identificação das progênies<br>
>   g <- ncol(populacao) - 5 # verifica o número de genes envolvidos<br>
>   for(i in 1:nrow(combinacoes)) { # 'laço' -  para executar todos<br>
> cruzamentos<br>
>     cruz.i <- cruz(populacao[combinacoes[i,1],4:(3 + g)],<br>
>                    populacao[combinacoes[i,2],4:(3 + g)],prole) # aplica a<br>
> função 'cruz'<br>
>     progenies[[i]] <- cruz.i # armazena a prole de cada cruzamento<br>
>   }<br>
>   dialelo <- as.data.frame(do.call(rbind, progenies)) # monta a planilha<br>
> com<br>
> o dialelo<br>
>   vg <- apply(dialelo, 1, <a rel="nofollow" target="_blank" href="http://soma.vg">soma.vg</a>, gmd = gmd) # calcula os valores<br>
> genotípicos totais por indivíduo<br>
>   varg <- var(vg) # calcula a variância genética<br>
>   fen <- vg + rnorm(nrow(dialelo), mean = 0, sqrt(varg * (1 - h2) / h2)) #<br>
> atribui o desvio fenotípico<br>
>   resp <- cbind(id, dialelo, vg, fen) # monta a planilha com os resultados<br>
> do dialelo<br>
>   names(resp) <- c('fami', 'pai', 'mae', 1:g, 'vg', 'fen') # atribui os<br>
> nomes as colunas da planilha<br>
>   return(resp) # retorna o dialelo<br>
> }<br></div></div></blockquote></div>
</div></div></div></div></div>
</div><br>



       </div><br>_______________________________________________<br>
R-br mailing list<br>
<a rel="nofollow" ymailto="mailto:R-br@listas.c3sl.ufpr.br" target="_blank" href="mailto:R-br@listas.c3sl.ufpr.br">R-br@listas.c3sl.ufpr.br</a><br>
<a rel="nofollow" target="_blank" href="https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br">https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br</a><br>
<br></blockquote></div><br>
</div></div></div>
</div><br>



       </body></html>