Crescimento Populacional e a Seleção Natural

A teoria da evolução é talvez a teoria mais importante para a biologia. Ela unificou muitos ramos científicos atribuídos a biologia que antes dela eram praticamente áreas distintas, como fisiologia, taxonomia, comportamento, etc.

Temos a frase celebre do nosso colega Theodosius Dobzhansky.

Nada em biologia faz sentido se não for à luz da evolução

Mas será que a gente realmente entende como a evolução funciona?

Quero dizer, provavelmente, todo mundo tem uma noção básica. O que a gente aprende na escola é tranquilo, mas o problema é que muitas vezes nos lembramos do exemplo básico e fazemos generalizações muito amplas, ou pior ainda, generalizações curtas e não conseguimos ver o processo como ele realmente ocorre.

Na verdade a teoria da evolução é muito mais do que vamos ver aqui, mas vamos olhar como funciona o negócio de variação no número de descendentes produzidos. Quem não lembra do exemplo da mariposa e da revolução industrial. A Biston betularia. Essa ai é aquela mariposa que existia de dois tipo, ou dois fenótipos, como preferir.

Tinhamos a versão, ou fenótipo mais claro.
claro

E a versão, ou fenótipo, mais escuro.
escuro

Ai antes da poluição, a mais clarinha era comum, e a escura era muito rara, com o acumulo de fuligem nos troncos das arvores, a clarinha começou a não ser muito boa para se camuflar, a escura, da cor da fuligem, começou a se dar bem e o cenário se inverteu, com a clarinhas passando a ser a mais rara e a escura sendo a mais comum.

Daqui pra frente vamos chamar de fenótipos sempre. Se a gente fosse la no campo e conta-se todas as mariposas existentes, poderíamos dizer que existe uma quantidade N de mariposas, essa quantidade sendo independente do fenótipo, que é a cor para as mariposas.

E elas vão vivendo, se reproduzindo a uma certa taxa, e bem isso nos faz lembrar da equação de crescimento populacional.

N_t = N_0 \cdot r^t

Lembre-se que estamos falando do crescimento discreto ai em cima, não confunda com a formula N_t = N_0 \cdot e^{r \cdot t} , a gente já discutiu sobre crescimento discreto versus crescimento contínuo aqui, de uma olhada para relembrar e ver a diferença.

Mas continuando, então temos nosso crescimento populacional, vamos ficar com ele por enquanto para facilitar o raciocinio, se começar a meter aquele número e de Euler vai ficar tudo mais difícil.

N_t = N_0 \cdot r^t

So que essa equação é valida para toda a população dessa determinada espécie, todos os indivíduos de uma região que compõem uma população de uma certa espécie, nossa mariposinha por exemplo.

Vamos pensar nos fenótipos claro e escuro como fenótipo A e fenótipo a, cada um deles então vai ter uma frequência na população, que chamaremos de f_A e f_a e cada um deles vai ter sua taxa de crescimento R, r_A e r_a, que também é conhecido como o fitness absoluto (Absolute fitness), que a princípio vamos considerar como igual a taxa de crescimento da população como um todo, escrevendo isso de forma mais clara, vamos assumir que r_A = r_a = R.

Primeiro, vamos pensar que o número inicial de indivíduos A seria igual a sua frequência no total inicial da população.

N_{A,0} = N_0 \cdot f_A

Certo, se a população inicial é N_0, sabemos que uma fração dela é de mariposas claras, a fração é f_A, por isso se multiplicar o total pela fração N_0 \cdot f_A da N_{A,0}

O mesmo vai ser valido para a população de a,

N_{a,0} = N_0 \cdot f_a

Lembrando que f_A + f_a = 1, tem que ser o total da população.

Vamos em frente, A e a são a população total dessa espécie.

N_0 = N_0 \cdot f_A + N_0 \cdot f_a

