Introducción

Se recomienda tener la última versión de R instalada R 4.5.1.

Paquetes requeridos para la ejecución

Para el procesamiento y el análisis de los datos, sera necesario utilizar los siguientes paquetes:

library(sf)
## Linking to GEOS 3.11.2, GDAL 3.8.2, PROJ 9.3.1; sf_use_s2() is TRUE
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(readxl)
library(janitor)
## 
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
library(leaflet)
library(leaflet.extras)
library(tidyr)
library(viridis)
## Loading required package: viridisLite
library(vegan)
## Loading required package: permute
## Loading required package: lattice
## This is vegan 2.6-6.1

Obsérvese que la lectura de un paquete se realiza con la función library() y en caso de que aparezca el siguiente error Error: no se encontró la librería 'nombre_paquete', el cual indica que el paquete bajo el nombre nombre_paquete no está instalado, puede proceder instalándolo con la siguiente línea de código install.package("nombre_paquete").

Lectura de las bases de datos

Una vez realizada la lectura de los paquetes, se procede a realizar la importación o lectura de la base de datos. Considerando en este caso que no solo se cuenta con el archivo que contiene los datos del levantamiento, sino que además, se necesitan archivos de la capa base (ya sea poligonos o raster) para la proyección del mapa del campus universitario UNAL; entonces la importación se realizará para ambos archivos.

Lectura de los datos en formato “.xlsx”

Consideremos que el archivo en el cual se encuentran los datos esta un formato .xlsx (es decir, un archivo excel), se utilizará la función read_excel() para la importación como se muestra a continuación:

ruta <- "C:\\Users\\brial\\OneDrive\\Documentos\\Avistamiento_Aves\\"

aves <- read_excel(paste(ruta,"Simulados_datos.xlsx", sep=""),
                   sheet = "Hoja3") 

Cabe mencionar, que la ruta debe ajustarse según donde tenga guardado su archivo.

Lectura de los datos en formato “.csv”

Considere ahora que su archivo de datos sobre el avistamiento de aves no se encuentra en un archivo .xlsx sino en un archivo .csv, entonces la indicación es utilizar la función read.csv() adecuada para esta situación. A continuación, un ejemplo:

aves <- read.csv(ruta,sep = ";")

Note que esta función posee el parametro sep = ";" lo que indica que nuestro archivo esta separado por el signo “;”; por lo cual, usted deberá ajustar este parametro según requiera (por ejemplo: “,”, “_“,”-“,”@“,…).

Tratamiento del registro de aves

Una vez realizada la lectura de la base de datos, se procederá con un tratamiento sencillo para mostrar un ejemplo sencillo de cómo tratar su base de datos una vez cargada al programa R.

aves <- aves %>%
  select(decimalLongitude, decimalLatitude, scientificName, cantidad) %>%
  mutate(
    longitud = as.numeric(decimalLongitude),
    latitud = as.numeric(decimalLatitude)
    ) %>%
  filter(!is.na(latitud), !is.na(longitud))

aves_filtro <- aves %>%
  select(decimalLatitude, scientificName, cantidad) %>%
  mutate(
    latitud = as.numeric(decimalLatitude)
    ) %>% 
  group_by(scientificName) %>%
  summarise(Total_individuos = sum(cantidad, na.rm = TRUE)) %>%
  filter((scientificName == "Colinus cristatus" | 
           scientificName == "Eupsittula pertinax" |
          scientificName == "Falco sparverius"
          ) &
           Total_individuos >= 3)

En este caso, el paquete dplyr permite ejecutar varias acciones a una base de datos y generar una nueva con todo el tratamiento realizado, esto lo realiza con ayuda del operador %>%. En el codigo mostrado anteriormente para generar la tabla aves_filtro permite seleccionar en primer lugar las columnas que se deseen, en segundo lugar, agregar nuevas columnas, en tercer lugar, agrupar y resumir los datos agrupados sumandolos, en cuarto lugar, filtrar los datos cuantas veces desee.

Base de datos del mapa del campus en formato “.shp”

campus <- st_read(paste(ruta,"campus_unal.shp", sep=""), quiet = TRUE) %>%
  st_transform(4326) %>%
  st_make_valid()

Convertir a objeto espacial

aves.sf <- aves %>%
  st_as_sf(coords = c("longitud", "latitud"), crs = 4326, remove = FALSE)

Delimitación según el área de estudio

