load( url( "http://webs.um.es/jfcalvo/eco2.RData" ) )
Análisis de datos ecológicos (II)
Práctica 3, Ecología II
Grado en Biología
Introducción
En esta práctica realizaremos varios ejercicios, a través del uso de una matriz de datos reales, para aprender diversos procedimientos relacionados con el manejo de tablas de datos ecológicos en R. Realizaremos también cálculos y análisis descriptivos de los datos. Finalmente aplicaremos técnicas de análisis multivariante (ordenación y clasificación), y realizaremos un ejemplo de cálculo de diversidad funcional. Puedes encontrar más información sobre la aplicación de métodos multivariantes a datos ecológicos en el libro de Gotelli y Ellison (2018).
Preparación
Los datos necesarios para el desarrollo de la práctica se encuentran disponibles en el archivo eco2.RData
. Una vez iniciado R cargaremos este archivo desde el servidor de la asignatura:
Usando ls()
podemos ver los objetos cargados. Utiliza la función info
para obtener información sobre ellos; por ejemplo: info( "aves" )
o info( "rapaces" )
. Teclea info()
para más información.
Para realizar los ejercicios propuestos se necesita la instalación adicional del paquete de R vegan
. Si no lo tenemos instalado utilizaremos:
install.packages( "vegan" )
Una vez instalado lo cargaremos en memoria:
library( vegan )
Manejo de tablas de datos de comunidades
Trabajaremos con las tablas de datos del objeto aves
, que conocemos de la práctica 2. Recordemos que se trata de una lista que contiene una matriz o tabla de datos de conteos de individuos de 16 especies de aves (aves$sp
) en 140 transectos (itinerarios de censo de 1 km de longitud) en la Región de Murcia, otra con datos de variables ambientales de los transectos (aves$amb
), y otra con información adicional sobre la localización de los transectos (aves$loc
):
str(aves)
Para realizar determinados ejercicios resulta cómodo unir las tres matrices en una única tabla de datos, usando la función data.frame
:
data.frame( aves$sp, aves$amb, aves$loc ) -> aves2
head( aves2 )
Con la función dim
podemos conocer las dimensiones de la nueva tabla:
dim( aves2 )
A menudo es necesario seleccionar partes de la matriz, en función, por ejemplo, de alguna de las variables ambientales. Así, si quisiéramos trabajar solo con los transectos de las sierras litorales, usaríamos:
subset( aves2, aves2$litoral == 1 ) -> aveslitoral
aveslitoraldim( aveslitoral )
Si necesitáramos usar más de una condición para la selección, emplearíamos operadores lógicos. Por ejemplo:
subset( aves2, aves2$bosque == 100 & aves2$temperatura > 15 )
subset( aves2, aves2$precipitación > 450 | aves2$sierra == "Espuña" )
subset( aves2, aves2$Loxia.curvirostra != 0 & aves2$Parus.major == 0 )
Cálculos
Además de las funciones de sumas de filas (rowSums
) y columnas (colSums
), R dispone de otras funciones para realizar diversos tipos de cálculos sobre los datos de las tablas. La función apply
permite aplicar varias funciones sobre filas y columnas. Con esta función hay que indicar con un 1
si queremos trabajar con las filas, o con un 2
si queremos trabajar con las columnas. Por ejemplo:
apply( aves$sp, 1, sum )
apply( aves$sp > 0, 1, sum ) -> aves2$riqueza
head( aves2 )
apply( aves$sp, 2, mean )
apply( aves$sp, 2, var )
apply( aves$sp, 2, table )
Una función muy útil es aggregate
, que permite realizar cálculos sobre las variables en función de uno o varios criterios de agrupación. Por ejemplo, la suma total de individuos de las 16 especies de aves contadas en los itinerarios de cada sierra se puede calcular con:
aggregate( aves$sp, list( aves$loc$sierra ), sum )
Para conocer el número máximo de individuos contados en itinerarios de sierras litorales y no litorales, en altitudes por encima y por debajo de los 300 m s. n. m., usaríamos:
aggregate( aves$sp, list( aves2$litoral, aves2$altitud > 300 ), max )
Ordenación
Las técnicas de ordenación, junto con las técnicas de clasificación (siguiente sección), constituyen un amplio grupo de métodos de análisis denominados multivariantes. A diferencia de los métodos utilizados en la práctica anterior, en lugar de una única variable de respuesta, las técnicas multivariantes analizan conjuntamente múltiples variables (habitualmente múltiples especies), por lo que resultan apropiadas para el estudio de los patrones de respuesta de las comunidades a variables ambientales.
Utilizaremos varias funciones del paquete vegan
y trabajaremos con las matrices del objeto aves
. Realizaremos inicialmente un análisis de correspondencias, apropiado para datos procedentes de conteos, con la función cca
:
cca( aves$sp ) -> ord1
summary( ord1 )
plot( ord1, type = "text" )
Como estamos analizando muchas unidades de muestreo, la representación gráfica no permite apreciar adecuadamente la disposición de las especies en el plano definido por los ejes 1 y 2. Para seleccionar solo las especies usaremos:
plot( ord1, display = "species" )
Las coordenadas de las filas (unidades de muestreo) y columnas (especies) se obtiene con:
$CA ord1
La versión del análisis de correspondencias que permite analizar conjuntamente la matriz de especies y la matriz de variables ambientales se denomina correspondencias canónicas. Se realiza también con la función cca
. Representaremos los resultados en una nueva ventana para poder comparar ambos análisis, teniendo en cuenta que la dirección de los ejes (positivo/negativo) es irrelevante:
cca( aves$sp, aves$amb ) -> ord2
summary( ord2 )
x11()
plot( ord2 )
En este caso aparecen flechas que indican las relaciones de las variables ambientales con los ejes representados (este tipo de gráfica se denomina biplot). Para aclarar la representación podemos utilizar:
plot( ord2, display = c( "species", "bp" ) )
Otro tipo de análisis multivariante muy utilizado en ecología es el escalamiento multidimensional no métrico (nonmetric multidimensional scaling, NMDS), que calcula previamente una matriz de distancias o disimilitudes entre las variables. Como ejemplo usaremos el objeto rapaces
, una lista en la que se proporciona información cualitativa sobre las características ecológicas (que consideraremos en la sección “Diversidad funcional” como rasgos funcionales) de especies de aves rapaces de la Región de Murcia (rapaces$rasgos
), e inventarios de presencia/ausencia de dichas especies en los Parques Regionales de la red de espacios protegidos (rapaces$parques
).
rapaces
El análisis se realiza con la función metaMDS
del paquete vegan
:
metaMDS( rapaces$rasgos ) -> ord3
plot( ord3, type = "text" )
Clasificación
Las técnicas de clasificación permiten establecer relaciones jerárquicas y grupos (clusters), generalmente entre las unidades de muestreo (filas de la matriz), pero también entre las variables (columnas). Las clasificaciones se aplican sobre matrices de distancias o disimilitudes calculadas previamente. Es muy habitual también realizar clasificaciones utilizando los resultados previos (las coordenadas en los ejes) de un análisis de ordenación. Por ejemplo, en el caso del análisis de correspondencias de la matriz de pájaros (ord1
) podemos utilizar las coordenadas de las especies (ord1$CA$v
)para realizar una clasificación con la función hclust
juntamente con dist
(ambas incluidas por defecto en R). Usaremos solo los cuatro primeros ejes, que explicaban más del 50 % de la varianza (inercia):
hclust( dist( ord1$CA$v[ , 1:4 ] ) ) -> clus1
plot( clus1, hang = -1 )
Existen diversos métodos, tanto de agrupación para realizar la clasificación (con hclust
), como para el cálculo de distancias (con dist
), y que pueden proporcionar resultados muy diferentes. Por ejemplo:
x11()
hclust( dist( ord1$CA$v[ , 1:4 ], method = "canberra"), method = "average" ) -> clus2
plot( clus2, hang = -1 )
Si queremos establecer grupos concretos, debemos “cortar” el árbol con la función cutree
. Podemos elegir una altura de corte (argumento h
) o un número de grupos determinado (argumento k
):
cutree( clus2, h = 2.5 )
cutree( clus2, k = 4 )
En el caso de datos binarios (1/0), como la matriz rapaces$rasgos
, el método más apropiado de cálculo de distancias es binary
(equivalente al índice de disimilitud de Jaccard):
hclust( dist( rapaces$rasgos, method = "binary" ) ) -> clus3
plot( clus3, hang = -1 )
Diversidad funcional
Realizaremos un ejemplo de cálculo de diversidad funcional aplicado sobre los inventarios de presencia de aves rapaces en los Parques Regionales de la Región de Murcia. Aprovechando la clasificación realizada en el apartado anterior, utilizando los rasgos funcionales de las especies, calcularemos para cada parque el índice FGR (functional group richness), definido como la longitud total de las ramas del dendrograma de rasgos que conecta las especies del inventario (Petchey y Gaston 2006). Se calcula con la función treedive
del paquete vegan
:
treedive( rapaces$parques, clus3 )
Es interesante comprobar cómo se obtienen los valores del índice a partir de las distancias del dendrograma, que pueden deducirse de la información contenida en objeto resultado de la clasificación.
$merge
clus3$height clus3
Por ejemplo, para simplificar los cálculos, podemos calcular la diversidad funcional de un nuevo inventario hipotético con solo dos especies: la 1 (águila calzada) y la 4 (aguilucho cenizo):
$parques[ 8, ] <- c( 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 )
rapacestreedive( rapaces$parques, clus3 )
Según indica la tercera fila de clus3$merge
, el águila calzada (especie 1) se une a la culebrera (especie 15) para formar el grupo 3. Por su parte, el aguilucho (especie 4) se une al cernícalo primilla (especie 13) para formar el grupo 4 (fila 4 de clus3$merge
), y a continuación se unen al alcotán (especie 5) para formar el grupo 6 (fila 6 de clus3$merge
). Los grupos 3 y 6 se unen para formar el grupo 14, al que le corresponde una distancia de 0.7142857 (décimo cuarto valor de clus3$height
), que hay que multiplicar por 2, para obtener el valor del índice del nuevo inventario (1.428571).
Evaluación
Realiza la prueba de evaluación disponible en la herramienta Exámenes del Aula Virtual.
Bibliografía
Gotelli NJ, Ellison AM (2018) A Primer of Ecological Statistics. 2ª ed. Sinauer, Sunderland, MA.
Petchey OL, Gaston KJ (2006) Functional diversity: back to basics and looking forward. Ecology Letters 9: 741-758.
Descripción de los datos y mapas
Utiliza la función info
. Por ejemplo: info( "aves" )
o info( "rapaces" )
.