Sem muita mágica até aqui.
Certo, agora como o crescimento vai funcionar aqui?
Muito simples, para a próxima geração (vamos pensar apenas na diferença de uma geração para a próxima) temos a quantidade inicial vezes a taxa de crescimento, so que por cada um dos fenótipos.

Para A temos

N_{A,1} = N_0 \cdot f_A \cdot r_A

E para a temos

N_{a,1} = N_0 \cdot f_a \cdot r_a

Mas como r_A = r_a = r, o fitness dos dois são iguais, então poderíamos simplesmente dizer.

N_{A,1} = N_0 \cdot f_A \cdot r

e

N_{a,1} = N_0 \cdot f_a \cdot r

Então podemos ver que a população total no tempo 1 N_1 vai ser

N_1 = N_0 \cdot f_A \cdot r + N_0 \cdot f_a \cdot r

Veja que o termo N_0, que é a população total inicial e o termo rocorrem nas duas multiplicações, então podemos simplificar isso.

N_1 = N_0 \cdot r \cdot (f_A + f_a)

Lembre-se que f_A + f_a = 1 já que são frequência, e esses dois A e a tem que ser o todo.

Então apos uma geração a frequência de A será a quantidade de indivíduos A pelo total de indivíduos da população, a frequência f_A será o seguinte.

{f_{A,1}} = {{N_0 \cdot f_{A,0} \cdot r}\over{N_0 \cdot r}}

Como é tudo uma multiplicação podemos cortar os N_0 e r e assim ficamos somente com.

f_{A,1}= f_{A,0}

A frequência na próxima geração não mudou nada.

Mas é isso que esperamos não? Porque nesse exemplo r_A = r_a = r, ou seja os dois fenótipos eram igualmente bons, mas e se r_A \ne r_a, um deles pode ser melhor que o outro, sei la r_A > r_a ou r_A < r_a, mas ambos os casos r_A \ne r_a, como fica esse mesmo esquema?

A principio, a próxima geração vai ter a mesma formula do crescimento.

N_{A,1} = N_0 \cdot f_A \cdot r_A

E para a temos

N_{a,1} = N_0 \cdot f_a \cdot r_a,

Ou ainda, generalizando para o tempo t, temos

N_{A,t} = N_0 \cdot f_A \cdot {r_A}^t

E para a temos

N_{a,t} = N_0 \cdot f_a \cdot {r_a}^t

Ou seja a população N_t será

N_{t} = N_0 \cdot f_A \cdot {r_A}^t + N_0 \cdot f_a \cdot {r_a}^t

Agora vamos fazer aquela conta denovo, após t gerações, a frequência f_A vai ser a quantidade de individuos A sobre o total N

{f_{A,t}} = {N_0 \cdot f_A \cdot {r_A}^t \over{N_0 \cdot f_A \cdot {r_A}^t + N_0 \cdot f_a \cdot {r_a}^t}}

Agora nos podemos avaliar a frequência de a depois de t gerações assim como fizemos antes, mas podemos simplificar um pouco essa equação. Podemos começar tirando esse N_0 em cima e em baixo na divisão.

A frequência f_A vai ser o total dela sobre o tamanho total da população.
{f_{A,t}} = {f_A \cdot {r_A}^t \over{f_A \cdot {r_A}^t + f_a \cdot {r_a}^t}}

Agora podemos dividir em cima e em baixo por r_A e ficamos com o seguinte

{f_{A,t}} = {{f_A}\over{{f_A} + {f_a \cdot {{r_a}^t\over{{r_A}^t}}}}}

E finalmente temos a nossa equação para acompanhar como a frequência gênica muda ao longo das gerações.
Se a gente pensar um pouco, quando a razão {r_a}^t\over{{r_A}^t} é 1, ambos os fenótipos são igualmente bons, essa razão da um, e teremos  {f_A}\over{f_A + f_a \cdot 1}, como  f_A + f_a = 1, teremos  f_A dividido por 1 e nada nunca muda. Agora qualquer desvio na razão {r_a}^t\over{{r_A}^t} para mais ou para menos que 1, teremos mudanças.

