Random Walk ou a caminhada aleatória

rw

Random walk, caminhada ao acaso ou talvez caminhada aleatória é um termo recorrente em biologia, mas que eu achei bem difícil entender.

Ele aparece e reaparece dentro da biologia sempre não importa para onde vamos.

A primeira vez que ouvi menção sobre ele foi ligado a teoria unificada da biodiversidade (UNTB) que diz que dentro dos níveis tróficos, as espécies são equivalentes, e que mudanças na abundância, composição e riqueza de espécies variam ao acaso, como um random walk. Se a gente vê uma espécie ali é porque ela teve sorte e não porque é melhor adaptada. Isso pode parecer bater de frente com a evolução, mas talvez tenha uma ponta de verdade já que como a evolução esta sempre em ação, realmente quem a gente esta vendo agora é porque sobreviveu a seleção natural, ou seja pelo menos adaptado ao momento de agora a espécie esta até certo ponto, então assumir alguma equivalência nessa adaptação entre espécies me parece razoável. Mas caso a idéia seja olhar melhor para a UNTB, o R tem o pacote UNTB para melhor entender como ela funciona e suas previsões.

Outro lugar onde a palavra Random Walk aparece é na genética, na teoria neutra, que alias diferente da UNTB, não tem muita discussão sobre sua ocorrência. Então temos alguns pedaços do DNA, sequências que não influenciam na nossa sobrevivência, logo não estão sobre influencia da seleção natural, logo elas ficam mudando e acumulando mudança, caminhando aleatoriamente sobre o plano das possibilidades. Proposta pelo senhor Kimura, tem desdobramentos muito importantes, como a teoria da coalescência e os relógios moleculares.

Mas então, Random Walks são somente uma coleção de passos ao acaso, sejam esses passos as mudanças das bases em uma sequência de DNA, mudanças da abundância das espécies em uma floresta ou pecinhas andando em um joguinho de ludo.

Podemos simular isso fácil no R simplesmente sorteando valores para coordenadas. Por exemplo, pra desenhar um ponto precisamos de cordenadas no eixo x e y, para o eixo X, a cada geração ou passo a gente sorteia entres valores 1,0 ou -1, a gente pode ir para frente, para traz ou ficar parado, fazemos o mesmo para o eixo Y e temos uma caminhada em duas dimensões. Mas ao invés de eixos e esses valores poderíamos colocar pares de bases, abundância das espécies ou ainda a diferenciação entre sequências e ver o que acontece.

Vamos simular aqui 6 populações, 6 caminhadas diferentes e ver o que acontece, vamos começar todas do centro do gráfico e para todas e andar mil passos.

01

Após caminhados 1000 passos, cada caminhada acabou em um lugar. Eu coloquei cada população com uma cor, é legal como a vermelha e a preta acabaram perto, mas cada uma das outras acabaram em um extremo do gráfico.

Eu vi a ideia desse script pela primeira vez no livro do Michael Crawley e sempre achei legal poder pensar como com o passar do tempo é assim que podem estar acontecendo as mudanças no nosso DNA e nas espécies das florestas que vemos aqui e ali.

Nesse script também tem o exemplo do inicio do post, o gráfico animado e como ele foi feito.
Eu não sei exatamente o ponto que gostaria de chegar nesse post, mas é legal ver a animação do random walk.

#Random Walk
 
#criando uma lista para depositar o resultado
random.walks<-list()
 
#simulação, o j são quantas populações eu quero, aqui são 6
#dai eu ponho no item j da lista uma matrix para receber o resultado
#ai no segundo loop interno, eu simulo o random walk, aqui para mil passos
#lembrando que tem 1001 linhas na matrix, pois para todo mundo a linha 1 é 50,50
#o meio do grafico
for (j in 1:6) {
random.walks[[j]]<-matrix(NA,ncol=2,nrow=1001,dimnames=list(1:1001,c("x","y")))
random.walks[[j]][1,]<-c(50,50)
for (i in 1:1000) {
xi<-sample(c(1,0,-1),1)
yi<-sample(c(1,0,-1),1)
random.walks[[j]][i+1,"x"]<-random.walks[[j]][i,"x"]+xi
random.walks[[j]][i+1,"y"]<-random.walks[[j]][i,"y"]+yi
}
}
 
#depois faço um grafico basico
plot(0:100,0:100,type="n",xlab="",ylab="")
 
#coloco as 6 linhas
for(i in 1:6){
lines(random.walks[[i]],col=i)
}
#uma bolinha no ultimo ponto para identificarmos onde acabou a caminhada
#apos os mil passos
for(i in 1:6){
points(random.walks[[i]][1001,"x"],random.walks[[i]][1001,"y"],col=i,pch=19,cex=1.5)
}
 
#Fazendo 200 figura jpg, organizadas por numero
for(i in 1:200){
jpeg(sprintf("RW%03d.jpg",i), width = 300, height = 300)
plot(0:100,0:100,type="n",xlab="",ylab="",main=paste("Passo",i*5))
lines(random.walks[[1]][1:(i*5),])
dev.off()
}
 
#depois é so converter para um gif animado usando o comando
#convert do imagemagik aqui no linux
system("convert RW*.jpg -delay 5 rw.gif")
#e apagar as 200 imagens
system("rm RW*.jpg")
#por segurança, é bom fazer isso em um diretorio separado

Leave a Reply

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