Este tutorial te guía a través de los pasos para realizar un análisis
filogenético espacial en R, utilizando el paquete de R
phylospatial
, el cual fue desarrollado recientemente. Este
tutorial se basa en gran medida en las viñetas de este paquete, escritas
por Matthew Kling. Puedes encontrar más detalles sobre
las funciones y el paquete visitando el repositorio
https://matthewkling.github.io/phylospatial/
. Una de las
novedades más importantes de este paquete es su capacidad para gestionar
diferentes tipos de datos de ocurrencia, desde datos de
presencia/ausencia, abundancias, hasta probabilidades de ocurrencia
derivadas de modelos de distribución de especies (SDM).
La diversidad filogenética (PD) mide el parentesco del conjunto de taxa presentes en una región. En términos prácticos, medir diversidad filogenética implica sumar las longitudes de las ramas que conectan un conjunto de taxones en una filogenia. Al igual que con otras medidas de diversidad, cuantificar la PD a lo largo del espacio geográfico nos permite comprender los patrones de diversidad. Por ejemplo, podemos abordar pregunatas como: ¿cuánto varía la PD entre los píxeles (subconjuntos de igual tamaño) de una región dada? ¿Existen píxeles con una PD significativamente mayor o menor? La respuesta a estas preguntas puede contribuir tanto a estudios sobre los procesos que generan dichos patrones como a aplicaciones directas en conservación.
Si bien el estudio de la PD se ha utilizado en múltiples contextos, en este tutorial nos centraremos en un enfoque específico denominado “filogenética espacial”. Este enfoque se centra en el estudio de los patrones de PD y otras medidas derivadas de PD en el espacio geográfico, tratándolo dicho espacio como un conjunto de píxeles.
En este tutorial, utilizaremos un conjunto de datos de los musgos de California que es un subconjunto de los datos utilizados en la publicación reciente titulada “Spatial Phylogenetics with Continuous Data: an Application to California Bryophytes” donde estudiamos los patrones de diversidad filogenética de las briofitas en California, y desarrollamos algunos enfoques novedosos para analizar este tipo de datos.
Primero instalemos los paquetes que necesitamos
# Let's make sure we have the libraries we need
# if you haven't installed them, uncomment the lines below
# install.packages('phylospatial')
library(phylospatial)
library(terra)
library(ape)
library(sf)
library(tmap)
Utilizaremos el conjunto de datos distribuido con la biblioteca
phylospatial
. Primero, leeremos una raster que contiene los
datos de la comunidad.
moss_comm <- rast(system.file("extdata", "moss_comm.tif", package = "phylospatial"))
# checa la estructura de los datos descomentando y corriendo la linea de abajo
# moss_comm
# plotealo!
plot(moss_comm)
Ahora leemos la filogenia y la visualizamos.
moss_tree <- read.tree(system.file("extdata", "moss_tree.nex", package = "phylospatial"))
# checa la estructura de los datos descomentando y corriendo la linea de abajo
# moss_tree
# plotealo!
plot(moss_tree, type = "fan", cex = 0.15)
Ahora, usemos la función phylospatial()
para crear un
objeto filoespacial. Esta función requiere dos argumentos: el conjunto
de datos de la comunidad y una filogenia de los terminales (usualmente
especies) de dicho conjunto de datos.
ps <- phylospatial(moss_comm, moss_tree)
plot(ps, "comm")
comm
, moss_tree
y
ps
?ps
? Usa
la consola para explorar qué información se almacena en este
objeto.phylospatial()
identificará el tipo de datos proporcionados, pero puedes especificarlo
explícitamente declarando el argumento data_type=
al
construir el objeto filoespacial.Ahora que tenemos nuestro objeto del tipo spatiaphylo, el cual
contiene información sobre la ocurrencia de taxones en cada píxel y una
filogenia con información sobre las relaciones filogenéticas de dichos
taxones, es natural que queramos saber cuál es la diversidad
filogenética (PD) de cada píxel. El paquete phylospatial
calcula todas las medidas de diversidad filogenética alfa con la función
ps_diversity()
. En el argumento metric=
podemos especificar qué medidas queremos calcular. Hoy, calcularemos la
diversidad de taxones (TD), la diversidad filogenética (PD) y el
endemismo filogenético (PE) como se describe a continuación (pero ten en
cuenta que existen muchas otras medidas que se pueden calcular; puedes
explorarlas consultando la documentación de la función
?ps_diversity()
):
# calculamos las medidad de diversidad filogenética alfa
div <- ps_diversity(ps, metric = c("TD","TE", "PD", "PE"))
Usamos la consola para explorar la estructura del objeto
div
. ¡Y vamos a plotearlo!
# plot diversity metrics
#PD
TD_plot <- tm_shape(div$TD) +
tm_raster(palette = "inferno", style = "cont") +
tm_layout(legend.outside = TRUE) + tm_title("Taxon diversity, TD")
TE_plot <- tm_shape(div$TE) +
tm_raster(palette = "inferno", style = "cont") +
tm_layout(legend.outside = TRUE) + tm_title("Taxon endemism, TE")
PD_plot <- tm_shape(div$PD) +
tm_raster(palette = "inferno", style = "cont") +
tm_layout(legend.outside = TRUE) + tm_title("Phylogenetic diversity, PD")
PE_plot <- tm_shape(div$PE) +
tm_raster(palette = "inferno", style = "cont") +
tm_layout(legend.outside = TRUE) + tm_title("Phylogenetic endemism, PE")
# plots
tmap_arrange(TD_plot, TE_plot, PD_plot, PE_plot, nrow = 2, ncol = 2)
En la figura anterior, observamos que la diversidad filogenética está altamente correlacionada con la diversidad de taxones. Cuantos más terminales haya en un píxel, mayor será la longitud de las ramas que añadimos al calcular la PD. Si nos interesa saber si un píxel tiene ramas relativamente más largas, pero utilizando una correción del número de taxones en ese píxel, podemos utilizar “medidas relativas”. Visualicemos cómo se ven la PD y la diversidad filogenética relativa en nuestro conjunto de datos.
# calculamos pd y rpd
pd_rpd <- ps_diversity(ps, metric = c("PD","RPD"))
# las visualizamos
pd_plot <- tm_shape(pd_rpd$PD) +
tm_raster(palette = "inferno", style = "cont") +
tm_layout(legend.outside = TRUE) + tm_title("Phylogenetic diversity, PD")
rpd_plot <- tm_shape(pd_rpd$RPD) +
tm_raster(palette = "inferno", style = "cont") +
tm_layout(legend.outside = TRUE) + tm_title("Relative phylogenetic diversity, RPD")
tmap_arrange(pd_plot, rpd_plot, ncol = 2)
Hasta ahora hemos explorado los patrones espaciales de las medidas de
diversidad. Nuestras observaciones nos permiten comparar la diversidad
entre píxeles. Sin embargo, probablemente queremos identificar regiones
con valores significativamente diferentes a los esperados; es decir,
queremos asignar un valor de significancia a nuestras observaciones.
Para ello, utilizaremos una aleatorización. Una prueba de aleatorización
implica comparar los datos observados con una expectativa. Por lo tanto,
necesitaremos generar una expectativa de cuáles serían los valores de
las métricas de diversidad para cada píxel. La función
ps_rand()
aplica internamente el algoritmo
quantize()
para generar una hipótesis nula basada en la
ejecución de múltiples aleatorizaciones estratificadas.
Para ejecutar esta función, necesitamos proporcionarle como argumento un objeto filoespacial, indicar el número de aleatorizaciones que queremos usar para crear nuestra expectativa nula, y las medidas de diversidad que queremos usar. Ten en cuenta que este paso puede tardar un tiempo en correr.
# Corremos la randomizacion para nuestros datos, puedes cambiar el numero de randomizaciones modificando el argymento n_rand
rand <- ps_rand(ps, n_rand = 50, progress = F,
metric = c("PD", "PE", "CE", "RPE"))
Si indagas el resultado de esta función, observarás que consta de un ráster por métrica. Grafiquemos uno de estos rásters.
tm_shape(rand$qPE) +
tm_raster(palette = "inferno", style = "cont") +
tm_layout(legend.outside = TRUE)
Los valores graficados indican, para cada celda, la proporción de aleatorizaciones en las que el valor observado de la medida es mayor que el valor de la aleatorización. Por ejemplo, en la figura anterior, si una celda tiene un valor de 0.8, significa que en el 80 % de las aleatorizaciones el valor observado de PE fue mayor que el valor simulado. En ciencias, solemos utilizar valores de significancia de alfa = 0.5. Si aplicasemos este criterio en este escenario, solo consideraríamos a las celdas con valores superiores a 0.95 como celdas con PE significativamente mayor al esperado.
Los investigadores pueden estar interesados en evaluar la importancia de cierta medidas específicas de diversidad filogenética, y pueden usar variantes del código anterior para ello. Sin embargo, un análisis que se ha convertido en estándar en filogenética espacial es CANAPE (análisis categórico de neoendemismo y paleoendemismo, descrito en Mishler et al. 2014). CANAPE consta de dos pasos. Primero, se identifican los píxeles con un endemismo filogenético (PE) significativamente alto. Y segundo, cada uno de estos píxeles con un PE significativamente alto se asigna a categorías de endemismo basadas en el RPE, que, como se mencionó anteriormente, refleja la longitud relativa de las ramas de un píxel en comparación con otros píxeles.
# run CANAPE
# nota que podemos modificar el valor de alpha
cp <- ps_canape(rand, alpha = .05)
# ploteamos los results
terra::plot(cp)
Las categorías de endemismo significativo a las que se pueden asignar los píxeles son:
Neoendemismo: píxeles con un endemismo significativamente alto debido a ramas significativemente cortas, indicadas por RPE.
Paleoendemismo: píxeles con un endemismo significativamente alto debido a ramas significativamente largas, indicadas por RPE.
Endemismo mixto: píxeles con un endemismo significativamente alto, pero sin valores significativos en RPE, lo que se interpreta como una mezcla de ramas cortas y largas.
Superendemismo: es una subcategoría del endemismo mixto con un endemismo significativo particularmente alto.
¿Cuál es la importancia de usar pruebas de aleatorización?
¿Cómo interpreta cada tipo de categoría de endemismo? ¿Se te ocurre algún proceso evolutivo que pueda explicar el hallazgo de tales valores de significancia?
Otro aspecto interesante de los estudios de diversidad es comprender
la distribución espacial de los ensamblajes de especies, respondiendo a
preguntas como ¿qué tan similares son las comunidades a lo largo del
espacio geográfico? ¿Existe un recambio evidente en la composición de
las comunidades? También abordaremos esta cuestión desde la perspectiva
de la diversidad filogenética. Para ello, comenzaremos calculando un
índice de disimilitud filogenética para cada par de pixeles, utilizando
la distancia de Bray-Curtis, también conocida como disimilitud
cuantitativa de Sorensen. La función ps_add_dissim()
añadirá una matriz de disimilitud a nuestro objeto filoespacial.
ps <- ps_add_dissim(ps, method = "sorensen", endemism = TRUE, normalize = TRUE)
ps
## `phylospatial` object
## - 884 lineages across 1116 sites
## - community data type: probability
## - spatial data class: SpatRaster
## - dissimilarity data: sorensen
En el código anterior, al indicar endemism = TRUE
, los
valores de ocurrencia de cada linaje se rescalan para que sumen 1 en
todos los sitios, otorgando mayor peso a los taxones con distribución
estrecha. Al establecer normalize = TRUE
, el valor de
ocurrencia total de cada sitio se escala para que sume 1 en todos los
taxones, lo que genera una matriz de distancia que enfatiza las
diferencias proporcionales en la composición en lugar de los gradientes
de diversidad alfa.
Una vez calculada la matriz de disimilitud filogenética, podemos
visualizar la similitud filogenética entre píxeles. Para ello,
utilizaremos la función ps_rbg()
. Internamente, esta
función realizará un análisis de ordenación (en este caso, utilizaremos
un CMDS: escalamiento multidimensional clásico) que reduce la variación
en las comunidades a tres componentes, que luego se utilizan para
definir los colores (utilizando las bandas RBG del espacio de color).
Como resultado, cuanto más similares sean los colores, más similares
filogenéticamente serán las comunidades.
ps %>% # toma el objeto filoespacial
ps_rgb(method = "cmds") %>% # ddeclaramos el algoritmo de ordenacion
tm_shape() + # hacemos un mapa
tm_rgb(max.value = 1, interpolate = FALSE) +
tm_layout(title = "Phylogenetic community ordination")
Si bien esta visualización ayuda a observar la similitud, puede
resultar difícil decidir dónde dividir el mapa si intentamos realizar
una regionalización geográfica. Para ello, podemos utilizar un análisis
de agrupamiento (clustering) con la función ps_regions()
.
Esta función requiere que decidamos el número de regiones en las que
queremos agrupar el espacio. Si bien no existe una respuesta única para
definir el número de regiones y la decisión tiene aspectos algo
arbitrarios, un enfoque común en los métodos de agrupamiento consiste en
seleccionar la menor cantidad de categorías k
que expliquen
la mayor parte de la variación de los datos. Para determinar el valor de
k, utilizaremos la función ps_regions_eval()
.
ps_regions_eval(ps, k = 1:15, plot = TRUE, method = "average")
El gráfico anterior sugiere que K=3
es un valor adecuado
para nuestro análisis de agrupamiento. Así pues, ahora podemos ejecutar
una regionalización con k=3 y, posteriormente, representarla
gráficamente.
ps %>%
ps_regions(k = 3, method = "average") %>% # regionalization
tm_shape() + # plot
tm_raster(style = "cat", palette = "Dark2",
title = "phylogenetic region") +
tm_layout(legend.outside = TRUE)
Es importante mencionar que existen múltiples algoritmos que se pueden utilizar para generar los clusters, y la regionalización puede variar dependiendo de cuál algoritmo se seleccione, recomiendo leer más sobre los métodos de clusterización antes de tomar una decisión sobre qué algoritmo utilizar.
Espero que este tutorial se ade ayuda para comenzar a utiliar este paquete de R. Este tutorial no es exhaustivo, ya que hay muchas otras funcionalidades por explorar. Les animo a checar las viñetas del paquete para aprender más. En particular, un aspecto que podría ser de interés para muchos es la aplicación en conservación con el algoritmo de priorización incluido en el paquete.