Mas de qualquer forma, vamos jogar alguns números e fazer uma simulação no R.

Precisamos estabelecer algumas condições iniciais, e pensar por quantas gerações queremos simular.

# ************************************************** # Condições iniciais # ************************************************** N0 <- 1000 # População inicial rate_A <- 1.2 # Taxa de crescimento do alelo "A" rate_a <- 1.2 # Taxa de crescimento do alelo "a" fA <- 0.3 # Frequência do alelo "A" max_gen <- 20 # Número de gerações a simular

Veja que baseado naquelas quantidades, o resto dos ingredientes são derivados

# ************************************************** # Calculando variáveis derivadas # ************************************************** fa <- 1.0 - fA # Frequência do alelo "a" NA_0 <- N0 * fA # População inicial do alelo "A" Na_0 <- N0 * fa # População inicial do alelo "a"

Mas vamos la, criamos uma função para com aquelas condições iniciais e usando as equações que estabelecemos acima para ver o que acontece.

evosimu<-function(N0,rate_A,rate_a,fA,max_gen) {
    fa <-1.0-fA
    NA_0<- N0 * fA
    Na_0<- N0 * fa
 
    resultado<-matrix(NA,ncol=5,nrow=max_gen+1)
    colnames(resultado)<-c("Nt","NA_t","Na_t","fA_t","fa_t")
    resultado[1,]<-c(N0,NA_0,Na_0,fA,fa)
 
    for(t in 2:(max_gen+1)) {
        resultado[t,"NA_t"] = NA_0 * (rate_A ^ t)
        resultado[t,"Na_t"] = Na_0 * (rate_a ^ t)
        resultado[t,"Nt"] =  resultado[t,"NA_t"] + resultado[t,"Na_t"]
        resultado[t,"fA_t"] =  resultado[t,"NA_t"] / resultado[t,"Nt"]
        resultado[t,"fa_t"] = resultado[t,"Na_t"] / resultado[t,"Nt"]
    }
    return(resultado)
}

E testamos nossa funçãozinha.

> evosimu(N0=N0,rate_A=rate_A,rate_a=rate_a,fA=fA,max_gen=10) Nt NA_t Na_t fA_t fa_t [1,] 1000.000 300.0000 700.000 0.3 0.7 [2,] 1440.000 432.0000 1008.000 0.3 0.7 [3,] 1728.000 518.4000 1209.600 0.3 0.7 [4,] 2073.600 622.0800 1451.520 0.3 0.7 [5,] 2488.320 746.4960 1741.824 0.3 0.7 [6,] 2985.984 895.7952 2090.189 0.3 0.7 [7,] 3583.181 1074.9542 2508.227 0.3 0.7 [8,] 4299.817 1289.9451 3009.872 0.3 0.7 [9,] 5159.780 1547.9341 3611.846 0.3 0.7 [10,] 6191.736 1857.5209 4334.215 0.3 0.7 [11,] 7430.084 2229.0251 5201.059 0.3 0.7

Temos como entradas as quantidades iniciais, que repetimos na primeira linha, a geração zero, e temos na saída o tamanho da população total como primeira coluna, como ela vai mudando sendo cada geração uma linha, como cada fenótipo muda, bem como suas frequências ao longo das gerações, mas como olhar para uma matriz de números é meio chato, vamos representar esses dados em dois gráficos, um de como está a população e outro de como estão as frequências.

01

Certo, bem simples não, a população está crescendo exponencialmente, e as frequências genicas estão constantes, como previmos, porque as taxas de crescimento iniciais que colocamos para essa simulação são iguais.

rate_A <- 1.2 # Taxa de crescimento do alelo "A" rate_a <- 1.2 # Taxa de crescimento do alelo "a"

Agora lembre-se que nem tudo na vida são flores, se tivermos taxas de crescimento abaixo de 1, a população estará diminuindo.

Vamos pegar esse caso aqui.

#N0 = 1000 rate_A = 0.7 rate_a = 0.7 fA = 0.3

