7 Prioridades de conservación y restauración con MK_Focal_nodes()

Esta función permite calcular el Índice Integral de Conectividad focal (IICf) o la Probabilidad de Conectividad focal (PCf) bajo uno o más umbrales de distancia. Además, esta función estima el Índice de Conectividad Compuesto (CCIf; para más detalles, véase Latorre-Cárdenas et al., 2023. Land 2023, 12(3), 631; https://doi.org/10.3390/land12030631).

Argumento Descripción
nodes Objeto espacial (sf, SpatVector, SpatialPolygonsDataFrame) que contiene los nodos (por ejemplo, fragmentos o hábitats) a analizar. Debe estar en un sistema de coordenadas proyectado.
id Nombre de la columna con el ID de los nodos.
attribute Nombre de la columna o vector. Si es NULL, se usará el área del nodo como atributo. Se puede definir la unidad del área con area_unit. Para usar un atributo alternativo, considera el tipo de clase del objeto en nodes.
raster_attribute Objeto raster usado para asignar valores de atributo a cada nodo, usando la función definida en fun_attribute.
fun_attribute Función usada para extraer los valores del raster por nodo (ej. mean, sum, modal, min, max). Por defecto = mean.
weighted Lógico. Si es TRUE junto con raster_attribute, se multiplica el valor del atributo por el área del nodo, obteniendo un índice ponderado.
area_unit Unidad del área cuando attribute = NULL. Puede ser "m2" (por defecto), "km2", "cm2" o "ha".
distance Lista de parámetros para calcular la distancia entre pares de nodos. Puede ser distancia euclidiana o efectiva (por resistencia). Debe incluir al menos type (ej. "centroid", "edge", "least-cost", "commute-time") y, si aplica, resistance.
metric Métrica de conectividad a usar: "PC" (por defecto y recomendada) o "IIC".
probability Valor numérico de la probabilidad asociada a la distance_threshold. Por ejemplo, 0.5 si es una distancia mediana de dispersión. Por defecto = 0.5. Solo para metric = "PC".
distance_thresholds Distancia(s) de dispersión (en metros). Si es NULL, se estima como la distancia mediana entre nodos. Puede usarse dispersal_distance.
search_buffer Distancia(s) en metros para generar un buffer alrededor del nodo focal y seleccionar nodos vecinos. Puede variar según cada distancia de dispersión.
simplify_shape Valor numérico para simplificar la geometría del nodo focal y facilitar el análisis espacial (ver st_simplify).
fragmentation Lógico. Si es TRUE, estima estadísticos de fragmentación con MK_Fragmentation. Requiere edge_distance y min_node_area.
edge_distance Distancia al borde (en metros). Por defecto = 500 m. Se usa en MK_Fragmentation.
min_node_area Área mínima del nodo (ej. 100 km² por defecto). Se usa para calcular cuántos nodos tienen menor área. Depende de area_unit.
parallel Número de núcleos para paralelizar el análisis de índices. Útil con >1000 nodos. Por defecto no se paraleliza.
write Ruta y prefijo del archivo a guardar, por ejemplo "C:/ejemplo/test_focal_". Por defecto no se guarda nada. El archivo guardado es un geopackage.
save_subfiles Lógico o carácter. Si TRUE, guarda resultados por nodo en una carpeta en formato .rds. Útil para reanudar análisis en caso de error. Si es carácter, especifica la ruta de la carpeta.
intern Lógico. Muestra el progreso del proceso (TRUE por defecto). El avance puede no alcanzar el 100% si la operación es muy rápida.

Se ejecuta un ciclo en el que se selecciona cada uno de los nodos. En cada iteración, ocurre lo siguiente:

  1. Cuando se selecciona el nodo i, este se convierte en el nodo focal (f).

  2. Luego, se genera un búfer con la distancia especificada en el parámetro search_buffer, por ejemplo, el doble de la distancia de dispersión especificada en el parámetro distance_thresholds. Este búfer se denomina paisaje local y se utiliza para identificar nodos vecinos, llamados nodos transfronterizos (th).

  3. A continuación, se estima el índice IIC o PC según la métrica seleccionada, utilizando el nodo focal y los nodos transfronterizos. Este resultado se denomina IICf o PCf. El valor del índice varía entre 0 y 1, donde 1 representa la mayor conectividad posible dentro del paisaje local para el nodo focal.

  4. Posteriormente, se estima el delta dIIC o dPC para el nodo focal, junto con sus componentes intra, flux y connector.

  5. La función calcula el Índice Compuesto de Conectividad (CCIf) como una herramienta de priorización de nodos focales. Este índice se basa en la contribución individual del nodo, ponderada por la conectividad de su paisaje local:

    • CCIf = IICf × dIICf
    • CCIf = PCf × dPCf

    Los nodos con valores más altos de CCIf se encuentran en paisajes locales bien conectados, lo que los convierte en contribuyentes valiosos para la conectividad del paisaje inmediato. Esto los hace candidatos ideales para esfuerzos de conservación. Por el contrario, los valores bajos de CCIf pueden indicar la necesidad de acciones de restauración y conservación.

  6. En el paso final, si el parámetro fragmentation está definido como TRUE, se estiman estadísticas de fragmentación para el paisaje local.

Este proceso se repite para cada nodo y se almacena en un objeto de clase sf.

test <- MK_Focal_nodes(nodes = habitat_nodes,
                       id = "Id",
                       attribute = NULL,
                       raster_attribute = NULL,
                       fun_attribute = NULL,
                       distance = list(type = "edge", keep = 0.1),
                       metric = "PC",
                       probability = 0.5,
                       distance_thresholds = 10000,
                       search_buffer = 20000,
                       fragmentation = FALSE,
                       parallel = 4,
                       intern = FALSE)

Índice PC en paisajes focales:

library(classInt)
library(dplyr)
#> 
#> Adjuntando el paquete: 'dplyr'
#> The following objects are masked from 'package:igraph':
#> 
#>     as_data_frame, groups, union
#> The following objects are masked from 'package:raster':
#> 
#>     intersect, select, union
#> The following objects are masked from 'package:terra':
#> 
#>     intersect, union
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

# Calcular los intervalos de Jenks para strength
breaks <- classInt::classIntervals(test$PC, n = 9, style = "jenks")

# Crear una nueva variable categórica con los intervalos
PC <- test %>%
  mutate(dPC_q = cut(PC,
                     breaks = breaks$brks,
                     include.lowest = TRUE,
                     dig.lab = 5))  

# Graficar en ggplot2 usando las clases Jenks
ggplot() +  
  geom_sf(data = paisaje, fill = NA, color = "black") +
  geom_sf(data = PC, aes(fill = dPC_q), color = "black", size = 0.1) +
  scale_fill_brewer(palette = "RdYlGn", direction = 1, name = "PC (jenks)") +
  theme_minimal() +
  labs(
    title = "PC en paisajes focales",
    fill = "PC"
  ) +
  theme(
    legend.position = "right",
    plot.title = element_text(hjust = 0.5)
  )

Índice dPC focal:

# Calcular los intervalos de Jenks para strength
breaks <- classInt::classIntervals(test$dPC, n = 9, style = "jenks")

# Crear una nueva variable categórica con los intervalos
PC <- test %>%
  mutate(dPC_q = cut(dPC,
                     breaks = breaks$brks,
                     include.lowest = TRUE,
                     dig.lab = 5))  

# Graficar en ggplot2 usando las clases Jenks
ggplot() +  
  geom_sf(data = paisaje, fill = NA, color = "black") +
  geom_sf(data = PC, aes(fill = dPC_q), color = "black", size = 0.1) +
  scale_fill_brewer(palette = "RdYlGn", direction = 1, name = "dPC (jenks)") +
  theme_minimal() +
  labs(
    title = "dPC",
    fill = "dPC"
  ) +
  theme(
    legend.position = "right",
    plot.title = element_text(hjust = 0.5)
  )

Fracción intra:

# Calcular los intervalos de Jenks para strength
breaks <- classInt::classIntervals(test$dPCintra, n = 9, style = "jenks")

# Crear una nueva variable categórica con los intervalos
PC <- test %>%
  mutate(dPC_q = cut(dPCintra,
                     breaks = breaks$brks,
                     include.lowest = TRUE,
                     dig.lab = 5))  

# Graficar en ggplot2 usando las clases Jenks
ggplot() +  
  geom_sf(data = paisaje, fill = NA, color = "black") +
  geom_sf(data = PC, aes(fill = dPC_q), color = "black", size = 0.1) +
  scale_fill_brewer(palette = "RdYlGn", direction = 1, name = "dPCintra (jenks)") +
  theme_minimal() +
  labs(
    title = "dPCintra",
    fill = "dPCintra"
  ) +
  theme(
    legend.position = "right",
    plot.title = element_text(hjust = 0.5)
  )

Fracción flux:

# Calcular los intervalos de Jenks para strength
breaks <- classInt::classIntervals(test$dPCflux, n = 9, style = "jenks")

# Crear una nueva variable categórica con los intervalos
PC <- test %>%
  mutate(dPC_q = cut(dPCflux,
                     breaks = breaks$brks,
                     include.lowest = TRUE,
                     dig.lab = 5))  

# Graficar en ggplot2 usando las clases Jenks
ggplot() +  
  geom_sf(data = paisaje, fill = NA, color = "black") +
  geom_sf(data = PC, aes(fill = dPC_q), color = "black", size = 0.1) +
  scale_fill_brewer(palette = "RdYlGn", direction = 1, name = "dPCflux (jenks)") +
  theme_minimal() +
  labs(
    title = "dPCflux",
    fill = "dPCflux"
  ) +
  theme(
    legend.position = "right",
    plot.title = element_text(hjust = 0.5)
  )

Fracción connector:

# Calcular los intervalos de Jenks para strength
breaks <- classInt::classIntervals(test$dPCconnector, n = 9, style = "jenks")

# Crear una nueva variable categórica con los intervalos
PC <- test %>%
  mutate(dPC_q = cut(dPCconnector,
                     breaks = breaks$brks,
                     include.lowest = TRUE,
                     dig.lab = 5))  

# Graficar en ggplot2 usando las clases Jenks
ggplot() +  
  geom_sf(data = paisaje, fill = NA, color = "black") +
  geom_sf(data = PC, aes(fill = dPC_q), color = "black", size = 0.1) +
  scale_fill_brewer(palette = "RdYlGn", direction = 1, name = "dPCconnector (jenks)") +
  theme_minimal() +
  labs(
    title = "dPCconnector",
    fill = "dPCconnector"
  ) +
  theme(
    legend.position = "right",
    plot.title = element_text(hjust = 0.5)
  )

Índice de Conectividad Compuesto (CCIf).

No olvidemos que es una herramienta para priorizar cada parche focal en función de su contribución individual a la conectividad en la red de parches f y thp (dPCf) y la conectividad del paisaje de toda la red (PCf). En ese sentido, los parches con valores CCI más altos se encuentran en un paisaje bien conectado y su contribución a la conectividad se considera importante:

# Calcular los intervalos de Jenks para strength
breaks <- classInt::classIntervals(test$IComp, n = 9, style = "jenks")

# Crear una nueva variable categórica con los intervalos
PC <- test %>%
  mutate(dPC_q = cut(IComp,
                     breaks = breaks$brks,
                     include.lowest = TRUE,
                     dig.lab = 5))  

# Graficar en ggplot2 usando las clases Jenks
ggplot() +  
  geom_sf(data = paisaje, fill = NA, color = "black") +
  geom_sf(data = PC, aes(fill = dPC_q), color = "black", size = 0.1) +
  scale_fill_brewer(palette = "RdYlGn", direction = 1, name = "IComp (jenks)") +
  theme_minimal() +
  labs(
    title = "Índice de Conectividad Compuesto",
    fill = "IComp"
  ) +
  theme(
    legend.position = "right",
    plot.title = element_text(hjust = 0.5)
  )