Lemur catta tutorial

Autor: Arman Pili con ediciones adicionales por Chihjen Ko

Este es un guion de ejemplo que se puede utilizar para desarrollar tus propios datos procesando flujos de trabajo. El guion te lleva a través el proceso de descarga, visualizando y limpiando los datos mediados por GBIF. Recuerde que el guion es solo una herramienta y que, en definitiva, es usted el usuario que asegura que los datos sean aptos para un propósito.

Usted puede descargar el documento R Markdown para su propio uso aquí - Lemur catta project. Usted será redirigido a una otra página. Pulsa con el botón derecho y "Guarda como…​" para guardar el archivo en su disco duro. (Si lo guarda como un archivo Rmd en lugar que un archivo .txt se beneficiará de la funcionalidad adicional que viene con ese formato cuando se abre en RStudio).

A medida que nuevos datos se añaden al índice de GBIF, los resultados, recuentos e imágenes mostradas abajo podrían diferir de las suyas.

Paquetes

Se necesitarán de los siguientes paquetes:

                            #notas
library(rgbif)              #para descargar conjuntos de datos de gbif
library(countrycode)        #para obtener nombres de países en función del código de país importante
library(sf)                 #para manipular mapas descargados
library(terra)              #para análisis de datos espaciales
library(rnaturalearth)      #para descargar mapas
library(rnaturalearthdata)  #datos vectoriales de mapas
library(tidyverse)          #para un análisis ordenado
library(CoordinateCleaner)  #para la verificación de calidad de los registros biológicos

El escenario

Nos interesa una especie de un país (Madagascar) y queremos conocer su presencia en el espacio de datos GBIF. Primero prepararemos mapas para la presentación. Luego descargaremos los datos y los representaremos en los mapas. También intentaremos ajustar los datos (limpiarlos) y observar la diferencia representada.

Durante este proceso, aprenderá las técnicas para examinar los datos descargados y las maneras de modificarlos.

Preparación de variables para la representación gráfica

Estas funciones te devolverán las variables que necesitarás para graficar tus datos posteriormente.

Descargando el mapa del mundo

=== Descargar el mapa de Madagascar

```{r}
country_map <- ne_countries(country = "Madagascar",
                            scale = "medium",
                            returnclass = "sf")

Descarga de datos de GBIF

Ahora vamos a descargar datos de una especie del GBIF. En este caso, necesitamos los datos del lémur de cola anillada (Lemur catta). Para ello, primero debemos determinar el identificador de la especie en el índice GBIF, ya que los nombres por sí solos a veces pueden resultar ambiguos.

Consultar el uso de nombres de especies para determinar la taxonKey

La siguiente línea llama a GBIF Species API y recupera las posibles coincidencias.

image::data-use::Taxon_key.png[align=center,width=900,height=125]

Parece que tenemos un nombre aceptado que coincide bien. La clave `usageKey` identifica el uso de un nombre en https://www.gbif.org/dataset/d7dddbf4-2cf0-4f39-9b2a-bb099caae36c[GBIF Taxonomy Backbone]. Una vez que decidimos qué "uso" es el que buscamos, usaremos la clave como `taxonKey` para especificar el taxón para sus datos de registros biológicos.

El siguiente bloque de código almacena la usageKey de _Lemur catta_ en una variable `usageKey`.

```{r} usageKey <- 2436412 # Alternativamente, como sabemos que sólo hay una coincidencia, la siguiente línea almacenará también la clave en la variable. # usageKey <- name_backbone(name = "Lemur catta", rank = "species") %>% pull(usageKey) ```

=== Utilice la taxonKey para generar la descarga de registros biológicos de la especie de interés
El siguiente bloque de código envía una petición de descarga a la API de Registros Biológicos de GBIF. Una petición exitosa devolverá una clave de descarga e iniciará la preparación de los datos solicitados. Observe que como hemos almacenado la clave en la variable `usageKey`, para la `taxonKey` requerida para occ_download(), simplemente suministramos la variable. Además, necesitamos proporcionar nuestras credenciales de acceso a GBIF.org para solicitar una descarga.

```{r}
gd_key <- occ_download(
    pred("taxonKey", usageKey),
# pred("hasCoordinate", TRUE),
    format = "SIMPLE_CSV",
    user = "USERNAME",
    pwd = "PASSWORD",
    email = "EMAIL_ADDRESS"
)

Tenga en cuenta que, con "pred("hasCoordinate", TRUE),", sólo queremos datos con coordenadas, que son necesarios para nuestro trazado. Pero puede probar a ejecutar el bloque con la línea comentada y ver que algunos errores aparecerán en pasos posteriores.

Una vez aceptada la solicitud de descarga, la API de GBIF devolverá un mensaje con un ID de descarga, que se almacena en gd_key.

Descargando el archivo

La descarga puede tardar algún tiempo en prepararse dependiendo del tamaño. Así que siempre es bueno afinar la llamada anterior para descargar sólo los registros necesarios. Una vez lista, la clave de descarga puede utilizarse para recuperar el archivo ZIP y cargar los registros, de ahí el siguiente bloque de código.

gd <- occ_download_get(gd_key, overwrite = TRUE) %>%
    occ_download_import()

head(gd, 10) # ver las diez primeras filas ```
image::data-use::download.png[align=center,width=900,height=250]