02

Mas ainda temos as frequências dos fenótipos iguais, aqui ta todo mundo se ferrando igual. Agora quando a gente diz que está havendo evolução é quando as frequência começam a mudar, quando aparece um novo mutante que derrepente se da melhor, se alguém tem a taxa de crescimento maior que sua contraparte, vemos o seguinte.

#N0 = 1000 rate_A = 2.0 rate_a = 1.5 fA = 0.02

03

Veja que aqui, nenhum dos fenótipos está necessáriamente se ferrando, só temos um fenótipo que é melhor que o outro, mas ninguém está diminuindo em quantidade ao longo do tempo, a população está crescendo como um todo, todos os fenótipos estão crescendo, apenas um mais rápido que o outro, mas isso faz com que a frequência dos fenótipos mude. Quando eu digo que as vezes a evolução pode não ser tão simples, porque como no exemplo das mariposas, a gente não pensa nesse caso assim, a gente sempre pensa que se alguém é pior, ele tem que estar se ferrando, como no próximo exemplo

#N0 = 1000 rate_A = 1.2 rate_a = 0.9 fA = 0.02

04

Essa é a situação que a gente tem na cabeça para as mariposas, pelo menos a primeira que vinha na minha, se a gente pensar na linha azul como as mariposas brancas e vermelho as mariposas escuras, a gente quer que alguém seja muito comum e alguém raro, ai esse cara mais comum, as mariposas brancas, começam a se dar mal por causa da revolução industrial, as mariposas escuras, que antes eram raras e ruim, começam a se dar bem, e temos uma inversão de quem é mais raro e quem é mais comum, mas vemos que a população decaiu um pouco e depois voltou a crescer. Mas como vimos, a evolução pode acontecer mesmo quando todo mundo está se dando bem, com a população crescendo, e além disso ainda, podemos pensar em outra situação.

#N0 = 10000 rate_A = 0.8 rate_a = 0.6 fA = 0.02

05

E é isso ai, ambos os fenótipos estão se ferrando, ambos estão diminuindo sua frequência. Cada vez que você olha a mata, você ve menos e menos daquela espécia que você observa, mas isso não quer dizer que a evolução não possa estar agindo ali. Veja que aqui não é quem se ferra e quem se da bem, aqui a situação é quem se ferra menos, quem pode perdurar aos tempos difíceis, talvez essa espécie seja extinta, mas talvez não, e quando os tempos mudarem, ela pode voltar a crescer, mas as frequências dos fenótipos estão alteradas já na próxima largada para o crescimento populacional.

Mas, não é a toa que nos humanos somos péssimos geradores de números aleatórios, pelo menos eu, sempre tendia a pensar em evolução, no caso de uma espécie que tem um fenótipo se tornando mais raro, porque a população dele está diminuindo, e outro se tornando mais comum porque a população dele está aumentando, mas esteja a população estacionada, aumentando ou diminuindo, as frequências de alelos, fenótipos, snp, como queria pensar, podem estar mudando, e todos esses cenários tem que estar na nossas cabeças.

So que a primeira coisa que vem na minha cabeça é um fenótipo se dando bem e outro se dando mal. Mas existem muitos mais possibilidades. Então é preciso se policiar para não tomar conclusões precipitadas, e conduzir uma análise de dados que de possibilidade de todos os casos serem avaliados corretamente.

Alias, para teste em sistemas mais complexos, sempre esses teste envolvem simulações com parâmetros aleatórios, porque muitas vezes o que podemos pensar não contempla todas as possibilidades, pensa em quantas árvores podemos desenhar com n espécies, eu nunca pensei que existissem tantas possibilidades assim, e é fácil se perder nas contas. Mas ao tentar algumas simulações, passar tudo para um modelo e ir tentando várias possibilidades de parâmetros, podemos talvez ver aquilo que nunca tinha passado pela nossa cabeça.

