## ¿Qué es una transferencia?

En MNE, **transferir** un modelo implica proyectar las relaciones especie–ambiente estimadas en una region y periodo especifico hacia nuevos escenarios.

### Implica dos procesos en el espacio ambiental:

-   **Interpolación**: transferencias hacia condiciones ambientales **dentro** de las utilizadas para calibrar el modelo.
-   **Extrapolación**: transferencias hacia condiciones ambientales **fuera** de las utilizadas para calibrar el modelo.

::: source
Basado en [Qiao et al. (2018)](https://nsojournals.onlinelibrary.wiley.com/doi/abs/10.1111/ecog.03986)
:::


[![](https://opinionessobreciencia.wordpress.com/wp-content/uploads/2016/04/extrapolacion-interpolacion.png){height="400px" fig-align="center"}](https://opinionessobreciencia.wordpress.com/wp-content/uploads/2016/04/extrapolacion-interpolacion.png)


## Tipos de transferencia

### Las transferencias pueden ocurrir a traves de:

-   el **espacio**: una región geográfica distinta
-   el **tiempo**: pasado o futuro;
-   **ambos**: otra región en otro tiempo

::: {style="display:flex; gap:1.2rem; align-items:center; justify-content:center; margin-top:0.7rem;"}
<a href="https://ichef.bbci.co.uk/ace/ws/640/cpsprodpb/526B/production/_109499012_pezleon.png.webp"
     target="_blank"
     style="width:48%;"> <img src="https://ichef.bbci.co.uk/ace/ws/640/cpsprodpb/526B/production/_109499012_pezleon.png.webp" alt="Pez león" style="width:100%; height:310px; object-fit:contain; display:block;"/> </a>

<a href="https://www.meteorologiaenred.com/wp-content/uploads/2019/11/Ecosistema-del-plioceno.jpg.webp"
     target="_blank"
     style="width:48%;"> <img src="https://www.meteorologiaenred.com/wp-content/uploads/2019/11/Ecosistema-del-plioceno.jpg.webp" alt="Reconstrucción de un ecosistema del Plioceno" style="width:100%; height:310px; object-fit:contain; display:block;"/> </a>
:::


## ¿Por qué quisieran transferir un modelo de nicho?
### Invasiones biológicas
### Sapo de caña (*Rhinella marina*)

El modelo se calibró con las condiciones climáticas del rango nativo de la especie en América y se transfirió a Australia, donde fue introducida.

- **Origen:** Centroamérica y Sudamérica.
- **Destino:** Australia.
- **Pregunta:** ¿Qué regiones de Australia presentan condiciones climáticas adecuadas?


[![](https://github.com/kevinlopezreyes/kevinlopezreyes.github.io/blob/master/assets/images/transferencia/Captura%20de%20pantalla%202026-08-04%20001650.jpg?raw=true){height="400px" fig-align="center"}](https://www.pnas.org/doi/full/10.1073/pnas.1405766111)

## ¿Por qué quisieran transferir un modelo de nicho?
### Proyecciones a futuro

### Panda gigante (*Ailuropoda melanoleuca*)

Un modelo **Maxent** calibrado con registros y condiciones ambientales actuales fue transferido a escenarios de 2050 y 2070.

- **Origen:** condiciones ambientales actuales en Sichuan, China.
- **Destino:** condiciones proyectadas para 2050 y 2070.
- **Pregunta:** ¿Cómo cambiará la distribución del panda gigante bajo distintos escenarios climáticos?

[![](https://cdn.ncbi.nlm.nih.gov/pmc/blobs/bd2d/9465186/3ae328a99dad/ECE3-12-e9298-g004.jpg){height="510px" fig-align="center"}](https://doi.org/10.1002/ece3.9298)

::: source
[Liu et al. (2022)](https://doi.org/10.1002/ece3.9298). Bajo RCP8.5, el modelo proyectó una pérdida neta de hábitat adecuado de 25% para 2050 y 38% para 2070.
:::

## Objetivo de la práctica

Desarrollar un **modelo de nicho ecológico con `kuenm2`**, desde la limpieza y preparación de los datos hasta la calibración, selección, y transferencia del modelo.

Durante las transferencias compararemos:

- **extrapolación libre**;
- **clamping**;
- **truncamiento o no extrapolación**;
- riesgo de extrapolación mediante el análisis **MOP**.

## ¿Qué es kuenm2?

**kuenm2** es un paquete de R para desarrollar modelos de nicho ecológico de manera detallada y reproducible.

Actualmente permite trabajar con:

- **Maxnet**, basado en máxima entropía;
- **GLM**, modelos lineales generalizados.

Incluye herramientas para preparar y explorar los datos, calibrar y seleccionar modelos, realizar transferencias y analizar su incertidumbre.

::: {style="text-align:center; margin-top:25px;"}
[![](https://github.com/kevinlopezreyes/kevinlopezreyes.github.io/blob/master/assets/images/kuenm_t.png?raw=true){height="280px"}](https://peerj.com/articles/6281/)
:::

::: source
[Documentación oficial de kuenm2](https://marlonecobos.github.io/kuenm2/), [repositorio en GitHub](https://github.com/marlonecobos/kuenm2) y [Cobos et al. (2019)](https://peerj.com/articles/6281/).
:::

## ¿Qué podemos hacer con kuenm2?

### **Antes de modelar**

- limpiar y preparar registros de presencia;
- explorar los datos geográfica y ambientalmente;
- crear particiones de entrenamiento y evaluación.

### **Durante el modelado**

- calibrar múltiples modelos candidatos;
- seleccionar modelos mediante varios criterios;
- examinar importancia de variables y curvas de respuesta;
- proyectar los modelos hacia escenarios nuevos.

### **Después de modelar**

- comparar predicciones;
- cuantificar su variabilidad;
-   analizar el riesgo de extrapolación mediante MOP.

## Flujo de trabajo de kuenm2

[![](https://github.com/marlonecobos/kuenm2/blob/main/man/figures/kuenm2_map_gs.png?raw=true){height="700px" fig-align="center"}](https://marlonecobos.github.io/kuenm2/)

::: source
Figura tomada de la [documentación oficial de kuenm2](https://github.com/marlonecobos/kuenm2), distribuida bajo licencia GPL ≥ 3.
:::

## Estructura de la práctica

**Seguiremos las etapas descritas en las guías oficiales:**

1.  Limpieza básica de los datos.
2.  Preparación de los datos de calibración.
3.  Calibración y selección de modelos.
4.  Ajuste y exploración de los modelos seleccionados.
5.  Predicción hacia un escenario individual.
6.  Análisis de incertidumbre.

## Fuente de esta práctica

::: callout-important
Esta práctica es una **adaptación** de las guías oficiales de `kuenm2`, desarrolladas por Weverton C. F. Trindade, Luis F. Arias-Giraldo, Luis Osorio-Olvera, A. Townsend Peterson y Marlon E. Cobos.

La documentación original contiene más opciones. Recomiendo revisarla!
:::

### Documentación original

-   [Página oficial de kuenm2](https://marlonecobos.github.io/kuenm2/)
-   [Guías completas del paquete](https://marlonecobos.github.io/kuenm2/articles/)
-   [Código fuente en GitHub](https://github.com/marlonecobos/kuenm2)
-   En R: `help(package = "kuenm2")`

::: source
El código de `kuenm2` se distribuye bajo licencia [GPL ≥ 3](https://github.com/marlonecobos/kuenm2/blob/main/DESCRIPTION).
:::

```{r}
#| eval: false

# install.packages("kuenm2")

```

## Sistema de estudio

[![](https://inaturalist-open-data.s3.amazonaws.com/photos/693781403/original.jpg){height="380px" fig-align="center"}](https://www.inaturalist.org/observations/379337549)

Lagartija espinosa azul yucateca (*Sceloporus serrifer*). Una especie de lagartija de la Peninsula de Yucatan.

-   Calibrar un modelo en el presente
-   Transferir el modelo al periodo 2040-2060
-   Revisar los resultados
-   Analizar el riesgo de extrapolación

## Insumos

### Descargar los datos en el siguiente enlace: [DESCARGAR](https://drive.google.com/file/d/1VWNTa52D9x-Nbb-d397cZiESmyvOa70F/view?usp=sharing)

### Cargamos los paquetes necesarios para la practica

```{r}
#| echo: true
library(kuenm2)
library(terra)
library(leaflet)
library(magrittr)
```

## 1. Limpieza básica de los datos

Antes de estimar un modelo debemos limpiar nuestros datos!

En esta sección:

-   inspeccionaremos los registros originales;
-   aplicaremos distintos criterios de limpieza;
-   compararemos los datos antes y después del proceso.

::: source
Sección adaptada de la guía oficial\
[Basic Data Cleaning](https://marlonecobos.github.io/kuenm2/articles/basic_data_cleaning.html).
:::

## Cargar los registros de presencia

```{r}
#| echo: true

occ_raw <- read.csv("occ_joint.csv")

head(occ_raw)
nrow(occ_raw)
```

## Seleccionar y renombrar columnas

```{r}
#| echo: true

occ <- occ_raw[, c(
  "scientific_name",
  "longitude",
  "latitude")]

names(occ) <- c("species", "longitude", "latitude")

head(occ)

```

## Cargar variables ambientales

```{r}
#| echo: true

variables <- rast(
  list.files(
    "M_var/set_1",
    pattern = ".tif",
    full.names = TRUE))

plot(variables)
```

## Definir el área de calibración

Construimos un buffer de 200 km alrededor de los registros y recortamos las variables ambientales.

```{r}
#| echo: true

# Convertir los registros en un objeto espacial
registros <- vect(occ, geom = c("longitude", "latitude"),
                  crs = "EPSG:4326")

# Proyectar a coordenadas en metros
registros_utm <- project(registros, "EPSG:32616")

# Crear un buffer de 200 km
M_buffer <- buffer(registros_utm, width = 200000)

# Unir los buffers
M_buffer <- aggregate(M_buffer)

# Regresar al CRS de las variables
M_buffer <- project(M_buffer, crs(variables))

# Recortar las variables
M_var <- crop(variables, M_buffer)

M_var <- mask(M_var, M_buffer)

plot(M_var)

```


## ¿Qué estamos asumiendo al definir M? {.reflexion}

Los ambientes que han sido accesibles para la especie, dónde se generan los puntos de fondo

### Si aumentamos el buffer a 500 km, ¿cambiará el modelo aunque las presencias sean las mismas?

::: {.fragment .respuesta}
Sí. Cambiarían los ambientes de fondo y, por lo tanto, el contraste utilizado para estimar las relaciones especie–ambiente.
:::

[![](https://github.com/kevinlopezreyes/kevinlopezreyes.github.io/blob/master/assets/images/transferencia/Captura%20de%20pantalla%202026-08-04%20083531.jpg?raw=true){height="400px"}](https://www.sciencedirect.com/science/article/pii/S0304380011000780)

## Limpieza básica de los registros

```{r}
#| echo: true

occ_clean <- initial_cleaning(
  data = occ,
  species = "species",
  x = "longitude",
  y = "latitude",
  remove_na = TRUE,
  remove_empty = TRUE,
  remove_duplicates = TRUE,
  by_decimal_precision = TRUE,
  decimal_precision = 2)

nrow(occ)
nrow(occ_clean)
```

## Eliminar registros duplicados por celda

Conservamos una sola presencia dentro de cada celda de las variables ambientales.

```{r}
#| echo: true

set.seed(123)

occ_clean_cell <- remove_cell_duplicates(
  data = occ_clean,
  x = "longitude",
  y = "latitude",
  raster_layer = M_var[[1]])

nrow(occ_clean)
nrow(occ_clean_cell)
```

## Registros antes y después de la limpieza

::: {style="width:90%; margin:40px auto 0 auto;"}
```{r}
#| echo: false

occ_plot <- occ[complete.cases(
  occ[, c("longitude", "latitude")]), ]

leaflet(
  width = "100%",
  height = "650px") %>%
  addTiles() %>%
  addCircleMarkers(
    data = occ_plot,
    lng = ~longitude,
    lat = ~latitude,
    color = "red",
    radius = 5,
    stroke = FALSE,
    fillOpacity = 0.5,
    group = "Registros originales") %>%
  addCircleMarkers(
    data = occ_clean_cell,
    lng = ~longitude,
    lat = ~latitude,
    color = "blue",
    radius = 4,
    stroke = FALSE,
    fillOpacity = 0.9,
    group = "Registros limpios") %>%
  addLayersControl(
    overlayGroups = c(
      "Registros originales",
      "Registros limpios"),
    options = layersControlOptions(
      collapsed = FALSE)) %>%
  addLegend(
    colors = c("red", "blue"),
    labels = c(
      "Registros originales",
      "Registros limpios: uno por celda")) %>%
  fitBounds(
    min(occ_plot$longitude),
    min(occ_plot$latitude),
    max(occ_plot$longitude),
    max(occ_plot$latitude))
```
:::

## 2. Preparación de los datos

`prepare_data()`:

-   extrae los valores ambientales de las presencias;
-   genera puntos de fondo dentro del área de calibración;
-   divide los registros para evaluar los modelos;
-   crea las combinaciones de parámetros que serán calibradas.

::: source
[Documentación de `prepare_data()`](https://marlonecobos.github.io/kuenm2/reference/prepare_data.html)
:::

## 2.1. Configuración

Utilizaremos:

-   algoritmo: **Maxnet**;
-   cuatro particiones;
-   1,000 puntos de fondo;
-   dos tipos de respuesta;
-   tres valores de regularización.

Esto produce **seis modelos candidatos**.

```{r}
#| echo: true

set.seed(123)

datos_calibracion <- prepare_data(
  algorithm = "maxnet",
  occ = occ_clean_cell,
  x = "longitude",
  y = "latitude",
  raster_variables = M_var,
  min_number = 4,
  species = "Sceloporus serrifer",
  partition_method = "kfolds",
  n_partitions = 4,
  n_background = 1000,
  features = c("l", "q"),
  r_multiplier = c(0.5, 1, 2))
```

## 2.2. Datos preparados

```{r}
#| echo: true

datos_calibracion
```

El resumen permite comprobar:

-   número de presencias y puntos de fondo;
-   variables utilizadas;
-   método de partición;
-   número de modelos candidatos.

## 3. Calibración de modelos

Los seis modelos candidatos serán evaluados utilizando cuatro criterios:

1. ausencia de curvas cóncavas;
2. tasa de omisión 10%;
3. significancia mediante ROC parcial;
4. menor complejidad mediante AICc.

## Respuestas concavas
"Concave (or bimodal) curves indicate that higher suitability is found at variable values around a point of lower suitability"

### No tienen tanto sentido biológico
[![](https://github.com/kevinlopezreyes/kevinlopezreyes.github.io/blob/master/assets/images/transferencia/Temperatura.jpg?raw=true){height="600px"}](287193944_The_distribution_of_the_endemic_plantPrimula_scandinavica_at_local_and_national_scales_in_changing_mountainous_environments)

## 3.1. Calibrar los modelos candidatos

```{r}
#| echo: true

calibracion <- calibration(
  data = datos_calibracion,
  remove_concave = TRUE,
  error_considered = 10,
  omission_rate = 10,
  parallel = FALSE,
  ncores = 1)

```

## 3.2. Modelos seleccionados

```{r}
#| echo: true

calibracion
```

```{r}
#| echo: true

calibracion$selected_models
```

Los modelos seleccionados:

- omiten menos del 10% de las presencias de evaluación;
- predicen mejor que un modelo aleatorio;
- presentan un delta AICc menor que 2.

::: source
[Documentación de calibración de `kuenm2`](https://marlonecobos.github.io/kuenm2/articles/model_calibration.html)
:::

## 4. Ajustar los modelos seleccionados

`fit_selected()` vuelve a ajustar las configuraciones seleccionadas utilizando:

- cuatro réplicas correspondientes a las particiones;.

```{r}
#| echo: true

modelos_finales <- fit_selected(
  calibration_results = calibracion,
  replicate_method = "kfolds",
  n_replicates = 4,
  type = "cloglog",
  progress_bar = FALSE,
  verbose = FALSE,
  seed = 123)
```

## 4.1. Modelos finales

```{r}
#| echo: true

modelos_finales
```

Cada configuración seleccionada contiene:

- cuatro modelos (particiones);
- un modelo completo ajustado con todos los datos.

## 4.2. Curvas de respuesta

Las curvas muestran cómo cambia la idoneidad estimada a lo largo de cada variable ambiental.

```{r}
#| echo: true
#| fig-width: 12
#| fig-height: 6.5
#| out-width: 90%
#| fig-align: center

all_response_curves(
  models = modelos_finales,
  show_variability = TRUE,
  show_lines = TRUE,
  extrapolate = FALSE,
  mfrow = c(2, 2),
  col = "skyblue4")
```

Las líneas verticales discontinuas delimitan los valores utilizados para ajustar los modelos.

## 4.3. Importancia de las variables

```{r}
#| echo: true

importancia <- variable_importance(
  models = modelos_finales,
  progress_bar = FALSE,
  verbose = FALSE)
```

```{r}
#| echo: true
#| fig-width: 10
#| fig-height: 6
#| out-width: 80%
#| fig-align: center

plot_importance(
  importancia,
  main = "Importancia de las variables")
```

::: source
[Guía de ajuste y exploración de modelos de `kuenm2`](https://marlonecobos.github.io/kuenm2/articles/fit_explore_models.html)
:::

## 5. Transferencia a un escenario futuro

### Cargar las variables climáticas futuras

Utilizaremos las condiciones proyectadas por **MIROC6** para el escenario **SSP5-8.5** durante **2041–2060**.

```{r}
#| echo: true

future_all <- rast("G_var/set_1/future/bios.tif")

G_future <- future_all[[c(1, 4, 12, 15)]]

names(G_future) <- names(M_var)

G_future
```

## Recortar las variables futuras

Las variables futuras se recortan utilizando la misma área empleada para calibrar el modelo.

```{r}
#| echo: true

G_var <- crop(G_future, M_buffer)

G_var <- mask(G_var, M_buffer)

G_var <- mask(G_var, M_var[[1]])

names(G_var) <- names(M_var)
plot(G_var)

```

## Verificar las variables

Los predictores presentes y futuros deben tener los mismos nombres

```{r}
#| echo: true

names(M_var)
names(G_var)

```

## ¿Por qué?

### Recordemos que la transferencia es proyectar una relación especies-clima estimada hacia otro escenario (region o tiempo)

### Esas relaciones están estimadas con unas variables especificas, por eso deben mantenerse iguales.

## Proyección en las condiciones actuales

```{r}
#| echo: true

prediccion_actual <- predict_selected(models = modelos_finales,
  new_variables = M_var,
  type = "cloglog",
  consensus = "mean",
  extrapolation_type = "NE",
  progress_bar = FALSE)

mapa_actual <- prediccion_actual$General_consensus$mean
plot(mapa_actual)
```

## Idoneidad ambiental actual

```{r}
#| echo: false
#| fig-width: 12
#| fig-height: 6.5
#| fig-align: center

plot(mapa_actual, col = hcl.colors(100, "YlOrRd", rev = TRUE), range = c(0, 1),
  main = "Condiciones actuales")

points(occ_clean_cell$longitude, occ_clean_cell$latitude, pch = 20, cex = 0.8)

```

## Procedimientos de transferencia

Cuando las condiciones de la región de transferencia exceden los rangos ambientales de calibración, podemos utilizar tres procedimientos:

- Extrapolación libre — E: 
Las respuestas estimadas continúan fuera del rango de calibración.

- Extrapolación con clamping — EC:
Los valores ambientales que exceden el rango se sustituyen por el límite mínimo o máximo conocido.

- No extrapolación o truncamiento — NE:
Las celdas con al menos una variable fuera del rango de calibración reciben idoneidad cero.

Dentro de los rangos de calibración, los tres procedimientos producen la misma predicción.


[![](https://github.com/kevinlopezreyes/kevinlopezreyes.github.io/blob/master/assets/images/tra_proc.jpg?raw=true){height="380px" fig-align="center"}](https://www.sciencedirect.com/science/article/pii/S0304380013002159)

## ¿Por qué no simplemente incrementamos el area de calibración?

## ¿Por qué no simplemente incrementamos el area de calibración?
- Si usamos una metrica dependiente de umbral, puede incrementar las metricas de evalución
- Le estamos diciendo al modelo que la especie pudo muestrear esos ambientes y no está ahí porque no es favorable, lo cual **no es cierto**

## Transferencia al futuro

Realizaremos la transferencia utilizando los tres procedimientos:

- **E:** extrapolación libre.
- **EC:** extrapolación con *clamping*.
- **NE:** sin extrapolación.

```{r}
#| echo: true

prediccion_E <- predict_selected(
  models = modelos_finales,
  new_variables = G_var,
  type = "cloglog",
  consensus = "mean",
  extrapolation_type = "E",
  progress_bar = FALSE)

prediccion_EC <- predict_selected(
  models = modelos_finales,
  new_variables = G_var,
  type = "cloglog",
  consensus = "mean",
  extrapolation_type = "EC",
  progress_bar = FALSE)

prediccion_NE <- predict_selected(
  models = modelos_finales,
  new_variables = G_var,
  type = "cloglog",
  consensus = "mean",
  extrapolation_type = "NE",
  progress_bar = FALSE)
```

## Obtener las predicciones

```{r}
#| echo: true

mapa_E  <- prediccion_E$General_consensus$mean
mapa_EC <- prediccion_EC$General_consensus$mean
mapa_NE <- prediccion_NE$General_consensus$mean
```

## Comparación de los procedimientos

```{r}
#| echo: false
#| fig-width: 13
#| fig-height: 7
#| fig-align: center

mapas <- c(mapa_actual, mapa_E, mapa_EC, mapa_NE)

names(mapas) <- c("Presente", "Futuro: extrapolación", "Futuro: clamping",
                  "Futuro: sin extrapolación")

plot(mapas, col = hcl.colors(100, "YlOrRd", rev = TRUE),
  range = c(0, 1),
  nc = 2)

```

## Cambios entre presente y futuro

Compararemos las áreas que permanecen adecuadas, se pierden o se ganan bajo cada procedimiento.

```{r}
#| echo: true

cambios_E <- prediction_changes(
  current_predictions = mapa_actual,
  new_predictions = mapa_E,
  fitted_models = modelos_finales,
  predicted_to = "future")

cambios_EC <- prediction_changes(
  current_predictions = mapa_actual,
  new_predictions = mapa_EC,
  fitted_models = modelos_finales,
  predicted_to = "future")

cambios_NE <- prediction_changes(
  current_predictions = mapa_actual,
  new_predictions = mapa_NE,
  fitted_models = modelos_finales,
  predicted_to = "future")
```

## Cambios en la idoneidad ambiental

```{r}
#| echo: false
#| fig-width: 13
#| fig-height: 5.5
#| fig-align: center

cambios <- c(cambios_E, cambios_EC, cambios_NE)

names(cambios) <- c("Extrapolación", "Clamping", "Sin extrapolación")

plot(cambios, nc = 3)
```

## Guardar los resultados

```{r}
#| echo: true

dir.create("Resultados", showWarnings = FALSE)

writeRaster(mapas, "Resultados/predicciones.tif", overwrite = TRUE)

writeRaster(cambios, "Resultados/cambios.tif", overwrite = TRUE)
```

## 6. Riesgo de extrapolación

Al transferir el modelo hacia condiciones futuras pueden aparecer ambientes que no estuvieron representados durante la calibración.

El análisis **MOP** permite identificar:

- celdas con condiciones ambientales fuera de los rangos de calibración;
- número de variables fuera de esos rangos;
- disimilitud entre las condiciones futuras y las condiciones de calibración.

::: source
[Owens et al. (2013)](https://doi.org/10.1016/j.ecolmodel.2013.04.011) y [documentación de kuenm2](https://marlonecobos.github.io/kuenm2/).
:::

## ¿Qué identifica el MOP?

MOP compara las condiciones ambientales de **calibración** con las condiciones del escenario de **transferencia**.

Las condiciones de transferencia que quedan fuera de los rangos observados durante la calibración representan **extrapolación estricta**.

[![](https://biogeography.pensoft.net/showimg/oo_1141301.jpg){height="500px" fig-align="center"}](https://biogeography.pensoft.net/article/132916/)

::: source
Información de [Owens et al. (2013)](https://doi.org/10.1016/j.ecolmodel.2013.04.011), disponible también en la [documentación de smop](https://luismurao.github.io/smop/).
:::

## Calcular el MOP

```{r}
#| echo: true

MOP_futuro <- single_mop(
  data = modelos_finales,
  new_variables = G_var,
  subset_variables = TRUE,
  type = "detailed",
  na_in_range = FALSE,
  calculate_distance = TRUE,
  where_distance = "all",
  distance = "euclidean",
  scale = TRUE,
  center = TRUE,
  rescale_distance = TRUE,
  progress_bar = FALSE
)
```

## Condiciones no análogas

```{r}
#| echo: true
#| fig-width: 13
#| fig-height: 5
#| fig-align: center

par(mfrow = c(1, 3))

plot(MOP_futuro$mop_basic, main = "Condiciones no análogas", 
     col = c("grey90", "#D55E00"), axes = FALSE)

plot(MOP_futuro$mop_simple, main = "Variables fuera del rango", 
     col = hcl.colors(8, "YlOrRd"), axes = FALSE)

plot(MOP_futuro$mop_distances, main = "Disimilitud ambiental", 
     col = hcl.colors(100, "Inferno"), axes = FALSE)

par(mfrow = c(1, 1))
```

- **MOP básico:** identifica celdas con al menos una variable fuera del rango de calibración.
- **MOP simple:** indica cuántas variables están fuera de sus rangos.
- **Distancia ambiental:** indica qué tan diferentes son las condiciones futuras.

## Valores superiores al rango de calibración

```{r}
#| echo: true
#| fig-width: 12
#| fig-height: 6
#| fig-align: center

plot(
  MOP_futuro$mop_detailed$towards_high_end,
  main = paste(names(G_var), "por encima"),
  col = c("grey90", "#D55E00"),
  nc = 2,
  axes = FALSE)
```

Las celdas resaltadas presentan valores futuros superiores al máximo utilizado durante la calibración.

## Valores inferiores al rango de calibración

```{r}
#| echo: true
#| fig-width: 12
#| fig-height: 6
#| fig-align: center

plot(
  MOP_futuro$mop_detailed$towards_low_end,
  main = paste(names(G_var), "por debajo"),
  col = c("grey90", "#0072B2"),
  nc = 2,
  axes = FALSE
)
```

Las celdas resaltadas presentan valores futuros inferiores al mínimo utilizado durante la calibración.

## Interpretación del MOP

MOP identifica las regiones donde la transferencia ocurre bajo condiciones ambientales no representadas durante la calibración.

En esas regiones:
- **E:** el modelo continúa sus respuestas fuera del rango;
- **EC:** los valores se limitan al mínimo o máximo conocido;
- **NE:** las celdas fuera del rango reciben idoneidad cero.

MOP indica dónde existe **riesgo de extrapolación** y la predicción debe interpretarse con mayor precaución.

## ¿Por qué algunas predicciones son mejores que otras?
### ¿Es posible mejorar las predicciones?

[![](https://github.com/kevinlopezreyes/kevinlopezreyes.github.io/blob/master/assets/images/transferencia/Captura%20de%20pantalla%202026-08-04%20100056.jpg?raw=true){height="500px" fig-align="center"}](https://github.com/kevinlopezreyes/kevinlopezreyes.github.io/blob/master/assets/images/transferencia/Captura%20de%20pantalla%202026-08-04%20100056.jpg?raw=true)

## ¿Por qué algunas predicciones son mejores que otras?
### ¿Es posible mejorar las predicciones?
[![](https://github.com/kevinlopezreyes/kevinlopezreyes.github.io/blob/master/assets/images/transferencia/Captura%20de%20pantalla%202026-08-04%20100139.jpg?raw=true){height="500px" fig-align="center"}](https://github.com/kevinlopezreyes/kevinlopezreyes.github.io/blob/master/assets/images/transferencia/Captura%20de%20pantalla%202026-08-04%20100139.jpg?raw=true)








