-
Notifications
You must be signed in to change notification settings - Fork 0
/
communities.Rmd
173 lines (114 loc) · 10.9 KB
/
communities.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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
---
title: "Introducción al análisis de comunidades ecológicas en R"
author:
date: "Enero de 2019"
output: github_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(
echo = TRUE,
message = FALSE,
warning = FALSE
)
```
### Configuración previa y datos
Los procedimientos incluidos a continuación asumen la instalación previa de R y RStudio^1^, para trabajar en este último. Instrucciones al respecto se encuentran en el apartado *Configuración* del módulo **Ecología en código abierto** del Campus Virtual de UniOvi, o [aquí en Internet](https://github.com/quevedomario/eco3r/blob/master/config.md).
Antes de entrar a analizar datos, es siempre recomendable echarles un vistazo, especialmente si trabajamos con datos recogidos por otros. Para entender la estuctura de estos datos lo más fácil es abrir **comunidades.xls**, incluido en el archivo comprimido (Ctrl. + clic) [**comunidades.zip**](https://github.com/quevedomario/eco3r/blob/master/comunidades.zip). Incluye varias hojas de cálculo:
- **esva** contiene datos de abundancia de familias de invertebrados fluviales durante varios muestreos semanales en primavera de 2016, en el río Esva (occidente de Asturias). Formaron parte del TFG de Sara Fernández Rodríguez. Las columnas son los taxones encontrados en las muestras, así como variables adicionales como pH o turbidez del agua.
- **semanas** recopila los datos de **esva** por semana y localidad de muestreo.
- **sierra** contiene parte de los datos utilizados en la Práctica de Aula *Diversidad*; concretamente las abundancias de aves a 5 altitudes en la Sierra Nevada española.
- **esva_vegan**, **semanas_vegan** y **sierra_vegan** son versiones simplificadas de las anteriores, conservando solo las abundancias de invertebrados por requisitos de formato de algunas funciones en R.
#### Carga de datos
Desde RStudio es fácil importar datos en distintos formatos a través de `File :: Import dataset`. En este caso no es necesario porque están ya empaquetados y listos para usarlos en **R**. Cambiamos la carpeta de trabajo a aquella que contenga los archivos de datos (no es imprescindible, pero por el momento facilita el trabajo). En RStudio, `Session :: Set Working Directory :: Choose Directory...`
A continuación, cargamos los datos con la línea de código siguiente (o bien a través de los menús de RStudio):
```{r}
load("communities_DATA.RData")
```
El archivo con extensión RData contiene las hojas de datos mencionadas arriba (`data.frame` es el término en la jerga de R).
Para ver los datos en **RStudio** una vez cargado el archivo **RData** anterior
podemos usar la pestaña **Environment**. El icono con forma de tabla permite mostrar los datos. A medida que obtengamos resultados, estos pasarán a estar disponibles también en ese **Environment** para ser reutilizados, hasta que cerremos la sesión.
********
### Estructura de comunidades
El título de este tutorial es un ejemplo de la laxitud del término *comunidad*. Rara vez podemos obtener datos de comunidades completas; los datos se referirán más frecuentemente a *taxocenosis*, o a porciones más o menos arbitrarias de una comunidad ecológica local. En este caso tenemos dos conjuntos de datos: invertebrados fluviales en Asturias, y aves en la Sierra Nevada española.
Las funciones más específicas en R están incluidas en librerías adicionales, *packages* en jerga R. Una de esas librerías, diseñada específicamente para calcular métricas de comunidades, es **vegan**^2^.
Para instalarla podemos usar los menús de RStudio (`Tools :: Install Packages`, escribiendo *vegan* en el cuadro de diálogo). Lo mismo se consigue con el código `install.packages("vegan", dependencies = TRUE)`. Este se leería en "humano" *instala vegan y otras librerías de las que dependa para funcionar*.
Una vez instalada, habilitamos la librería con:
```{r message=FALSE}
library(vegan)
```
#### Índices de diversidad
Algunas funciones típicas de ecología de comunidades son los *índices de diversidad*. La línea de código siguiente usa la función `diversity` incluida en la libreria de funciones `vegan` para calcular los índices de diversidad de Shannon de cada muestra (fila) de la hoja de datos **esva_vegan**. Además de calcularlos, los almacena en memoria en un objeto llamado **H**:
```{r}
(H <- diversity (esva_vegan, index="shannon"))
```
Usamos en este caso **esva_vegan** porque las funciones de análisis de comunidades requieren hojas de datos exclusivamente numéricas, conteniendo solamente las abundancias por taxón.
A continuación, calculamos y almacenamos los índices de diversidad de Simpson en un objeto llamado **D**.
```{r}
D <- diversity (esva_vegan, index="invsimpson")
```
Observaréis que en este caso no vemos los valores de la D de Simpson. Rodear una orden entre paréntesis, como en el caso anterior, implica mostrar directamente en la consola el resultado, además de guardarlo en memoria. Si queremos ver los valores de diversidad de Simpson, escribimos simplemente `D` en la consola (o los vemos en la pestaña **Environment**).
Almacenamos también la riqueza de especies - familias en este caso - en un objeto llamado **S**, aprovechando la función `specnumber`, que devuelve el número de taxones para cada muestra (fila) de la hoja de datos:
```{r}
(S <- specnumber(esva_vegan))
```
Usando ahora R como una calculadora, obtenemos la equitatividad en *versión Simpson* (se leería *guarda en J el resultado de dividir D por S*):
```{r}
J <- D/S
```
¿Cómo varía la equitatividad de la comunidad durante el muestreo? Para obtener una primera impresión del contenido de los datos podemos dibujar esa equitatividad que acabamos de calcular frente al ordinal de la semana de muestreo.
El código a continuación se leería: *Pinta J frente a la semanda de muestreo, contenida en la columna "semana" de la hoja __esva__*. El argumento `main=""` del código añade un título al gráfico, y es opcional.
```{r}
plot (J ~ esva$semana, main="Macroinvertebrados; equitatividad; semanas 13 a 22 de 2016")
```
#### Acumulación de taxones en función del esfuerzo de muestreo
Una función para calcular la función de *rarefacción* es `specaccum`. El código a continuación calcula la curva a partir de permutar las muestras 100 veces, y la almacena en `tax_acum` (podemos usar cualquier nombre para los objetos creados). A continuación la pinta con `plot`, definiendo las etiquetas de los ejes X e Y con `xlab` `ylab`:
```{r}
tax_acum <- (specaccum (esva_vegan, method="random", permutations = 100))
plot (tax_acum, xlab = "muestras", ylab = "familias")
```
El gráfico muestra el valor central de la curva de acumulación de especies; las barras indican la variación alrededor de ese valor central. Dicho de otra forma, **para cada número de muestras tendremos un promedio de especies esperables**, y unos intervalos de confianza resultantes de las 100 permutaciones de los datos.
Observamos en la *comunidad* estudiada la esperable curva asintótica de acumulación de taxones en función del esfuerzo de muestreo o análisis. En este caso es bastante gradual, si bien muestra un cambio de pendiente a partir de 6 - 8 muestras. El **esfuerzo de muestreo debería ser superior a ese número de muestras para representar adecuadamente la diversidad** de la comunidad.
Una interpretación más naturalista: **10 muestras obtenidas con pescas de red Surber en un río cantábrico encontraron entre 20 y 30 familias distintas de invertebrados de agua dulce**.
Es posible también *pintar* todas las permutaciones en lugar de la media e intervalos de confianza. Se consigue añadiendo `random = TRUE` a la orden `plot`:
```{r}
plot (tax_acum, xlab = "muestras", ylab = "familias", random = TRUE)
```
#### Acumulación de taxones por individuos
La función `rarecurve` calcula y pinta la acumulación de taxones en función del número de individuos.
```{r}
rarecurve(semanas_vegan, sample = 50,
col = c("black", "forestgreen", "blue", "red", "violet", "orange", "navy"),
lwd = 1.5, xlab="individuos identificados", ylab="taxones encontrados")
```
La línea vertical marca el tamaño de muestra de referencia, especificado en el código con la opción `sample=`. las líneas horizontales muestran la riqueza de especies en cada semana correspondiente a dicho tamaño de muestra de referencia.
Las posibilidades de análisis son exhaustivas. Podemos por ejemplo extraer con facilidad la pendiente de las curvas para un determinado número de individuos identificados; 20 y 50 en este caso:
```{r}
rareslope(semanas_vegan, sample=c(20,50))
```
Un vistazo a **semanas** ayuda a recordar a qué datos corresponden esos resultados, presentados por filas.
#### Curvas diversidad-dominancia
Los *rangos de abundancias* o curvas deversidad-dominancia se utilizan en la comparación de comunidades basada en la equitatividad. Comunidades en las que los individuos están más distribuidos entre distintas especies presentarán pendientes menores que las dominadas por muchos individuos de unas pocas especies.
Para que esa comparación no sea meramente cualitativa, *a ojo*, podemos ajustar modelos numéricos a los datos. La función `radfit` ajusta varios modelos de curvas diversidad-dominancia, incluyendo los vistos en clase *reserva de nicho* (*preemption*) y el de *fracción aleatoria o broken-stick* (*null*).
El código a continuación estima con `radfit` que modelo se ajusta mejor a cada una de las 5 altitudes de Sierra Nevada, y los pinta con `plot`.
```{r}
modelos_sierra <- radfit (sierra_vegan)
plot (modelos_sierra, xlab="rango de abundancias", ylab="log (abundancia)")
```
Una evaluación puramente visual de los datos podría llevarnos a interpretar que el panel 1 (1300 m) y el 5 (3100) corresponden a modelos distintos, ya que la comunidad de aves a 1300 metros es más rica en especies, y aparentemente más equitativa. No obstante, ambos conjuntos de datos se ajustan mejor al modelo de *reserva de nicho*, denominado *preemption* en R.
Es posible usar la misma función con una parte de los datos, por ejemplo una altitud (o fila). La salida a continuación indica el ajuste numérico de los modelos a los datos de abundancia de aves a 1300 m s.n.m., almacenados en la fila 1 de la hoja **sierra_vegan**. Interpretar esa salida no forma parte de los contenidos de la Ecología de 3º, pero esencialmente el mejor ajuste se produce cuando la desviación de los datos al modelo es mínima (*Deviance*):
```{r}
(modelo_1300 <- radfit (sierra_vegan [1,]))
```
`plot (modelo_1300)` pinta los 5 modelos superpuestos a los datos del 1300 m s.n.m. En este caso puede resultar más clara una representación en rejilla:
```{r}
radlattice (modelo_1300)
```
Y el equivalente para 2180 m, cuyos datos están en la fila 3 de los datos **sierra_vegan**:
```{r}
(modelo_2180 <- radfit (sierra_vegan [3,]))
radlattice (modelo_2180)
```
### Enlaces y referencias
(Mejor con botón drcho. + abrir en nueva pestaña)
1. https://www.r-project.org/ y https://www.rstudio.com/
2. https://www.rdocumentation.org/packages/vegan/versions/2.4-2