Bem é isso ai, as equações la do começo do post eu peguei de um curso do coursera, o Computational Molecular Evolution, ótimo curso alias, uma excelente seleção de tópicos para a ementa e conceitos bem complicados são explicados de maneira bem simples, pena que a maior parte pratica é usando o paup, mas agora é ir adaptando tudo pro R com as ferramentas que tivermos a mãos. Scripts no repositório recologia e aqui em baixo, e até o próximo post.

# **************************************************
# Condições iniciais
# **************************************************
 
N0      <- 1000 # População inicial
rate_A  <- 1.2  # Taxa de crescimento do alelo "A"
rate_a  <- 1.2  # Taxa de crescimento do alelo "a"
fA      <- 0.3  # Frequência do alelo "A"
max_gen <- 20   # Número de gerações a simular
 
# **************************************************
# Calculando variáveis derivadas
# **************************************************
 
fa   <- 1.0 - fA  # Frequência do alelo "a"
NA_0 <- N0 * fA   # População inicial do alelo "A"
Na_0 <- N0 * fa   # Polulação inicial do alelo "a"
 
# **************************************************
# Simulação
# **************************************************
 
evosimu<-function(N0,rate_A,rate_a,fA,max_gen) {
    fa <-1.0-fA
    NA_0<- N0 * fA
    Na_0<- N0 * fa
 
    resultado<-matrix(NA,ncol=5,nrow=max_gen+1)
    colnames(resultado)<-c("Nt","NA_t","Na_t","fA_t","fa_t")
    resultado[1,]<-c(N0,NA_0,Na_0,fA,fa)
 
    for(t in 2:(max_gen+1)) {
        resultado[t,"NA_t"] = NA_0 * (rate_A ^ t)
        resultado[t,"Na_t"] = Na_0 * (rate_a ^ t)
        resultado[t,"Nt"] =  resultado[t,"NA_t"] + resultado[t,"Na_t"]
        resultado[t,"fA_t"] =  resultado[t,"NA_t"] / resultado[t,"Nt"]
        resultado[t,"fa_t"] = resultado[t,"Na_t"] / resultado[t,"Nt"]
    }
    return(resultado)
}
 
evosimu(N0=N0,rate_A=rate_A,rate_a=rate_a,fA=fA,max_gen=10)
 
saida<-evosimu(N0=N0,rate_A=rate_A,rate_a=rate_a,fA=fA,max_gen=max_gen)
 
layout(matrix(c(1,2),nrow=2,ncol=1))
plot(0:max_gen,saida[,"Nt"],frame=F,xlab="Geração",ylab="População",type="l",ylim=c(0,max(saida[,"Nt"])))
points(0:max_gen,saida[,"NA_t"],type="l",col="red")
points(0:max_gen,saida[,"Na_t"],type="l",col="blue")
legend("topleft",col=c("black","red","blue"),lty=1,legend=c("Total","A","a"),bty="n")
plot(0:max_gen,saida[,"fA_t"],frame=F,xlab="Geração",ylab="Frequência Gênica",type="l",ylim=c(0,1),col="red")
points(0:max_gen,saida[,"fa_t"],type="l",col="blue")
 
#N0 = 50     rate_A = 1.2  rate_a = 1.2  fA = 0.3
saida<-evosimu(N0=50,rate_A=1.2,rate_a=1.2,fA=0.3,max_gen=20)
 
layout(matrix(c(1,2),nrow=2,ncol=1))
plot(0:max_gen,saida[,"Nt"],frame=F,xlab="Geração",ylab="População",type="l",ylim=c(0,max(saida[,"Nt"])))
points(0:max_gen,saida[,"NA_t"],type="l",col="red")
points(0:max_gen,saida[,"Na_t"],type="l",col="blue")
legend("topleft",col=c("black","red","blue"),lty=1,legend=c("Total","A","a"),bty="n")
plot(0:max_gen,saida[,"fA_t"],frame=F,xlab="Geração",ylab="Frequência Gênica",type="l",ylim=c(0,1),col="red")
points(0:max_gen,saida[,"fa_t"],type="l",col="blue")
 
