-
Notifications
You must be signed in to change notification settings - Fork 0
/
succession.rmd
142 lines (107 loc) · 9.27 KB
/
succession.rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
---
title: "Sucesión ecológica con R"
author:
date:
output: github_document
editor_options:
chunk_output_type: console
---
![](succession_files/figure-markdown_github/sucesion_stand_dev0_100.png)
(Es recomendable usar **"crtl. click" al pulsar en los enlaces**, abriéndolos así en pestañas nuevas; la opción no es configurable en origen en GitHub el momento de escribir esto.)
### Un modelo analítico de sucesión
Estos modelos son simplificaciones de los procesos reales, pero permiten fijarse en los aspectos básicos de la dinámica de sustitución de especies, y compararla entre distintas comunidades, o vías de sucesión.
Planteamos un modelo matricial análogo al usado para modelar [dinámica de poblaciones estructuradas](https://github.com/quevedomario/eco3r/blob/master/stages.md) en clases de edad o estadios.
Dicho modelo matricial plantea de qué manera las comunidades cambian de estado a lo largo del pulsos discretos de tiempo, sin solapamiento.
El ejercicio requiere escasa preparación previa. Usamos las librerías **popbio** para procesar las probabilidades de sustitución y **diagram** para dibujar ciclos. No son imprescindibles, todo se podría hacer con R básico.
Cargando las librerías:
```{r message=FALSE, warning=FALSE}
library(popbio)
library(diagram)
```
Vamos a usar como ejemplo el cambio temporal en un ecosistema cuyos estadios reconocibles a lo largo de una sucesión ecológica son *espacio abierto*, *pradera*, *matorral*, y *bosque*^1^. Esencialmente un esquema de sucesión común a los ecosistemas forestales templados.
#### Matriz de transición
Un modelo como este en el que reconocemos 4 estados (*fases*, *estadios*, da igual) requiere una matriz cuadrada con cuatro filas y cuatro columnas, que contienen las probabilidades de transición **del estado actual (columnas) al siguiente (filas)**.
Para introducir los datos y construir la matriz definimos primero las etiquetas de los **estados**, almacenándolos en un vector de texto con `c()`.
```{r}
estados <- c("espacio abierto","pradera","matorral","bosque")
```
A continuación almacenamos las **probabilidades** de transición en otro vector, numérico en este caso (i.e. valores sin comillas).
```{r}
probabilidades <- c(
0.10, 0.10, 0.10, 0.01,
0.90, 0.10, 0.00, 0.00,
0.00, 0.80, 0.10, 0.00,
0.00, 0.00, 0.80, 0.99
)
```
Por último, combinamos estados y probabilidades en la **matriz** de proyección con la función `matrix2()`. Los paréntesis rodeando a esta le piden a R que nos la enseñe directamente:
```{r}
(matriz <- matrix2(probabilidades, estados))
```
La matriz muestra probabilidades de sustitución del tiempo *t* al tiempo *t+1*. Se lee así:
- La probabilidad de reemplazo de un parche de *espacio abierto* por *pradera* es 0.9, [2,1].
- La probabilidad de que una perturbación "reinicie" un parche de *bosque* a *espacio abierto* es de 0.01, [1,4].
- La diagonal de la matriz indica la probabilidad de que un parche permanezca en el mismo estado entre *t* y *t+1*.
- Los valores de cada columna deben sumar 1.0, ya que recojen el estado de los parches en un tiempo *t*.
El conjunto de probabilidades de transición definido en la **matriz** indica un **modelo de facilitación**^2^, aquel en el que distinguimos especies pioneras, intermedias y tardías. Las primeras (e.g. leguminosas como *Lupinus* spp., fijadoras de nitrógeno) inician la sucesión, modificando el contexto abiótico y facilitando la entrada posterior de especies intermedias.
![](succession_files/figure-gfm/lupinus.jpg)
#### Diagrama de sucesión
Podemos representar gráficamente las transiciones de la matriz con la intimidante pero útil función `plotmat()`, vista en ejercicios anteriores (e.g. https://github.com/quevedomario/eco3r/blob/master/stages.md).
`?plotmat` devuelve la explicación del significado de cada argumento de la función.
```{r, fig.align="center", fig.asp=0.75}
plotmat(matriz, relsize =0.65, self.cex = 0.5, self.shifty=0.10, self.shiftx = c(0.07,0.16,-0.23,0),
box.prop = c(0.35,0.25,0.25,0.25), box.type = "round", box.size = 0.14, lwd = 1.2,
arr.col ="green", arr.lcol = "black", arr.type = "triangle", txt.col = "blue")
```
#### Proyecciones
Necesitamos fijar el estado inicial de la simulación. En este ejemplo partiremos de un paisaje - la foto fija de un ecosistema - en el que tenemos 500 parches de hábitat, todos en el estado inicial de la sucesión, *espacio abierto*. Con esa información construimos el **vector de estado inicial**, **N~0~**; en este caso los 500 parches de hábitat evaluados están en fase *espacio abierto*:
```{r}
n0 <- c(500,0,0,0)
```
Para almacenar los resultados de cada intervalo de sustitución construimos una matriz con tantas filas como intervalos de tiempo pretendidos, y 4 columnas para los 4 estados. La primera línea del código a continuación deja definida una matriz llamada **proyecciones** para 12 intervalos, y de momento vacía.
La segunda define la variable de intervalos de tiempo, hasta 20.
A continuación usamos los nombres de los estados y 12 intervalos de tiempo para etiquetar las columnas de **proyecciones** con `colnames()` y las filas con `rownames()`.
```{r}
proyecciones <- matrix(nrow = 12, ncol = 4)
tiempo <- seq(from=0, to=20, by=1)
colnames(proyecciones) <- estados
rownames(proyecciones) <- (tiempo[2:13])
proyecciones
```
Las proyecciones de estos modelos de sustitución son multiplicaciones sucesivas de la matriz de probabilidades por el vector de abundancias en el tiempo *t*, o *vector de estado*. Para automatizar las proyecciones durante *i* intervalos de sustitución podemos usar un bucle.
Una de las formas de prepararlos en **R** es la función `for()`:
```{r}
for (i in 1:12) {
n0 <- matriz %*% n0
proyecciones[i,] <- n0
proyecciones[i,]
Sys.sleep(0.4)
}
proyecciones
```
Ese bucle `for` se lee "*para cada intervalo de tiempo de 1 a 12, almacena como n0 el resultado de multiplicar la matriz por el N~0~ previo, guarda el resultado en la fila i de proyecciones, y muestra esa última fila o vector de estado*"^3^.
En la consola **R** aparecerán los vectores de estado *N~1~* a *N~12~*.
Para pintar los resultados nos interesa tener en el mismo conjunto de datos el estado inicial de la sucesión, aquel *N~0~* con 500 parches de *espacio abierto* que ha sido modificado por las iteraciones del bucle anterior.
El código a continuación construye de nuevo un el vector *inicial*, lo combina en **todo** con los resultados de **proyecciones**, y elimina los nombres de las filas (para pintarlo más fácil):
```{r}
inicial <- c(500,0,0,0)
todo <- rbind(inicial, proyecciones)
rownames(todo) <- NULL
todo
```
A continuación pintamos el cambio de los parches entre los intervalos t=0 y t=12. En negro *espacio abierto*, en azul *pradera*, en rojo *matorral*, y en verde *bosque*.
La proyección de cada tipo de parche está almacenada en cada una de las columnas de **todo**. `plot()` pinta la primera curva, la de *espacio abierto*, almacenada en la columna 1 [,1], y a continuación añadimos el resto de curvas a ese primer gráfico con `lines()`^4^:
```{r, fig.align="center", fig.asp=0.7}
plot(tiempo[1:13], todo[,1], type="l", xlab="intervalos", ylab = "parches", ylim = c(0,500),
main="")
lines(tiempo[1:13], todo[,2], col="blue")
lines(tiempo[1:13], todo[,3], col="red")
lines(tiempo[1:13], todo[,4], col="green")
```
El gráfico ilustra una propiedad de estos modelos analíticos: al multiplicar sucesivamente los vectores de estado por la misma matriz de transición, se alcanza una *estructura estable*. Es decir, el vector de estado deja de cambiar por mucho que proyectemos la dinámica. Y esa estructura se alcanza independientemente de cual sea el estado inicial. En nuestro ejemplo esa dinámica empieza a ser aparente a partir de *N~6~*.
Adaptando el código anterior es fácil incluir cambios en las probabilidades de sustitución. Estas podrían derivarse por ejemplo de una mayor frecuencia de perturbaciones, que reduciría proporción de parches en estados tardíos.
#### Referencias y notas
1. Ejemplo adaptado de Gotelli NJ. 2008. A primer of ecology (AD Sinauer, Ed). Sunderland: Sinauer.
2. Hay modelos alternativos de reemplazo de especies, esencialmente basados en el tipo de control de la dinámica ejercido por las especies que colonizan un espacio reiniciado por la perturbación. Al menos habrá que tener en cuenta la posibilidad de que las colonizadoras no tengan especial influencia en qué se asienta después (**modelo de tolerancia**), o que impidan el asentamiento de nuevas especies hasta una nueva perturbación (**modelo de inhibición**).
3. En cada repetición **n0** es sustituido por el resultado de multiplicar el anterior por la matriz, si bien el contenido queda guardado en **proyecciones**. Los bucles `for(){}` son útiles para repetir cálculos y almacenar los resultados sucesivos. Entre paréntesis llevan siempre la variable que identifica la secuencia de repeticiones; entre corchetes, el conjunto de operaciones en orden de ejecución. En el ejemplo, `Sys.sleep()` introduce un retraso de medio segundo para ver los resultados sucesivos en la consola. Para acelerar el código podemos prescindir de la visualización de resultados intermedios, y del retraso.
4. `tiempo[1:13]` hace referencia a las posiciones primera a decimotercera en el vector tiempo, que corresponden a los intervalos *t~0~* a *t~12~*.