### Citando datos de GBIF Cite siempre el conjunto de datos descargado en su informe. El siguiente código ayuda a generar la cita.

```{r} print(gbif_citation(occ_download_meta(gbif_download_key))$download) ```

== Visualización de Datos
Lemur catta_ es nativo de Madagascar, pero para asegurarnos, verifiquemos los datos representando su presencia en un mapa.

```{r, message = FALSE, error = FALSE}
ggplot() +
  geom_sf(data = world_map) +
  geom_point(data = gd,
             aes(x = decimalLongitude,
                 y = decimalLatitude),
             shape = "+",
             color = "red") +
  theme_bw()
lemur map

A primera vista, ¿hay algo inusual en la distribución de las especies de lémures?

¡Vaya! Parece que hay casos inusuales fuera de su área de distribución nativa. Hay puntos rojos caídos en otros países. Tenemos que investigar los datos.

Además, tenemos una advertencia que dice que algunos cientos de filas de registros contienen valores que faltan y se eliminan del mapa. Deberíamos eliminarlos primero.

El siguiente bloque de código filtra los registros sin decimallatitud o decimallongitude y almacena el resultado como un nuevo marco de datos gdf.

```{r} table(gdf$countryCode) ```
image::data-use::countries.png[align=center,width=600,height=75]

Parece que muchos registros tienen coordenadas fuera de Madagascar. Veamos también la naturaleza de estos registros.

```{r} gdf %>% distinct(basisOfRecord) gdf %>% distinct(establishmentMeans) ``` Hay 5 valores distintos para https://dwc.tdwg.org/terms/#dwc:basisOfRecord[DwC:basisOfRecord]. También hemos mirado https://dwc.tdwg.org/list/#dwc_establishmentMeans[dwc:establishmentMeans], donde sólo aparece `NATIVE` en algunos registros.

== Limpieza de datos

Después de explorar un poco nuestros datos, sabemos que hay posibles problemas de calidad en nuestra descarga. Al parecer, los puntos fuera de Madagascar son sospechosos, y acabamos de mirar las columnas basisOfRecord y establishmentMeans en busca de indicios de acciones necesarias en los datos.

**La limpieza de datos** suele implicar procedimientos para eliminar registros no deseados en función de algún criterio, o para corregir valores con el fin de lograr una coherencia general operativa. En la siguiente sección trataremos de filtrar los datos, mostrar la diferencia y trazarla en el mapa.

== Paso 1: base de registro

Nos gustaría evaluar las observaciones y colecciones, por lo que `ESPÉCIMEN FÓSIL` y `MUESTRA DE MATERIAL` no es nuestra preocupación aquí, vamos a tratar de excluirlos de nuestra descarga.

```{r}
clean_step1 <- gdf %>%
  as_tibble() %>%
  filter(!basisOfRecord %in% c("FOSSIL_SPECIMEN", "MATERIAL_SAMPLE"))

print(paste0(nrow(gdf)-nrow(clean_step1), " records deleted; ",
             nrow(clean_step1), " records remaining."))

Trazar registros crudos contra registros pulidos

Se puede utilizar geom_point() varias veces para apilar marcadores de diferentes marcos de datos. Aquí se muestran los registros limpios en rojo, y los crudos en negro. Observe el marcador negro "+" en Denamarca.

ggplot() +
  geom_sf(data = world_map) +
  geom_point(data = gdf,
             aes(x = decimalLongitude,
                 y = decimalLatitude),
             shape = "+",
             color = "black") +
  geom_point(data = clean_step1,
             aes(x = decimalLongitude,
                 y = decimalLatitude),
             shape = "+",
             color = "red") +
  theme_bw()
lemur cleaning 1

Paso 2: Indicar las coordenadas problemáticas

Indicar registros con información problemática de incidencia usando las funciones del paquete https://ropensci.github.io/CoordinateCleaner/index.html[coordinateCleaner. Consulte los comentarios para saber qué hace cada función.

clean_step2 <- clean_step1 %>%
  filter(!is.na(decimalLatitude),
         !is.na(decimalLongitude),
         countryCode == "MG") %>% # "MG" is the ISO 3166-1 alpha-2 code for Madagascar
  cc_dupl() %>% # Identify duplicated records
  cc_zero() %>% # Identify zero coordinates
  cc_equ() %>% # Identify records with identical lat/lon
  cc_val() %>% # Identify invalid lat/lon coordinates
  cc_sea() %>% # Identify non-terrestrial coordinates
  cc_cap(buffer = 2000) %>% # Identify coordinates in vicinity of country capitals
  cc_cen(buffer = 2000) %>% # Identify coordinates in vicinity of country and province centroids
  cc_gbif(buffer = 2000) %>% # Identify records assigned to GBIF headquarters
  cc_inst(buffer = 2000) # Identify records in the vicinity of biodiversity institutions