#N0 = 1000   rate_A = 0.7  rate_a = 0.7  fA = 0.3
saida<-evosimu(N0=100,rate_A=0.7,rate_a=0.7,fA=0.3,max_gen=max_gen)
 
layout(matrix(c(1,2),nrow=2,ncol=1))
plot(0:max_gen,saida[,"Nt"],frame=F,xlab="Geração",ylab="População",type="l",ylim=c(0,max(saida[,"Nt"])))
points(0:max_gen,saida[,"NA_t"],type="l",col="red")
points(0:max_gen,saida[,"Na_t"],type="l",col="blue")
legend("topright",col=c("black","red","blue"),lty=1,legend=c("Total","A","a"),bty="n")
plot(0:max_gen,saida[,"fA_t"],frame=F,xlab="Geração",ylab="Frequência Gênica",type="l",ylim=c(0,1),col="red")
points(0:max_gen,saida[,"fa_t"],type="l",col="blue")
 
#N0 = 1000   rate_A = 2.0  rate_a = 1.5  fA = 0.02
saida<-evosimu(N0=1000,rate_A=2.0,rate_a=1.5,fA=0.02,max_gen=max_gen)
 
layout(matrix(c(1,2),nrow=2,ncol=1))
plot(0:max_gen,saida[,"Nt"],frame=F,xlab="Geração",ylab="População",type="l",ylim=c(0,max(saida[,"Nt"])))
points(0:max_gen,saida[,"NA_t"],type="l",col="red")
points(0:max_gen,saida[,"Na_t"],type="l",col="blue")
legend("topleft",col=c("black","red","blue"),lty=1,legend=c("Total","A","a"),bty="n")
plot(0:max_gen,saida[,"fA_t"],frame=F,xlab="Geração",ylab="Frequência Gênica",type="l",ylim=c(0,1),col="red")
points(0:max_gen,saida[,"fa_t"],type="l",col="blue")
 
#N0 = 1000   rate_A = 1.2  rate_a = 0.9  fA = 0.02
saida<-evosimu(N0=1000,rate_A=1.2,rate_a=0.9,fA=0.02,max_gen=max_gen)
 
layout(matrix(c(1,2),nrow=2,ncol=1))
plot(0:max_gen,saida[,"Nt"],frame=F,xlab="Geração",ylab="População",type="l",ylim=c(0,max(saida[,"Nt"])))
points(0:max_gen,saida[,"NA_t"],type="l",col="red")
points(0:max_gen,saida[,"Na_t"],type="l",col="blue")
legend("topleft",col=c("black","red","blue"),lty=1,legend=c("Total","A","a"),bty="n")
plot(0:max_gen,saida[,"fA_t"],frame=F,xlab="Geração",ylab="Frequência Gênica",type="l",ylim=c(0,1),col="red")
points(0:max_gen,saida[,"fa_t"],type="l",col="blue")
 
#N0 = 10000  rate_A = 0.8  rate_a = 0.6  fA = 0.02
saida<-evosimu(N0=10000,rate_A=0.8,rate_a=0.6,fA=0.02,max_gen=max_gen)
 
layout(matrix(c(1,2),nrow=2,ncol=1))
plot(0:max_gen,saida[,"Nt"],frame=F,xlab="Geração",ylab="População",type="l",ylim=c(0,max(saida[,"Nt"])))
points(0:max_gen,saida[,"NA_t"],type="l",col="red")
points(0:max_gen,saida[,"Na_t"],type="l",col="blue")
legend("topleft",col=c("black","red","blue"),lty=1,legend=c("Total","A","a"),bty="n")
plot(0:max_gen,saida[,"fA_t"],frame=F,xlab="Geração",ylab="Frequência Gênica",type="l",ylim=c(0,1),col="red")
points(0:max_gen,saida[,"fa_t"],type="l",col="blue")

Leave a Reply

Your email address will not be published. Required fields are marked *