load( url( "http://webs.um.es/jfcalvo/deb.RData" ) )
Modelos de distribución de especies
Práctica 8, Datos Espaciales en Biodiversidad
Máster en Áreas Protegidas, Recursos Naturales y Biodiversidad
Introducción
En esta práctica se realiza una introducción a los modelos de distribución de especies (species distribution models, SDM), centrada en diferentes aspectos del procedimiento, como la preparación de los datos, el uso de diversos algoritmos, la proyección y evaluación de los modelos resultantes, y el ensamble de diferentes modelos. Realizaremos ejercicios para modelar datos de presencia/ausencia y datos únicamente de presencias (con generación de pseudausencias). Para cada uno de los casos, en primer lugar se prepararán los datos mediante procedimientos de manipulación de datos vectoriales y ráster similares a los utilizados en prácticas anteriores de la asignatura.
Preparación
Los datos, mapas y funciones necesarios para el desarrollo de la práctica se encuentran disponibles en el archivo RData
de la asignatura. Una vez iniciado R, cargaremos este archivo desde el servidor:
Usando ls()
podemos ver los objetos cargados. Utiliza la función info
para obtener información sobre ellos; por ejemplo: info( "taxiados" )
o info( "spain" )
. Teclea info()
para más información.
Para realizar esta práctica se necesita la instalación adicional de los paquetes de R terra
, geodata
, biomod2
y rgbif
. Si no los tenemos instalados usaremos:
install.packages( c( "terra", "geodata", "biomod2", "rgbif" ) )
Una vez instalados los cargaremos en memoria:
library( terra )
library( geodata )
library( biomod2 )
library( rgbif )
Descomprimiremos también los mapas que necesitaremos en la práctica, usando la función unwrap
y cambiaremos el sistema de referencia de coordenadas del mapa murcia
:
unwrap( murcia ) -> murcia
unwrap( taxiados ) -> taxiados
unwrap( mdt200 ) -> mdt200
unwrap( corine90 ) -> corine90
unwrap( spain ) -> spain
project( murcia, crs( mdt200 ) ) -> murcia
Modelos de distribución con presencias y ausencias
Preparación de los datos
Trabajaremos con los datos del objeto taxiados
en los que está registrada la presencia/ausencia de varias especies de aves en 140 itinerarios de censo realizados en sierras de la Región de Murcia. Para este ejercicio utilizaremos los datos del mito (Aegithalos caudatus).
plot( murcia )
plot( taxiados, "Aegithalos.caudatus", add = TRUE )
Inicialmente necesitamos extraer los datos (presencias y ausencias) del mito, y las coordenadas de cada taxiado. Como taxiados
es un objeto de líneas consideraremos los centroides:
<- taxiados$Aegithalos.caudatus
aegcau <- geom( centroids( taxiados ) )[ , 3 : 4 ] xy
Como variables ambientales utilizaremos un mapa ráster con capas de altitud, temperatura media anual, precipitación anual y porcentaje de superficie de bosque. Para crearlo seguiremos un procedimiento similar al utilizado en la práctica 4 de la asignatura. En primer lugar, descargaremos los mapas bioclimáticos con la función worldclim_country
del paquete geodata
:
worldclim_country( country = "Spain" , var = "bio", path = "./descargas/" ) -> spain_bio
project( spain_bio, crs( mdt200 ) ) -> spain_bio
resample( spain_bio, mdt200 ) -> murcia_bio
A continuación rasterizaremos el conjunto de los tipos de uso “bosque” del mapa CORINE, estimando su proporción en cada cuadrícula (argumento cover = TRUE
y opción background = 0
):
subset( corine90, corine90$CODE_90 > 300 & corine90$CODE_90 < 320 ) -> bosque
rasterize( bosque, mdt200, cover = TRUE, background = 0 ) -> rbosque
Finalmente crearemos el mapa ráster, añadiendo también el mapa de elevaciones, y lo recortaremos con los límites territoriales de la Región de Murcia:
<- c( mdt200, murcia_bio[[ 1 ]], murcia_bio[[ 12 ]], rbosque )
amb crop( amb, murcia, mask = TRUE, snap = "out" ) -> amb
names( amb ) <- c( "alt", "temp", "prec", "bosq" )
plot( amb )
Ahora ya estamos en disposición de formatear los datos biológicos y ambientales para realizar los SDM. Utilizaremos la función BIOMOD_FormatingData
, proporcionando los datos de presencia/ausencia de la especie, las coordenadas de las unidades de muestreo y el mapa de variables ambientales:
<- BIOMOD_FormatingData( resp.var = aegcau, resp.xy = xy, expl.var = amb, resp.name = "Mito" )
sdmData sdmData
Modelado
Para realizar los modelos utilizaremos la función BIOMOD_Modeling
. Podemos ver los diferentes algoritmos de modelado disponibles, además de las múltiples opciones de la función, con:
?BIOMOD_Modeling
Elegiremos inicialmente, por ejemplo, el modelo GLM (Generalized Linear Model). También utilizaremos inicialmente la totalidad de los datos, prescindiendo así de realizar un procedimiento de validación. Esta opción puede modificarse con el argumento CV.perc
, que permite especificar la proporción de datos a utilizar en los modelos. La función que realiza el modelo es BIOMOD_Modeling
:
<- BIOMOD_Modeling( bm.format = sdmData, models = "GLM", CV.perc = 1 ) sdmGLM
La proyección de los modelos se realiza en función de los datos ambientales, que podrían extenderse a áreas espaciales o escalas temporales diferentes. En nuestro caso, realizaremos la proyección sobre el área de estudio bajo las condiciones actuales (es decir, utilizando las variables ambientales del objeto amb
). La función que realiza este proceso es BIOMOD_Projection
:
<- BIOMOD_Projection( bm.mod = sdmGLM, new.env = amb, proj.name = "Mito") sdmGLMProj
La visualización del mapa resultante se obtiene con la función plot
aplicada sobre la función get_predictions
.
plot( get_predictions( sdmGLMProj ) )
Con la función get_evaluations
se obtienen diferentes métricas de evaluación:
get_evaluations( sdmGLM )
Finalmente, la función bm_PlotResponseCurves
proporciona las curvas de respuesta de las variables ambientales:
bm_PlotResponseCurves( sdmGLM )
Ensambles
La función BIOMOD_Modeling
permite realizar simultáneamente varios modelos (diferentes algoritmos), con la posibilidad de realizar un ensamble, o modelado conjunto final con todos o una selección de ellos. Siguiendo con el ejemplo del mito, elaboraremos diversos modelos, considerando en este caso una sola réplica de cada uno (con todos los datos) para simplificar la visualización de los resultados. Dado que el ensamble se realiza en función de las métricas de evaluación, seleccionaremos únicamente ROC:
<- BIOMOD_Modeling( bm.format = sdmData, models = c( "GLM", "GBM", "GAM", "ANN", "FDA", "MARS", "RF" ), CV.perc = 1, metric.eval = "ROC" )
sdm <- BIOMOD_Projection( bm.mod = sdm, new.env = amb, proj.name = "Mito")
sdmProj plot( get_predictions( sdmProj ) )
Si quisieramos representar el resultado de un único modelo utilizaríamos, por ejemplo:
plot( get_predictions( sdmProj )[[ 7 ]] )
La evaluación de los modelos y las curvas de respuesta las obtenemos con:
get_evaluations( sdm )
bm_PlotResponseCurves( sdm )
El ensamble lo haremos con la función BIOMOD_EnsembleModeling
y la proyección con BIOMOD_EnsembleForecasting
:
<- BIOMOD_EnsembleModeling( bm.mod = sdm )
sdmE <- BIOMOD_EnsembleForecasting( bm.em = sdmE, new.env = amb, proj.name = "Mito" )
sdmEProj plot( get_predictions( sdmEProj ) )
La evaluación del modelo final y las curvas de respuesta las obtenemos con:
get_evaluations( sdmE )
bm_PlotResponseCurves( sdmE )
Validación
Los procedimientos de modelado SDM incluyen habitualmente la aplicación de métodos validación consistentes en seleccionar (habitualmente de forma aleatoria) una proporción de los datos para el calibrado del modelo y el resto para su validación. En estos casos, por tanto, se requiere la realización de varias réplicas. Necesitaremos utilizar los argumentos CV.nb.rep
(para especificar el número de réplicas a realizar) y CV.perc
(para especificar la proporción de datos a utilizar en los modelos). Además utilizaremos otro argumento (var.import
) que especifica un número de permutaciones que utilizará la función para obtener un índice de importancia de cada una de las variables ambientales utilizadas en el modelo. Analizaremos este procedimiento de nuevo con los datos de presencia/ausendia del mito, y seleccionando en este caso, por ejemplo, el algoritmo Random Forest:
<- BIOMOD_Modeling( bm.format = sdmData, models = "RF", CV.nb.rep = 6, CV.perc = 0.7, var.import = 10 )
sdmRF <- BIOMOD_Projection( bm.mod = sdmRF, new.env = amb, proj.name = "Mito")
sdmRFProj plot( get_predictions( sdmRFProj ) )
Como tenemos varias réplicas del modelo, para representar el “modelo promedio” podríamos utilizar:
plot( mean( get_predictions( sdmRFProj ) ) )
En este caso, dado que tenemos varías réplicas con sus corrrespondientes métricas de evaluación, resulta apropiado usar la función bm_PlotEvalBoxplot
:
bm_PlotEvalBoxplot( sdmRF, group.by = c( "algo", "algo" ) )
Por otra parte, la función bm_PlotVarImpBoxplot
proporciona la información sobre la importancia de las variables ambientales:
bm_PlotVarImpBoxplot( sdmRF, group.by = c( "expl.var", "algo", "algo" ) )
Finalmente, la función bm_PlotResponseCurves
proporciona las curvas de respuesta de las variables ambientales:
bm_PlotResponseCurves( sdmRF )
Modelos de distribución con presencias y pseudoausencias
Los modelos de distribución de especies se pueden realizar también con información únicamente de presencias, que suelen corresponder a registros o citas de especies procedentes, por ejemplo, de programas de ciencia ciudadana. El objetivo de esta sección es realizar el modelado de datos de presencias para elaborar mapas de idoneidad de hábitat en función de diferentes variables ambientales.
Realizaremos un ejercicio con datos de la alondra ricotí (Chersophilus duponti) obtenidos a partir de la base de datos mundial del Sistema Global de Información sobre Biodiversidad (GBIF, https://www.gbif.org/). Utilizaremos datos de localización de esta especie en España entre los años 2020 y 2024 (que obtendremos siguiendo un procedimiento similar al realizado en la práctica 2 de la asignatura):
occ_data( scientificName = "Chersophilus duponti", country = "ES", year = "2020,2024", limit = 1000 ) -> chedup_ES
vect( chedup_ES$data, geom = c( "decimalLongitude", "decimalLatitude" ), crs("LonLat") ) -> chedup
project( chedup, crs( spain ) ) -> chedup
chedupplot( spain )
plot( chedup, add = TRUE, cex = 0.5, col = 4 )
A continuación generaremos un vector de presencias y las coordenadas de las localizaciones:
$pres <- 1
chedup<- geom( chedup )[ , 3 : 4 ] xy2
Como variables ambientales utilizaremos las variables bioclimáticas ya descargadas (objeto spain_bio
), que recortaremos con los límites territoriales de España peninsular y Baleares:
<- crop( spain_bio, spain, mask = TRUE )
spain_bio plot( spain_bio )
Por último, formateamos los datos para aplicar las funciones de biomod2
. En este caso hay que utilizar los argumentos PA.nb.rep
y PA.strategy
para generar las pseudoausencias necesarias para la realización de los modelos. También es importante utilizar el argumento filter.raster = TRUE
para eliminar duplicados (presencias coincidentes en una misma celda del mapa ráster de variables ambientales):
<- BIOMOD_FormatingData( resp.var = chedup$pres, resp.xy = xy2, expl.var = spain_bio, resp.name = "Alondra.ricotí", PA.nb.rep = 1, PA.strategy = "random", filter.raster = TRUE )
sdmData2 sdmData2
Como ejemplo de modelo que utiliza pseudoausencias utilizaremos el algoritmo MAXNET, que realiza un modelo de Máxima Entropía:
<- BIOMOD_Modeling( bm.format = sdmData2, models = "MAXNET", CV.nb.rep = 6, CV.perc = 0.7, var.import = 10 )
sdmME <- BIOMOD_Projection( bm.mod = sdmME, new.env = spain_bio, proj.name = "Alonda.ricotí" )
sdmMEProj plot( mean( get_predictions( sdmMEProj ) ) )
La evaluación del modelo la obtenemos con:
bm_PlotEvalBoxplot( sdmME, group.by = c( "algo", "algo" ) )
La información sobre la importancia de las variables bioclimáticas la obtenemos con:
bm_PlotVarImpBoxplot( sdmME, group.by = c( "expl.var", "algo", "algo" ) )
Las curvas de respuesta las obtenemos con:
bm_PlotResponseCurves( sdmME )
Evaluación
Realiza la prueba de evaluación disponible en la herramienta Exámenes del Aula Virtual.
Bibliografía
Guisan A, Thuiller W., & Zimmermann, N. E. (2017) Habitat suitability and distribution models: with applications in R. Cambridge University Press.
Hijmans R (2024) _terra: Spatial Data Analysis_. R package version 1.7-71, https://CRAN.R-project.org/package=terra
Thuiller W, Georges D, Gueguen M, Engler R, Breiner F, Lafourcade B, Patin R
- _biomod2: Ensemble Platform for Species Distribution Modeling_. R package version 4.2-4, https://CRAN.R-project.org/package=biomod2.
Descripción de los mapas y funciones
Utiliza la función info
. Por ejemplo: info( "taxiados" )
o info( "spain" )
.