Simulação da estrutura espacial de uma população vegetal
Dois processos principais atuam determinando a estrutura espacial de populações vegetais: os processos ligados ao nicho (ou seja, em que a estrutura ambiental seria o principal fator para o estabelecimento de um indivíduo em um determinado local) e os processos neutros (em que o principal fator seria a limitação de dispersão). Segundo Janzen–Connell, a probabilidade de um propágulo alcançar e sobreviver um determinado local segue a distribuição de poisson.
Ao longo de muitos anos na literatura se debateu qual destes dois processos seria mais importante e atualmente se considera que ambos podem ocorrer simultaneamente.
Proponho na minha função simular a dinâmica de uma população vegetal segundo os modelos de nicho, neutro e ambos simultaneamente. Neste caso estamos interessados principalmente no padrão espacial final, mas seria possível também acessar as simulações intermediárias. Para isto, pensei em fazer a função de duas maneiras diferentes:
Primeira maneira
Utilizando espaço contínuo
Prós: seria mais fácil visualizar padrões de agregação em qualquer xmax e ymax
Contras: Não tenho certeza de como transformaria as informações da matriz ambiente para espaço contínuo. Essa ideia está menos estruturada na minha cabeça.
Entrada:
nichoneutro(N, modelo, nsim, xmax, ymax, plot = TRUE, i.neutro, i.nicho)
n= número de indivíduos (classe: integer, N > 0).nsim= Numero de iterações da simulação (classe: integer, N > 0).modelo= Modelo a ser escolhido (classe character:“nicho”,“neutro”,“nichoeneutro”).xmax= x máximo (classe: integer, N > 0).ymax= y máxima (classe: integer, N > 0).plot= lógico. Se verdadeiro retorna gráfico final da distribuição espacial.i.nicho= influência proporcional dos processos relacionados a nicho (classe numeric 0 < i.nicho < 1).i.neutro= influência proporcional dos processos neutros (classe numeric 0 < i.neutro < 1).
Verificação de parâmetros:
né um número inteiro e maior que 0? Se não, escreve: “N precisa ser um número inteiro e > 0.”nsimé um número inteiro e maior que 0? Se não, escreve: “Nsim precisa ser um número inteiro e > 0.”modeloé um character contendo“nicho”,“neutro”ou“nichoeneutro”? Se não, escreve “modelo precisa ser um caracter contendo“nicho”,“neutro”ou“nichoeneutro”.xmaxé um número inteiro e maior que 0? Se não, escreve: “xmax precisa ser um número inteiro e > 0.”ymaxé um número inteiro e maior que 0? Se não, escreve: “ymax precisa ser um número inteiro e > 0.”né menor que nrow*ncol? Se não, retorna “não há espaço para tantas arvores. Diminua N ou aumente nrow e/ou ncol.”ploté lógico? Se não, escreve “plot precisa ser lógico.”- 0 <
i.neutro< 1? Se não, escreve“i.neutrodeve ser entre 0 e 1.” - 0 <
i.nicho< 1? Se não, escreve “i.neutrodeve ser entre 0 e 1.” - Os argumentos
i.nichoei.neutroestão sendo utilizados quandomodelo=“nicho”ou“neutro”? Se sim, escreve “Os argumentos i.nicho e i.neutro não estão sendo utilizados”. i.nicho+i.neutro= 1? Se não, escreve “a soma de i.nicho e i.neutro deve ser 1.”
Pseudo-Código:
- Cria objeto
espaço, um dataframe comnlinhas e2colunas (x e y) contendo apenas 0. - Sorteia valores aleatórios entre 0 e xmax para x, e 0 e ymax para y e coloca em
espaço - Cria dataframe
simulaçãocomnsimlinhas e quatro colunas:x_mort,y_mort,x_col,y_col, contendoNAs.
Se modelo = “nicho”
- Cria o objeto
ambiente, uma matriz comymaxlinhas exmaxcolunas. Geração de gradiente ambiental adaptando da função cria_gradiente.r. A matriz terá valores entre 0 e 1 que estarão associadas a probabilidade de mortalidade naquela posição. - Ciclo for de 1 a
nsim- Sorteio de uma árvore para morrer de acordo com as probabilidades da matriz
ambiente1) - Guarda
x_mort[i]ey_mort[i]emsimulação - Sorteio aleatório para uma posição de uma nova árvore, sobrescreve a árvore que morreu
- Guarda
x_col[i]ey_col[i]emsimulação
Se modelo = “neutro”
- Ciclo for de 1 a
nsim.- Sorteio aleatório de uma árvore para morrer.
- Guarda
x_mort[i]ey_mort[i]emsimulação. - Sorteio de uma árvore para se reproduzir.
- Sorteio de uma distância em relação a árvore escolhida seguindo a probabilidade de Poisson.
- Sorteio de um radiano.
- Guarda posição da nova árvore em
espaço, sobrescrevendo a que morreu - Guarda
x_col[i]ey_col[i]emsimulação.
Se modelo = “nichoeneutro”
- Cria o objeto
ambiente, uma matriz comymaxlinhas exmaxcolunas. Geração de gradiente ambiental adaptando da função cria_gradiente.r. A matriz terá valores entre 0 e 1 que estarão associadas a probabilidade de mortalidade naquela posição. - Ciclo for de 1 a
nsim- Sorteio de uma árvore para morrer de acordo com as probabilidades da matriz
ambiente*i.nicho - Guarda
x_mort[i]ey_mort[i]emsimulação - Sorteio de uma distância em relação a árvore escolhida seguindo a probabilidade de Poisson, com média proporcional a
i.neutro. - Sorteio de um radiano.
- Guarda posição da nova árvore em
espaço, sobrescrevendo a que morreu - Guarda
x_col[i]ey_col[i]emsimulação.
Saída:
- Se
plot = TRUE, Gera gráfico em que cada cédula corresponde a uma posição da matrizespaçoao final de todas iterações. Coloca um ponto em cada cédula que apresenta 1. Se modelo =“nicho”ou“nichoeneutro”também coloca em escalas de cores a probabilidade de mortalidade associada aquela posição. - Retorna dataframe
simulação
Segunda maneira
Utilizando matrizes para indicar a localização dos pontos.
Prós: talvez seja mais simples fazer um gradiente ambiental associado a posição de cada ponto, uma vez que cada ponto deespaçoterá sua correspondência na matrizambiente
Contras: seria necessário ncol e nrow muito grandes para verificar alguma estrutura espacial
Entrada:
nichoneutro(N, modelo, nsim, ncol, nrow, plot = TRUE, i.neutro, i.nicho)
n= número de indivíduos (classe: integer, N > 0).nsim= Numero de iterações da simulação (classe: integer, N > 0).modelo= Modelo a ser escolhido (classe character:“nicho”,“neutro”,“nichoeneutro”).ncol= número de colunas de habitat da paisagem (classe: integer, N > 0).nrow= número de linhas de habitat da paisagem (classe: integer, N > 0).plot= lógico. Se verdadeiro retorna gráfico final da distribuição espacial.i.nicho= influência proporcional dos processos relacionados a nicho (classe numeric 0 < i.nicho < 1).i.neutro= influência proporcional dos processos neutros (classe numeric 0 < i.neutro < 1).
Verificação de parâmetros:
né um número inteiro e maior que 0? Se não, escreve: “N precisa ser um número inteiro e > 0.”nsimé um número inteiro e maior que 0? Se não, escreve: “Nsim precisa ser um número inteiro e > 0.”modeloé um character contendo“nicho”,“neutro”ou“nichoeneutro”? Se não, escreve “modelo precisa ser um caracter contendo“nicho”,“neutro”ou“nichoeneutro”.ncolé um número inteiro e maior que 0? Se não, escreve: “ncol precisa ser um número inteiro e > 0.”nrowé um número inteiro e maior que 0? Se não, escreve: “nrow precisa ser um número inteiro e > 0.”ploté lógico? Se não, escreve “plot precisa ser lógico.”- 0 <
i.neutro< 1? Se não, escreve“i.neutrodeve ser entre 0 e 1.” - 0 <
i.nicho< 1? Se não, escreve “i.neutrodeve ser entre 0 e 1.” - Os argumentos
i.nichoei.neutroestão sendo utilizados quandomodelo=“nicho”ou“neutro”? Se sim, escreve “Os argumentos i.nicho e i.neutro não estão sendo utilizados”. i.nicho+i.neutro= 1? Se não, escreve “a soma de i.nicho e i.neutro deve ser 1.”
Pseudo-Código:
- Cria objeto
espaço, uma matriz comnrowlinhas encolcolunas contendo apenas 0. - Sorteio aleatório de
nposições de espaço e atribuição de 1 para as posições sorteadas. - Cria dataframe
simulaçãocomnsimlinhas e quatro colunas:x_mort,y_mort,x_col,y_col, contendoNAs.
Se modelo = “nicho”
- Cria o objeto
ambiente, uma matriz comnrowlinhas encolcolunas. Geração de gradiente ambiental adaptando da função cria_gradiente.r. A matriz terá valores entre 0 e 1 que estarão associadas a probabilidade de mortalidade naquela posição. - Ciclo for de 1 a
nsim- Sorteio de uma árvore para morrer de acordo com as probabilidades da matriz
ambiente - Guarda
x_mort[i]ey_mort[i]emsimulação - Atribui 0 a posição de
espaçosorteada - Sorteio aleatório da posição de uma nova árvore
- Guarda
x_col[i]ey_col[i]emsimulação - Atribui 1 a posição de
espaçosorteada
Se modelo = “neutro”
- Ciclo for de 1 a
nsim- Sorteio aleatório de uma árvore para morrer
- Guarda
x_mort[i]ey_mort[i]emsimulação - Atribui 0 a posição de
espaçosorteada - Sorteio de uma árvore para se reproduzir
- Sorteio de uma distância em relação a árvore escolhida seguindo a probabilidade de Poisson.
- Sorteio de uma direção em relação a árvore original (N, S, L, O, NE, NO, SE, SO)
- Atribui 1 a posição de
espaçosorteada - Guarda
x_col[i]ey_col[i]emsimulação
Se modelo = “nichoeneutro”
- Cria o objeto
ambiente, uma matriz comnrowlinhas encolcolunas. Geração de gradiente ambiental adaptando da função cria_gradiente.r. A matriz terá valores entre 0 e 1 que estarão associadas a probabilidade de mortalidade naquela posição. - Ciclo for de 1 a
nsim- Sorteio de uma árvore para morrer de acordo com as probabilidades da matriz ambiente
- Guarda
x_mort[i]ey_mort[i]emsimulação - Atribui 0 a posição de
espaçosorteada - Sorteio de uma distância em relação a árvore escolhida seguindo a probabilidade de Poisson.
- Sorteio de uma direção em relação a árvore original (N, S, L, O, NE, NO, SE, SO)
- Atribui 1 a posição de
espaçosorteada - Guarda
x_col[i]ey_col[i]emsimulação
Saída:
- Se
plot = TRUE, gera gráfico em que cada cédula corresponde a uma posição da matrizespaçoao final de todas iterações. Coloca um ponto em cada cédula que apresenta 1. Se modelo =“nicho”ou“nichoeneutro”também coloca em escalas de cores a probabilidade de mortalidade associada aquela posição. - Retorna dataframe
simulação