Patrones geográficos de riqueza de especies

Fabricio Villalobos & Axel Arango

Áreas de distribución y patrones geográficos de riqueza

“To do science is to search for repeated patterns, not simply to accumulate facts” R. MacArthur

  • A partir de las distribuciones geográficas de las especies es posible describir y evaluar diferentes patrones de biodiversidad que emergen cuando estudiamos conjuntos de especies (y no a nivel indivual)

Áreas de distribución y patrones geográficos de riqueza

  • En este ejercicio veremos cómo usar las distribuciones de las especies (polígonos, como los que generamos en el ejercicio anterior) para generar el patrón geográfico de riqueza de especies

  • Usaremos dos paquetes (letsR y epm) para mostrar diferentes maneras de llegar a lo mismo, considerando paquetes obsoletos (y que pronto se retirarán) y nuevos (que suplen los anteriores)

Los datos (polígonos) son de una familia de aves (Passeriformes:Emberizoidae:Icteridae) obtenidos de BirdLife International

Paquetes necesarios:

library(sp)
library(letsR)
library(rgdal)
library(ggplot2)
library(viridisLite)
library(epm)
library(sf)
library(tmap)
library(here)

letsR (Vilela & Villalobos 2015 MEE)

Cargar los polígonos de las especies de interés (shapefiles en su carpeta de trabajo)

icteri_maps <- readOGR(here("data","icteridae_maps","icteridae_maps.shp"))
OGR data source with driver: ESRI Shapefile 
Source: "/home/luisd/Dropbox/darcyDB/PDRF/curso-R-biodiversidad/data/icteridae_maps/icteridae_maps.shp", layer: "icteridae_maps"
with 190 features
It has 26 fields

Conocer el dominio (“extent”) de los datos, para usarlo después en la delimitación del espacio (geográfico) de trabajo

icteri_maps@bbox
         min       max
x -166.19269 -34.79010
y  -55.98218  69.60669

Crear una matriz de presencia-ausencia a partir de los polígonos

icteri.pam <- lets.presab(icteri_maps, xmn = -167,xmx = -35, ymn = -56, ymx = 70, resol=1)

¿Cómo se ve el patrón geográfico?

plot(icteri.pam)

¿Qué tiene el objeto que se graficó?

icteri.pam$Richness_Raster
class      : RasterLayer 
dimensions : 126, 132, 16632  (nrow, ncol, ncell)
resolution : 1, 1  (x, y)
extent     : -167, -35, -56, 70  (xmin, xmax, ymin, ymax)
crs        : +proj=longlat +datum=WGS84 +no_defs 
source     : memory
names      : layer 
values     : 0, 18  (min, max)

Vamos a verlo en ggplot

Primero, convertimos el raster en un data.frame

rdf <- as.data.frame(icteri.pam$Richness_Raster, xy=TRUE) #Convert raster to data.frame
names(rdf)[3] <- 'richness' #Name value column
head(rdf)
       x    y richness
1 -166.5 69.5        0
2 -165.5 69.5        0
3 -164.5 69.5        0
4 -163.5 69.5        0
5 -162.5 69.5        0
6 -161.5 69.5        0
rdf2 <- rdf
rdf2[,3] <- ifelse(rdf[,3]==0,NA,rdf[,3])
head(rdf2)
       x    y richness
1 -166.5 69.5       NA
2 -165.5 69.5       NA
3 -164.5 69.5       NA
4 -163.5 69.5       NA
5 -162.5 69.5       NA
6 -161.5 69.5       NA

Ahora sí, lo graficamos

ggplot(data = rdf2)+
  geom_raster(mapping=aes(x=x, y=y, fill=richness))+
  scale_fill_gradientn(colours= rev(inferno(10)), name='Richness')

EcoPhyloMapper - epm (Title et al. 2022 MEE)

Cargar nuevamente los polígonos, pero ahora con el paquete ‘nuevo’ y recomendado a partir de junio 2023! (sf)

icteri_file <- here("data","icteridae_maps","icteridae_maps.shp")
icteri_maps.sf <- st_read(icteri_file, stringsAsFactors = FALSE)
Reading layer `icteridae_maps' from data source 
  `/home/luisd/Dropbox/darcyDB/PDRF/curso-R-biodiversidad/data/icteridae_maps/icteridae_maps.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 190 features and 26 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -166.1927 ymin: -55.98218 xmax: -34.7901 ymax: 69.60669
Geodetic CRS:  GCS_unknown

Checar que la columna de especies (en este caso: SCINAME) sea de caracteres (para evitar problemas más adelante)

class(icteri_maps.sf$SCINAME)
[1] "character"

Crear un vector con los nombres de todas las especies en el multipoligono

allspp <- unique(icteri_maps.sf$SCINAME)

Creamos polígonos individuales por especie

spList <- vector('list', length(allspp))
names(spList) <- allspp

for (i in 1:length(allspp)) {
  ind <- which(icteri_maps.sf$SCINAME == allspp[i])
  spList[[i]] <- icteri_maps.sf[ind,]
}

Checamos la geometría de los polígonos e intentamos corregirla si es necesario

for (i in 1:length(spList)) {
    if (!any(st_is_valid(spList[[i]]))) {
            message('\trepairing poly ', i)
            spList[[i]] <- st_make_valid(spList[[i]])
        }
   }

Ahora sí, creamos el gradiente de riqueza con el paquete epm

icteriEPM <- createEPMgrid(spList, resolution = 1, retainSmallRanges = TRUE, extent = 'auto', method = 'percentOverlap', cellType = 'square', percentThreshold = 0.1)

  |                                                                            
  |                                                                      |   0%
  |                                                                            
  |=======================                                               |  33%
  |                                                                            
  |===============================================                       |  67%
  |                                                                            
  |======================================================================| 100%

¿Qué tiene el objeto generado?

icteriEPM

    Summary of epm object:

    metric: spRichness 
    grid type:  square 
    number of grid cells: 16764 
    grid resolution: 1 by 1 
    projected: FALSE 
    crs: +proj=longlat +datum=WGS84 +no_defs 

    number of unique species: 99 (richness range: 1 - 21) 
    data present: No 
    phylogeny present: No 

Lo graficamos

plot(icteriEPM)

Ahora generamos la matriz de presencia-ausencia a partir del objeto creado. Esta matriz nos puede servir para comparar con los resultados de letsR o para derivar otras métricas/patrones

icteri.pamEPM <- epmToPhyloComm(icteriEPM, sites = 'all')