aves.sf <- aves.sf[st_within(aves.sf, campus, sparse = FALSE), ]

Mapa de distribuciones de las aves en el campus universitario

Mapa de observaciones

leaflet() %>%
  addProviderTiles("Esri.WorldImagery") %>%
  addPolygons(data = campus, fillColor = "transparent", color = "red", weight = 2) %>%
  addCircleMarkers(
    lng = aves.sf$longitud,
    lat = aves.sf$latitud,
    radius = 5,
    color = "orange",
    stroke = FALSE,
    fillOpacity = 0.7,
    popup = paste0(
      "<b>Nombre:</b> ", aves.sf$scientificName, "<br>",
      "<b>Coordenada:</b> ", aves.sf$longitud, ";", aves.sf$latitud, "<br>"
    )
  )

Mapa de calor

leaflet() %>%
  addProviderTiles("Esri.WorldImagery") %>%
  addPolygons(data = campus, fillColor = "transparent", color = "red", weight = 2) %>%
  addHeatmap(
    lng = aves.sf$longitud,
    lat = aves.sf$latitud,
    intensity = aves.sf$cantidad * 3,
    radius = 50, blur = 20,
    max = max(aves.sf$cantidad, na.rm = TRUE),
    gradient = c(
      "0.0" = "transparent",
      "0.2" = "skyblue",
      "0.4" = "limegreen",
      "0.6" = "yellow",
      "0.8" = "orange",
      "1.0" = "red"
    )
  )

División del espacio geografico en cuadriculas

# Convertir a proyección métrica (UTM zona 18N)
campus_utm <- st_transform(campus, 32618)
aves_sf_utm <- st_transform(aves.sf, 32618)

# Crear una cuadrícula de 100 m dentro del campus
grid <- st_make_grid(campus_utm, cellsize = 100, square = TRUE)
grid_sf <- st_sf(ID = 1:length(grid), geometry = grid)
grid_campus <- st_intersection(grid_sf, campus_utm)
## Warning: attribute variables are assumed to be spatially constant throughout
## all geometries
# Unir aves a la cuadrícula
aves_join <- st_join(aves_sf_utm, grid_campus, left = FALSE)

Creación de la matriz de ausencia-presencia

tabla_abundancia <- aves_join %>%
  st_drop_geometry() %>%
  group_by(ID, scientificName) %>%
  summarise(Total_individuos = sum(cantidad, na.rm = TRUE)) %>%
  ungroup() %>%
  pivot_wider(names_from = scientificName,
              values_from = Total_individuos,
              values_fill = 0)
## `summarise()` has grouped output by 'ID'. You can override using the `.groups`
## argument.

Cálculo de los índices de: Shannon y Simpson

diversidad_indices <- tabla_abundancia %>%
  mutate(
    Shannon = diversity(select(., -ID), index = "shannon"),
    Simpson = diversity(select(., -ID), index = "simpson")
  ) %>%
  select(ID, Shannon, Simpson)

Unión de los índices con las cuadriculas geoespaciales

diversidad_sf <- grid_campus %>%
  left_join(diversidad_indices, by = "ID") %>%
  st_transform(4326)

Mapa del índice de shannon por cuadricula

pal_shannon <- colorNumeric("viridis", domain = diversidad_sf$Shannon)

leaflet(diversidad_sf) %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  addPolygons(
    fillColor = ~pal_shannon(Shannon),
    color = "grey40",
    weight = 1,
    fillOpacity = 0.7,
    label = ~paste0("Shannon: ", round(Shannon, 2))
  ) %>%
  addLegend(pal = pal_shannon, values = diversidad_sf$Shannon,
            title = "Índice de Shannon") %>%
  addPolygons(data = campus, fill = NA, color = "black", weight = 1.5)

Mapa del índice de shannon por cuadricula

pal_simpson <- colorNumeric("magma", domain = diversidad_sf$Simpson)

leaflet(diversidad_sf) %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  addPolygons(
    fillColor = ~pal_simpson(Simpson),
    color = "grey40",
    weight = 1,
    fillOpacity = 0.7,
    label = ~paste0("Simpson: ", round(Simpson, 2))
  ) %>%
  addLegend(pal = pal_simpson, values = diversidad_sf$Simpson,
            title = "Índice de Simpson") %>%
  addPolygons(data = campus, fill = NA, color = "black", weight = 1.5)