print(paste0(nrow(gdf)-nrow(clean_step2), " records deleted; ",
             nrow(clean_step2), " records remaining."))

Trazar registros crudos contra registros limpios (paso 2)

ggplot() +
  geom_sf(data = world_map) +
  geom_point(data = gdf,
             aes(x = decimalLongitude,
                 y = decimalLatitude),
             shape = "+",
             color = "black") +
  geom_point(data = clean_step2,
             aes(x = decimalLongitude,
                 y = decimalLatitude),
             shape = "+",
             color = "red") +
  theme_bw()
lemur cleaning 2

Otra vez, los marcadores "" negros "" indican los registros de los conjuntos de datos crudos; mientras que los marcadores "+" rojos indican los registros de conjuntos de datos limpios.

Acercarse a Madagascar

Con cord_sf(), nos podemos acercar paras mostrar los marcadores en Madagascar.

ggplot() +
  geom_sf(data = country_map) +
  geom_point(data = gdf,
             aes(x = decimalLongitude,
                 y = decimalLatitude),
             shape = "+",
             color = "black") +
  geom_point(data = clean_step2,
             aes(x = decimalLongitude,
                 y = decimalLatitude),
             shape = "+",
             color = "red") +
  coord_sf(xlim = st_bbox(country_map)[c(1,3)],
           ylim = st_bbox(country_map)[c(2,4)]) +
  theme_bw()
lemur madagascar

Paso 3: Coordinar la calidad

Nos gustaría seguir eliminando registros con incertidumbre de las coordenadas y problemas de precisión. La incertidumbre de coordenadas en metros debería ser inferior a 10000, mientras que la precisión de coordenadas debería ser mejor que 0.01.

clean_step3 <- clean_step2 %>%
  filter(is.na(coordinateUncertaintyInMeters) |
           coordinateUncertaintyInMeters < 10000,
         is.na(coordinatePrecision) |
           coordinatePrecision > 0.01)

print(paste0(nrow(gdf)-nrow(clean_step3), " records deleted; ",
             nrow(clean_step3), " records remaining." ))

Quedan solo 14 registros, como se muestra en el siguiente gráfico.

Trazar registros nuevos versus registros limpios (paso 3)

ggplot() +
  geom_sf(data = country_map) +
  geom_point(data = gdf,
             aes(x = decimalLongitude,
                 y = decimalLatitude),
             shape = "+",
             color = "black") +
  geom_point(data = clean_step3,
             aes(x = decimalLongitude,
                 y = decimalLatitude),
             shape = "+",
             color = "red") +
  coord_sf(xlim = st_bbox(country_map)[c(1,3)],
           ylim = st_bbox(country_map)[c(2,4)]) +
  theme_bw()
lemur cleaning 3

Paso 4: Filtrado por rangos temporal

Podríamos tener otros niveles de datos para trabajar con la descarga de incidencia (por ejemplo https://worldclim.org/data/index.html[WorldClim proporciona datos desde 1960). Dependiendo de la disponibilidad temporal de los datos, por ejemplo, después de 1955, nosotros queremos también filtrar los registros de incidencia anterior al año, ya que no serían utilizados.

La función filtro() aplicada a los atributos temporales puede eliminar fácilmente los registros con un rango temporal fuera de nuestras variables predictivas.

clean_step4 <- clean_step3 %>%
  filter(year >= 1955)

print(paste0(nrow(gdf)-nrow(clean_step3), " records deleted; ",
             nrow(clean_step4), " records remaining." ))

Como resultado, tenemos solo tres registros después de aplicar este filtro. Consulte el gráfico siguiente.

ggplot() +
  geom_sf(data = country_map) +
  geom_point(data = gdf,
             aes(x = decimalLongitude,
                 y = decimalLatitude),
             shape = "+",
             color = "black") +
  geom_point(data = clean_step4,
             aes(x = decimalLongitude,
                 y = decimalLatitude),
             shape = "+",
             color = "red") +
  coord_sf(xlim = st_bbox(country_map)[c(1,3)],
           ylim = st_bbox(country_map)[c(2,4)]) +
  theme_bw()
%20lemur cleaning 4

Conclusión

Este documento se limita a mostrar lo que los usuarios de datos de GBIF pueden hacer tras descargar los datos del índice global. Antes de introducir los datos en un flujo de trabajo analítico, los usuarios suelen examinar la descarga observando los valores únicos y visualizando las facetas y, a continuación, deciden limpiar o filtrar los datos para que el análisis posterior pueda ejecutarse con los ajustes deseados. El proceso puede incluir muchas pruebas y ajustes, y aquí hemos presentado algunos de ellos.