Traduções desta página:

Ferramentas do usuário

Ferramentas do site


05_curso_antigo:r2017:alunos:trabalho_final:carol.mendonca.bio:evolution

Evolution

evol = function (mod, gen, f, pop, N, wAA, wAa, waa, p = FALSE) #1 Cria funcao "evol" com os argumentos "mod", "gen", "f", "pop", "N", "wAA", "wAa", "waa" e "p". 
{
  #VERIFICANDO OS PARAMETROS COMUNS
  
  if (mod != "d" && mod != "s") #2 Verifica se "mod" foi inserido corretamente.
  {
    stop ("mod só pode ser d ou s.") #3 Senao, interrompe a funcao e exibe mensagem para o usuario.
  }
  
  if (gen != round (gen) | gen <= 0) #4 Verifica se "gen" eh um numero inteiro e maior que zero.
  {
    stop ("gen deve ser um numero inteiro e > 0.") #5 Senao, interrompe a funcao e exibe mensagem para o usuario.
  }
  
  if (pop != round (pop) | pop <= 0) #6 Verifica se "pop" eh um numero inteiro e maior que zero.
  {
    stop ("pop deve ser um numero inteiro e > 0.") #7 Senao, interrompe a funcao e exibe mensagem para o usuario.
  }
  
  if (p != FALSE) #8 Verifica se o usuario inseriu algum valor para "p".
  {
    if (p < 0 | p > 1 ) #9 Se sim, verifica se "p" esta no intervalo adequado para a funcao.
    {
      stop ("p deve estar no intervalo 0 <= p <= 1.") #10 Senao, interrompe a funcao e exibe mensagem para o usuario.
    }
  }
  
  #FUNCAO DE DERIVA GENETICA
  
  if (mod == "d") #11 Se o argumento "mod" for igual a "d", roda o modelo de deriva genetica. 
  {
    #VERIFICANDO OS PARAMETROS ESPECIFICOS
    
    if (f < 0 | f > 1 ) #12 Verifica se "f" esta no intervalo adequado para a funcao.
    {
      stop ("f deve estar no intervalo 0 <= f <= 1.") #13 Senao, interrompe a funcao e exibe mensagem para o usuario.
    }
    
    if (N != round (N) | N <= 0) #14 Verifica se "N" eh um numero inteiro e maior que zero.
    {
      stop ("N deve ser um numero inteiro e > 0.") #15 Senao, interrompe a funcao e exibe mensagem para o usuario.
    }
    
    #CRIANDO OS OBJETOS DA FUNCAO
    
    simulacao = rep (NA, N) #16 Cria vetor "simulacao" com "N" NAs para guardar os resultados da simulacao.
    populacao = c ((rep ("A", f * N)), rep ("a", N - (f * N))) #17 Cria vetor "populacao" com as frequencias alelicas estabelecidas por "f".
    final = rep (NA, pop) #18 Cria vetor "final" com "pop" NAs para guardar as frequencias alelicas finais de cada populacao.
    
    #PREPARANDO A AREA DOS GRAFICOS
    
    x11 () #17 Abre dispositivo de tela.
    par (mfrow = c (1, 2)) #19 Divide o dispositivo de tela em duas colunas.
    plot (x = NULL, y = NULL, #20 Plota area do grafico vazia.
          xlim = c (0, gen), ylim = c (0, 1), #21 Determina valores minimos e maximos dos eixos X e Y.
          bty = "l", #22 Coloca margens nos lados 1 e 2.
          xlab = "Geracoes", ylab = "f(A)") #23 Coloca os titulos dos eixos do grafico.
    
    #SIMULANDO AS TRAJETORIAS DAS POPULACOES
    
    for (j in 1:pop) #24 Entra em um fluxo "for" com contador "j" de 1 ate "pop".
    {
      points (0, f, col = j, pch = 16, cex = 0.5) #25 Plota a primeira frequencia alelica no grafico.
      f.old = f #26 Guarda o valor de "f" em "f.old".
      
      for (i in 1:gen) #27 Entra em um fluxo "for" com contador "i" de 1 ate "gen".
      {
        simulacao = sample (populacao, replace = TRUE) #28 Amostra com reposicao os alelos de "populacao" e guarda em "simulacao".
        f.new = (length (simulacao [simulacao == "A"])) / N #29 Calcula em "f.new" a nova frequencia alelica.
        points (i, f.new, col = j, pch = 16, cex = 0.5) #30 Plota a nova frequencia alelica no grafico.
        segments (i - 1, f.old, i, f.new, col = j) #31 Une os pontos das frequencias alelicas.
        f.old = f.new #32 A nova frequencia alelica passa a ser a antiga frequencia alelica para o proximo sorteio.
        populacao = simulacao #33 A populacao amostrada ("simulacao") passa a ser a "populacao" para o proximo sorteio.
      }
      
      populacao = c ((rep ("A", f * N)), rep ("a", N - (f * N))) #34 Retorna "populacao" para a frequencia alelica inicial.
      final [j] = f.new #35 Guarda a frequencia alelica final na posicao "j" de "final". 
    }
    
    #CRIANDO O HISTOGRAMA DAS FREQUENCIAS ALELICAS FINAIS
    
    hist (final, xlab = "f(A) final", ylab = "Frequencia", main = NULL) #36 Plota histograma com as frequencias alelicas finais.
    
    #CALCULANDO O VALOR DE P
    
    if (p != FALSE) #37 Verifica se o usuario inseriu algum valor para "p".
    {
      p = round (p, digits = 1) #38 Se sim, estabelece o valor de "p" com uma casa decimal. 
      abline (v = p, col = "red") #39 Coloca linha vertical no histograma com o valor de "p".
      mtext ("p", side = 3, at = p, col = "red") #40 Escreve "p" sobre a linha criada em #39.   
      final = c (round (final, digits = 1)) #41 Arredonda todos os elementos de "final" para uma casa decimal.
      prob = (length (final [final == p])) / pop #42 Calcula a frequencia que o valor de "p" aparece em "final".
      cat (paste ("Probabilidade de f(A) =", p, "em", pop, "populacoes com tamanho", N, "apos", gen, "geracoes:", prob)) #43 Imprime mensagem na tela com o valor de "p".
    }
  }
  
  #FUNCAO DE SELECAO NATURAL
  
  if (mod == "s") #44 Se o argumento "mod" for igual a "s", roda o modelo de selecao natural.
  {
    
    #VERIFICANDO OS PARAMETROS ESPECIFICOS
    
    if (any (f < 0 | f > 1)) #45 Verifica se os elementos de "f" estao no intervalo adequado para a funcao.
    {
      stop ("f deve ser um vetor com elementos no intervalo 0 <= f <= 1.") #46 Senao, interrompe a funcao e exibe mensagem para o usuario.
    }
    
    if (wAA < 0 | wAA > 1 ) #47 Verifica se "wAA" esta no intervalo adequado para a funcao.
    {
      stop ("wAA deve estar no intervalo 0 <= wAA <= 1.") #48 Senao, interrompe a funcao e exibe mensagem para o usuario.
    }
    
    if (wAa < 0 | wAa > 1 ) #49 Verifica se "wAa" esta no intervalo adequado para a funcao. 
    {
      stop ("wAa deve estar no intervalo 0 <= wAa <= 1.") #50 Senao, interrompe a funcao e exibe mensagem para o usuario.
    }
    
    if (waa < 0 | waa > 1 ) #51 Verifica se "waa" esta no intervalo adequado para a funcao.
    {
      stop ("waa deve estar no intervalo 0 <= waa <= 1.") #52 Senao, interrompe a funcao e exibe mensagem para o usuario.
    }
    
    #CRIANDO OS OBJETOS DA FUNCAO
    
    semi.final = rep (NA, length (f)) #53 Cria vetor "semi.final" com o comprimento de "f" preenchido com NAs para gaurdar as frequencias alelicas finais.
    
    #PREPARANDO A AREA DOS GRAFICOS
    
    x11() #54 Abre dispositivo de tela.
    par (mfrow = c (1, 2)) #55 Divide o dispositivo de tela em duas colunas.
    plot (x = NULL, y = NULL, #56 Plota area do grafico vazia.
          xlim = c (0, gen), ylim = c (0, 1), #57 Determina valores minimos e maximos dos eixos X e Y.
          bty = "l", #58 Coloca margens nos lados 1 e 2. 
          xlab = "Geracoes", ylab = "f(A)") #59 Coloca os titulos dos eixos do grafico.
    
    #SIMULANDO AS TRAJETORIAS DAS POPULACOES
    
    for (j in 1:length (f)) #60 Entra em um fluxo "for" com contador "j" de 1 ate o comprimento de "f".
    {
      points (0, f[j], col = j, pch = 16, cex = 0.5) #61 Plota a frequencia alelica inicial no grafico.
      f.old = f[j] #62 Guarda o valor da frequencia alelica inicial em "f.old".
      
      for (i in 1:gen) #63 Entra em um fluxo "for" com contador "i" de 1 ate "gen".
      {
        f.new = (((f.old * f.old) * wAA) + (f.old * (1 - f.old) * wAa)) / #64 Calcula em "f.new" a nova frequencia alelica.
                (((f.old * f.old) * wAA) + (2 * f.old * (1 - f.old) * wAa) + (((1 - f.old) * (1 - f.old)) * waa)) 
        points (i, f.new, col = j, pch = 16, cex = 0.5) #65 Plota a nova frequencia alelica no grafico.
        segments (i - 1, f.old, i, f.new, col = j) #66 Une os pontos das frequencias alelicas.
        f.old = f.new #67 A nova frequencia alelica passa a ser a antiga frequencia alelica para o proximo sorteio.
      }
      
      semi.final [j] = f.new #68 Guarda a frequencia alelica final na posicao "j" de "semi.final". 
    }
    
    #CRIANDO O HISTOGRAMA DAS FREQUENCIAS ALELICAS FINAIS
    
    final = rep (semi.final, each = pop) #69 Como o modelo eh deterministico, nao ha necessidade de repetir as simulacoes para as mesmas frequencias alelicas iniciais.
                                         #Assim, no vetor "final" os valores das simulacoes sao repetidos para as simulacoes com as mesmas frequencias iniciais.
    hist (final, xlab = "f(A) final", ylab = "Frequecia", main = NULL) #70 Plota histograma com as frequencias alelicas finais.
    
    #CALCULANDO O VALOR DE P
    
    if (p != FALSE) #71 Verifica se o usuario inseriu algum valor para "p".
    {
      p = round (p, digits = 1) #72 Se sim, estabelece o valor de "p" com uma casa decimal. 
      abline (v = p, col = "red") #73 Coloca linha vertical no histograma com o valor de "p".
      mtext ("p", side = 3, at = p, col = "red")  #74 Escreve "p" sobre a linha criada em #73.  
      final = c (round (final, digits = 1)) #75 Arredonda todos os elementos de "final" para uma casa decimal.
      prob = round ((length (final [final == p])) / (pop * length (f)), digits = 2) #76 Calcula a frequencia que o valor de "p" aparece em "final".
      cat (paste ("Probabilidade de f(A) =", p, "após", gen, "geracoes:", prob)) #77 Imprime mensagem na tela com o valor de "p".
    }
  }
}
05_curso_antigo/r2017/alunos/trabalho_final/carol.mendonca.bio/evolution.txt · Última modificação: 2020/08/12 06:04 (edição externa)