===== Dinâmica de Metapopulações ===== ==== Modelo Chuva de Propágulos ==== Nesta aula, iremos simular a dinâmica de uma metapopulação onde as taxas de extinção e de colonização são constantes (modelo de chuva de propágulos). Neste caso há sempre uma fonte constante de imigrantes que podem colonizar qualquer mancha vazia.\\ Primeiro vamos conhecer um novo comando do R que cria uma matriz de dados tridimensional. O comando é **array**. Teste a seguinte linha para ver um array de 3 dimensões.\\ array(NA,dim=c(4,4,3)) Veja que o R criou 3 matrizes de 4 linhas por 4 colunas. Essa matriz assemelha-se a um bolo com 3 camadas, porém quando o objeto é chamado o R mostra as camadas separadamente. No exercício abaixo a primeira dessas 3 matrizes representará o tempo t = 1, e cada célula da matriz representará uma mancha no espaço, que poderá ou não estar ocupada.\\ * Crie uma função chamada **metapop** com os seguintes argumentos: * nl: número de linhas; * nc: número de colunas; * tmax: número máximo de vezes que você deseja simular a dinâmica de metapopulações; * psi0: proporção de manchas ocupadas no início da simulação; * cln: probabilidade de colonização de manchas vazias; * ext: probabilidade de extinção local em manchas ocupadas * O número de linhas nl e o número de colunas nc determinarão quantas manchas potencialmente ocupáveis haverá na metapopulação (nc*nl = número de manchas). Use os seguintes comandos para começar a sua função: ## crie esses objetos para ir testando as linhas da sua função enquanto cria tmax = 20; nc = 10; nl = 10; psi0 = 0.5; cln = 0.3; ext = 0.15 ## Para criar a função. metapop<-function(nl,nc,tmax,psi0,cln,ext){ ## Isso vai criar tmax matrizes com nl linhas e nc colunas. resulta<-array(0,dim=c(nl,nc,tmax)) ## como vamos usar muito o nl*nc (número de manchas), vamos criá-lo Agora, para cada mancha você deverá jogar uma moeda para decidir se a mancha está ou não ocupada no tempo t =0. A probabilidade de estar ocupada deve ser **psi0** (a probabilidade de ocorrência inicial). Para isso use a função ''sample()''.\\ Usando ''sample(c(0,1),1)'' obtemos uma amostra de um valor que pode ser 0 ou 1, com igual probabilidade. Mas nós precisamos amostrar **nl*nc** valores de 0 ou 1, pois temos esse número de manchas.\\ Então vamos usar: sample(c(0,1),nl*nc,replace=T ) onde ''replace=T'' significa amostragem com reposição.\\ Porém, ainda falta informarmos a probabilidade de ocorrência. Se amostrarmos com igual probabilidade de obter 0 (mancha desocupada) ou 1 (mancha ocupada) a probabilidade de ocorrência será sempre 0.5, mas não é isso que pretendemos. Queremos ter a opção de alterar a probabilidade de ocorrência. Para isso usamos o argumento "prob=c(1-psi0,psi0)" que especifica a probabilidade de obter os valores indicados dentro da função ''sample''. Ou seja, ''1-psi0'' será a probabilidade de um 0 ser amostrado e ''psi0'' será a probabilidade de um 1 ser amostrado.\\ Então vamos simular a ocupação no tempo t=0 de acordo com psi0:\\ resulta[ , ,1]<-sample(c(0,1),nl*nc,replace=T,prob=c(1-psi0,psi0)) A probabilidade de ocorrência **psi0** irá variar nos próximos passos, então crie um objeto chamado de resultados "res.psi" e salve o **psi0** na posição 1 (**psi0** é o valor inicial de fs). No Gotelli **f** é a fração de manchas ocupadas (número de manchas ocupadas / número de manchas).\\ Use um ''for()'' para simular o que acontece com a metapopulação em cada tempo subseqüente, até que **tmax** seja atingido. Repare que já preencheu o array de resultado na primeira posição relativa ao tempo inicial \\ Agora precisamos criar uma condição para saber se uma mancha que estava ocupada continuará ocupada e se uma mancha que estava desocupada continuará desocupada, ou se será ocupada. Veja o que apareçe no objeto resulta[,,1]: apenas valores 0 e 1, significando ausência ou ocupação de mancha no tempo t=1. No tempo t+1 ou no caso t=2 as possibilidades são: * Manchas desocupadas (valores 0) podem ser colonizados e passar a 1, ou continuar 0. * Manchas ocupadas (valores 1)podem ter extinção e passsar a 0, ou continuar 1 Para o primeiro caso a probabilidade de 0 passar a 1 é //cln// e a probabilidade de 1 passar a 0 é //ext//. Uma forma de fazer isso é: num1=sum(resulta[,,t-1]) num0=(nl*nc)-num1 resulta[,,2][resulta[,,1]==1]<-sample(c(0,1),num1,replace=T,prob=c(ext,1-ext)) ... Esse comando pode ser lido da seguinte forma: nas posições do resulta t2 onde resulta t1 são iguais a 1, coloque 0 ou 1 com probabilidade ext e 1-ext respectivamente. Faça o mesmo para as posições em t1 iguais a 0, pensando na colonização. Pronto, agora e só mudar o valores de tempo pelo seu indexador para que em cada ciclo um novo tempo seja calculado. Para finalizar o ciclo só falta calcular o res.psi de cada tempo. res.psi[t]=sum(resulta[,,t])/(nl*nc) Sugerimos que use a solução anterior por ser mais intuitiva. Caso queira se aprofundar nos comandos do R, veja a solução abaixo para o mesmo problema: substituir os dados de ocupação de manchas de um tempo para outro, utilizando as probabilidades de extinção e colonização: É possível fazer o mesmo com uma única linha de comando utilizando a função ''ifelse()''. Ela funciona assim: ifelse(condição, "faça isso", "se não faça aquilo") Então tente algo assim:\\ resulta[,,t]<-ifelse(Passo 1, Passo 2, Passo3) Veja abaixo as instruções para os Passos 1, 2 e 3.''\\ **Instruções para os passos 1, 2 e 3 acima.**\\ Na função ''ifelse'' acima você deverá, no Passo 1, criar uma condição para saber se uma determinada mancha estava ou não ocupada no tempo t-1.\\ Caso a mancha estivesse desocupada você deverá, no Passo 2, dizer o que acontecerá com ela no tempo t. Para isso gere um número aleatório de uma distribuição uniforme e veja se esse valor é menor que a taxa de colonização, se o valor for menor a mancha deverá ser ocupada, se for maior ela permanece desocupada. Vamos ver como fazer isso:\\ **Atenção**, as duas linhas abaixo são para você testar no R e entender os comandos, estas linhas não devem estar no seu script final.\\ runif(1) ===== Representação gráfica ===== Agora faça um gráfico, **dentro da sua função**, que mostre a trajetória da proporção de manchas ocupadas ao longo do tempo. Acrescente uma reta mostrando o valor da fração de manchas ocupadas no equilíbrio **f.equilibrio**.\\ Equação 4.4 do Gotelli: f=Pi/(Pi+Pe) Primeiro calcule o f.equilibrio f.equilibrio<- ?? plot(1:tmax),fs ,type="l",xlab="tempo",ylab="fs",ylim=c(0,1),main="Metapopulação ") abline(h=f.equilibrio, col=2) ===== Animação de um conjunto de manchas no tempo ===== Agora vamos criar uma animação para olhar nossos resultados ao longo do tempo. Este mostra uma animação da dinâmica da metapopulação ao longo do tempo.\\ Primeiro salve o resultado de uma simulação da função metapop e crie um gráfico do tempo 1. image(dados[,,i], main=("Ocupação de manchas"),col=c("white","red")) grid(nl,nc) Agora é só criar o ciclo com //for// para que os gráficos de cada tempo sejam sobrepostos no mesmo dispositivo gráfico. Para isso vamos criar uma função //anima.meta//: - O único argumento é o dado que será igual ao resultado da função metapop. - crie um ciclo de 1 até tmax que é igual ao tamanho da dimensão três do seus dados - faça com que em cada ciclo seja feito um gráfico usando //image// dos dados do tempo t - crie um lapso de tempo para que os gráficos possam ser visualizados antes de trocar, colocando o comando abaixo: Sys.sleep(.5) * pronto! Use sua função e altere os parâmetros iniciais para ver se a metapopulação persiste, dependendo das condições iniciais. Se tiver tempo, procure alterar a sua função para implementar os outros modelos descritos na aula téorica. Uma forma de representar a dinâmica espacial da metapopulação é incluir no mapa não só os espaços ocupados e vagos mas entre esses aqueles que foram recentemente colonizados ou extintos. Ou seja, teremos quatro tipos de informações em cada momento: ocupado antigo, ocupado recente, vago, extinção recente. meta.anima2=function(dados) { nsim=dim(dados)[3] image(dados[,,1], main=("Ocupacao de manchas"),col=c("white","green"),sub="tempo=1") for(i in 2:nsim) { conta12=dados[,,(i-1)]+ (2*dados[,,i]) image(conta12, main=("Ocupacao de manchas"),col=c("white", "red","green", "darkgreen"),sub=paste("tempo= ",i)) Sys.sleep(.5) } } -------------------- ==== Modelo Colonização Interna ==== Podemos eliminar do modelo anterior o pressuposto de uma chuva de propágulos constante e fazer com que a colonização seja uma função do número de lugares ocupados. Em uma formulação simples desse modelo, a fonte de propágulos é unicamente interna (sistema fechado) e a probabilidade de colonização varia de forma linear à proporção de lugares ocupados. Nossa função começa então diferente com relação aos argumentos necessários: * sai o argumento //cln//; * entra o argumento //ef//: quanto a proporção de áreas ocupadas afeta a colonização. meta.inter<-function(nl,nc,tmax,psi0,ext, ef) { ... * calcule a probabilidade de colonização no inicio de cada ciclo: ... for(t in 2: tmax) { cln=ef*res.psi[t-1] ... ... } * modifique o valor da proporção de áreas ocupadas no equilíbrio para: ... f.equilibrio=1-(ext/ef) ... * com essas mudanças a novo modelo deve funcionar!