ATENÇÃO: ESTA PÁGINA É UMA VERSÃO ANTIGA DO ROTEIRO E ESTÁ DESATIVADA, PARA ACESSAR O ROTEIRO ATUAL [[en:ecovirt:roteiro:neutr:neutrar|ACESSE ESTE LINK]] ====== Teoria neutra da biodiversidade - Roteiro em R====== A Teoria Neutra é um modelo de processos estocásticos de nascimentos, mortes, especiações e migrações. As probabilidades de cada um destes eventos ocorrerem definem uma dinâmica surpreendente. A melhor maneira de entender isto é simular este processo, como faremos nos exercícios a seguir. ===== Preparação: entendendo caminhadas aleatórias ===== A Teoria Neutra usa uma classe de modelos de dinâmica estocástica, a caminhada aleatória de soma zero. Por isso precisamos entender algumas propriedades importantes dessas dinâmicas. Faça os tutoriais [[en:ecovirt:roteiro:math:roteiros#introducao_a_processos_estocasticos|de caminhadas aleatórias]]. Quando estiver certo(a) de que compreendeu esses dois modelos, volte para cá. ===== A Teoria Neutra: simulação passo a passo ===== {{:ecovirt:roteiro:neutr4.jpeg?100 }} Agora que entendemos os modelos de caminhada aleatória e soma zero vamos construir o modelo estocástico da Teoria Neutra, passo a passo, com funções em R. ====Preparação: ambiente R ==== Este exercício é feito no ambiente de programação e análise de dados R. Você não precisa conhecer a linguagem R para fazê-lo, porque damos os comandos já prontos para executar. Eles estão reproduzidos nesta página, e também em um arquivo, abaixo. A única coisa que você precisa saber é como enviar os comandos escritos neste arquivo para o R. Para isso você pode copiar os comandos desta página e colar na linha de comando do R. Mas é bem mais prático usar o arquivo de comandos, ou //script//. Para isso, siga os seguintes passos: - Instale em seu computador o ambiente R, instruções [[en:ecovirt:roteiro:soft:instalacaor|aqui]]. - Crie um diretório em seu computador para os exercícios. - Copie para este diretório o arquivo abaixo: - Códigos das funções: {{:ecovirt:roteiro:funcoes_neutr.r}} - Todos os comandos deste exercício: {{:ecovirt:roteiro:ex_neutra.r}} - Abra o R a partir do arquivo de comandos ''ex_neutra.r''. Certifique-se de que você está no diretório onde estão os arquivos. - Carregue no R as funções que vamos usar neste exercício digitando ''source("funcoes_neutr.r")'' na linha de comando. - Os comandos no arquivo "ex_neutra.r" estão na mesma ordem deste exercício. Siga o roteiro, enviando os comandos indicados a cada seção. - Se você não sabe como enviar os comandos do arquivo veja [[en:ecovirt:roteiro:soft:rprincip|aqui]]. ==== Dinâmica Local sem Migração ==== Vamos começar com um modelo para a comunidade em um dado local, usando um jogo de soma zero, similar ao jogo de apostas da seção anterior. As regras são: - A comunidade tem um total fixo de indivíduos, $J$ - A cada intervalo de tempo, um dos indivíduos é sorteado para morrer - Em seguida, os indivíduos remanescentes são sorteados, para definir quem produzirá o filhote que ocupará o lugar do morto. Para simular este processo, usamos a função em R ''sim.hub1''. Se você não carregou o arquivo {{:ecovirt:roteiro:funcoes_neutr.r}} com todas as funções como descrito na [[en:ecovirt:roteiro:neutr:neutrar#preparacaoambiente_r|seção anterior]], copie e cole o código abaixo na linha de comando rich <- function(x)length(unique(x)) ## funcao auxiliar sim.hub1=function(S= 100, j=10, D=1, ciclo=2e4, step=1000){ ## Tamanho da comunidade J <- S*j ##Matrizes para guardar os resultados ## matriz da especie de cada individuo por ciclo ind.mat=matrix(nrow=J,ncol=1+ciclo/step) ##CONDICOES INICIAIS## ##Deduzidas de acordo com o modelo de Hubbell: ## Todas as especies comecam com o mesmo numero de individuos (j=J/S) ind.mat[,1] <- rep(1:S,each=j) cod.sp <- ind.mat[,1] ##Aqui comecam as simulacoes for(i in 2:(1+ciclo/step)){ for(j in 1:step){ ##Indice dos individuos que morrem morte <- sample(1:J,D) ##Indice dos individuos que produzem filhotes para substituir os mortos novos <- sample(1:J,D,replace=T) ##Substituindo cod.sp[morte]<-cod.sp[novos] } ## A cada step ciclos os resultados sao gravados ind.mat[,i] <- cod.sp } tempo <- seq(0,ciclo,by=step) colnames(ind.mat) <- tempo invisible(ind.mat) plot(tempo,apply(ind.mat,2,rich), xlab="Tempo (ciclos)", ylab="N de espécies", type="l", main=paste("Dinâmica Neutra sem Colonização", "\n S=",S," J=",J) ,ylim=c(0,S)) } Os argumentos desta função são: * ''S'': número inicial de espécies * ''j'': número inicial de indivíduos por espécies. Começamos com o mesmo número de indivíduos por espécie, portanto o tamanho da comunidade será $J=Sj$ * ''D'' : número de mortes por ciclo, que manteremos sempre em uma. * ''ciclo'': número de intervalos a simular * ''step'': intervalo de registro dos dados, como nas funções anteriores. Simule uma comunidades com 100 espécies e 2 indivíduos por espécie: sim.hub1(S=100, j=2) O que acontece com o número de espécies com o passar do tempo? Verifique se isto muda aumentando o tamanho da comunidade, que é o produto $Sj$. Portanto basta manter o mesmo número de espécies e aumentar o número de indivíduos por espécie: par(mfrow=c(2,2))## para 4 gráficos na mesma janela sim.hub1(S=100, j=2) sim.hub1(S=100, j=4) sim.hub1(S=100, j=8) sim.hub1(S=100, j=12) par(mfrow=c(1,1)) ## Volta a um grafico por janela ==== Incluindo Migrações ==== {{:ecovirt:roteiro:neutr5.jpg?200 |}} Sabemos que as comunidades não são sistemas fechados. Então a chegada de migrantes pode compensar a perda de espécies que vimos na simulação anterior. Vamos supor, então, que há um reservatório externo de migrantes, que chamamos **metacomunidade**. Uma maneira bem simples de se fazer isto é supor uma metacomunidade infinita, com todas as espécies do início da simulação, nas proporções iniciais. Precisamos definir também a taxa de migração: ela será a probabilidade de um indivíduo morto na comunidade ser substituído por um propágulo vindo de fora, da metacomunidade. Abaixo está a função de R que inclui esta modificação. Ela tem mais um argumento, ''m'', que é taxa de migração. sim.hub2=function(S= 100, j=10, D=1, ciclo=2e4, step=1000, m=0.05){ ## Tamanho da comunidade J <- S*j ##Matrizes para guardar os resultados ## matriz da especie de cada individuo por ciclo ind.mat=matrix(nrow=J,ncol=1+ciclo/step) ##CONDICOES INICIAIS## ## Todas as especies comecam com o mesmo numero de individuos (j=J/S) ## Rotulo de especies para cada um dos inividuos ind.mat[,1] <- rep(1:S,each=j) ## Repetindo este rotulo no vetor que sofrera modificacoes cod.sp <- ind.mat[,1] ##Aqui comecam as simulacoes for(i in 2:(1+ciclo/step)){ for(j in 1:step){ ##Indice dos individuos que morrem morte <- sample(1:J,D) ## Indice dos individuos mortos que serao repostos por migrantes defora <- sample(c(TRUE,FALSE),size=D,replace=T,prob=c(m,1-m)) ##Indice dos individuos que produzem filhotes para substituir os mortos novosd <- sample(1:J,D-sum(defora),replace=T) novosf <- sample(1:J,sum(defora),replace=T) ##Substituindo ## Mortos por propagulos de dentro if(length(novosd)>0){ cod.sp[morte[!defora]]<-cod.sp[novosd] } ## Mortos por propagulos de fora if(length(novosf)>0){ cod.sp[morte[defora]]<-ind.mat[,1][novosf] } } ## A cada step ciclos os resultados sao gravados ind.mat[,i] <- cod.sp } tempo <- seq(0,ciclo,by=step) colnames(ind.mat) <- tempo invisible(ind.mat) plot(tempo,apply(ind.mat,2,rich), xlab="Tempo (ciclos)", ylab="N de espécies", type="l", main=paste("Dinâmica Neutra com Colonização da Comunidade Original", "\n S=",S," J=",J," m=",m),ylim=c(0,S)) } Compare a dinâmica de número de espécies ao longo do tempo em comunidades sem migração, e com valores crescentes de taxa de migração com os comando abaixo. Em todos começamos com uma comunidade com 100 espécies, com dois indivíduos por espécies. par(mfrow=c(2,2)) ## abre espaço para 4 graficos na mesma janela sim.hub2(S=100, j=2,m=0) sim.hub2(S=100, j=2,m=0.1) sim.hub2(S=100, j=2,m=0.2) sim.hub2(S=100, j=2,m=0.4) par(mfrow=c(1,1)) O que acontece se aumentamos o tamanho da comunidade? Experimente começar com 10 indivíduos por espécie. ==== Uma Metacomunidade mais Realista ==== {{ :ecovirt:roteiro:neutr6.jpg?350|http://www.theory.physics.manchester.ac.uk/~ajm/aem06.pdf}} Um reservatório infinito de espécies não parece ser uma premissa muito realista. Que tal substituí-lo por um conjunto de populações com a mesma dinâmica que usamos para a comunidade? Teríamos, então, dois sistemas acoplados, cada um com sua dinâmica estocástica de nascimentos e mortes. Mas se a metacomunidade também segue a dinâmica estocástica de soma zero, também perderá espécies com o tempo. Como resolver? Começamos por admitir que a metacomunidade é muito maior que a comunidade, pois representa o //pool// regional de colonizadores. Ou seja, é um sistema bem maior, pois tem mais espécies e indivíduos. Vamos supor, muito modestamente, que nela há o dobro de espécies da comunidade, cada uma com dez vezes mais indivíduos. Apenas para lembrar o efeito do tamanho da comunidade sobre a erosão de espécies, use novamente a função de simulação sem migração para comparar sistemas que diferem nesta ordem de grandeza: par(mfrow=c(2,1)) sim.hub1(S=100, j=2, ciclo=2e4,step=500) sim.hub1(S=200, j=20, ciclo=2e4,step=500) par(mfrow=c(1,1)) Já vemos que para tamanhos razoáveis (ou mesmo pequenos) de metacomunidades a erosão de espécies é bem lenta. Portanto, uma entrada de espécies também a uma taxa muito lenta já seria suficiente para compensar as extinções. Se for tão lenta quanto o tempo necessário para a evolução de uma nova espécie no sistema já temos a solução: na metacomunidade, as espécies perdidas são repostas por novas que surgem, no tempo evolutivo! Assim, definimos uma taxa de especiação, $\nu$((letra grega "nu", correpondente ao nosso "n")), que expressa a probabilidade de um indivíduo morto na metacomunidade ser reposto por um indivíduo de uma nova espécie. Esta taxa é extremamente baixa, mas pode ser suficiente para manter, ou mesmo elevar, o número de espécies na metacomunidade. Aqui vai a função para simular estes dois sistemas acoplados, que é o cenário imaginado por Hubbell: sim.hub3=function(Sm=200, jm=20, S=100, j=2, m=0.01, nu=0.0001, D=1, ciclo=1e4, step=100){ ## Tamanho da metacomunidade Jm <- Sm*jm ## Tamanho da comunidade J <- S*j ##Matrizes para guardar os resultados ## matriz da especie de cada individuo por ciclo ## Na metacomunidade meta.mat=matrix(nrow=Jm,ncol=1+ciclo/step) ## Na comunidade ind.mat=matrix(nrow=J,ncol=1+ciclo/step) ##CONDICOES INICIAIS## ## Todas as especies comecam com o mesmo numero de individuos (j=J/S) ## METACOMUNIDADE meta.mat[,1] <- rep(1:Sm,each=jm) ## Repetindo este rotulo no vetor que sofrera modificacoes meta.sp <- meta.mat[,1] ##COMUNIDADE ## Rotulo de especies para cada um dos individuos ind.mat[,1] <- rep(1:S,each=j) ## Repetindo este rotulo no vetor que sofrera modificacoes cod.sp <- ind.mat[,1] ##Aqui comecam as simulacoes for(i in 2:(1+ciclo/step)){ for(j in 1:step){ ##Indice dos individuos que morrem ## Na comunidade morte <- sample(1:J,D) ## Na metacomunidade meta.morte <- sample(1:Jm,D) ## Indice dos individuos mortos da comunidade que serao repostos por migrantes defora <- sample(c(TRUE,FALSE),size=D,replace=T,prob=c(m,1-m)) ## Indice dos individuos mortos da metacomunidade que serao repostos por novas especies meta.defora <- sample(c(TRUE,FALSE),size=D,replace=T,prob=c(nu,1-nu)) ##Indice dos individuos que produzem filhotes para substituir os mortos da comunidade novosd <- sample(1:J,D-sum(defora),replace=T) novosf <- sample(1:Jm,sum(defora),replace=T) ##Indice dos individuos que produzem filhotes para substituir os mortos da metacomunidade meta.novosd <- sample(1:Jm,D-sum(meta.defora),replace=T) meta.novosf <- sample(1:Jm,sum(meta.defora),replace=T) ##Substituindo ## N metacomunidade ## ## Mortos por propagulos de dentro if(length(meta.novosd)>0){ meta.sp[meta.morte[!meta.defora]]<-meta.sp[meta.novosd] } ## Mortos por novas especies if(length(meta.novosf)>0){ meta.sp[meta.morte[meta.defora]]<-max(meta.sp)+1 } ## Na comunidade ## ## Mortos por propagulos de dentro if(length(novosd)>0){ cod.sp[morte[!defora]]<-cod.sp[novosd] } ## Mortos por propagulos de fora if(length(novosf)>0){ cod.sp[morte[defora]]<-meta.sp[novosf] } } ## A cada step ciclos os resultados sao gravados ind.mat[,i] <- cod.sp meta.mat[,i] <- meta.sp } tempo <- seq(0,ciclo,by=step) colnames(ind.mat) <- tempo colnames(meta.mat) <- tempo resultados <- list(metacomunidade=meta.mat,comunidade=ind.mat) invisible(resultados) ## Graficos plot(tempo,apply(meta.mat,2,rich), xlab="Tempo (ciclos)", ylab="N de espécies", type="l", main=paste("Dinâmica Neutra com Colonizacao da Metacomunidade", "\n Jm=",Jm," nu=",nu," Theta=",2*Jm*nu, "S=",S," J=",J," m=",m), ylim=c(0,max(apply(meta.mat,2,rich)))) lines(tempo,apply(ind.mat,2,rich),col="red") } Agora temos argumentos também para os parâmetros da metacomunidade: * ''Sm'': número de espécies * ''jm'': número de indivíduos por espécie * ''nu'': taxa de especiação Usando os tamanhos de comunidades e metacomunidades que já definimos, avalie o efeito de aumentar a taxa de migração, mantendo os outros parâmetros constantes: par(mfrow=c(2,2)) sim.hub3(S=100, j=2,Sm=200,jm=20,nu=1e-9, m=0) sim.hub3(S=100, j=2,Sm=200,jm=20,nu=1e-9, m=0.1) sim.hub3(S=100, j=2,Sm=200,jm=20,nu=1e-9, m=0.2) sim.hub3(S=100, j=2,Sm=200,jm=20,nu=1e-9, m=0.4) Experimente também variar os tamanhos da comunidade e da metacomunidade, as taxas de migração e de especiação. Outra boa idéia é aumentar o tempo das simulações, para avaliar a dinâmica a longo prazo. Para isto, aumente o valor do argumento ''ciclo'', ou a simulação pode ficar muito lenta. ====Perguntas==== * Em escala de tempo ecológico a metacomunidade desta simulação tem efeito muito diferente da metacomunidade fixa e infinita da simulação anterior? * Qual o efeito de uma maior taxa de especiação na metacomunidade sobre a dinâmica da metacomunidade? * O que acontece se a metacomunidade é muito pequena? ===== Para saber mais ===== ==== Introduções ==== * Cassemiro, F.A.S. & Padial, A.A. 2008. Teoria Neutra da Biodiversidade: aspectos teóricos, impacto na literatura e perspectivas. [[http://www.oecologiaaustralis.org/ojs/index.php/oa/article/view/139/64|Oecologia Brasiliensis, 12 (4): 706-719]]. * Alonso, D., R. S. Etienne, and A. J. Mckane 2006. The merits of neutral theory. Trends in Ecology & Evolution 21: 451-457. * Um pacote em R para simulação e ajuste dos modelos de distribuição de espécies previstos pela teoria. **A introdução é uma excelente explicação da teoria**: * Hankin, R. 2007. Introducing untb, an R Package For Simulating Ecological Drift Under the Unified Neutral Theory of Biodiversity. Journal of Statistical Software 22: 12 [[http://www.jstatsoft.org/v22/i12/]]. ==== Mais avançadas ==== * O livro (referência básica, mas nem sempre didática quanto ao modelo): * Hubbell, S.P. (2001). The Unified Neutral Theory of Biodiversity and Biogeography. Princeton University Press. * Rosindell, J., Hubbell, S. P. & Etienne, R. S. 2011. The Unified Neutral Theory of Biodiversity and Biogeography at Age Ten. Trends in Ecology & Evolution 26:340-348. Ótima revisão sobre o tema e seu impacto. * Renshaw, E. 1991. Modelling biological populations in space and time Cambridge University Press. Excelente apresentação de dinâmicas estocásticas. * Uma boa revisão da evidência empírica até a época, com comparações com outros modelos neutros: Brian J. McGill, Brian A. Maurer, Michael D. Weiser (2006) EMPIRICAL EVALUATION OF NEUTRAL THEORY. Ecology: Vol. 87, No. 6, pp. 1411-1423. {{tag>R comunidades teoria_neutra}}