Taller 4: Interpolación espacial con kriging en la Región de Coquimbo

Author

Victor Contreras, Cristian Aguirre y Christian Chacon

Published

October 16, 2023

Taller 4: Interpolación espacial con kriging en la Región de Coquimbo

1. Introducción

El siguiente laboratorio expone la comparación de dos métodos de interpolación espacial utilizando técnicas geostadísticas de kriging ordinario (OK) y regresión-kriging (RK), para determinar el comportamiento de temperaturas para los meses: enero, junio, octubre y diciembre en la Región de Coquimbo en el año 2023. Cabe señalar que las diferencias entre el OK y el RK, es que este ultimo es una técnica de interpolación espacial que combina una regresión lineal o múltiple de la variable dependiente en predictores y de los kriging de los residuos de predicción (Hengl et al, 2007).

2. Objetivos

Objetivos - Generar la interpolación espacial sobre los datos de temperatura para la Región de Coquimbo en los meses: enero, junio, octubre y diciembre, utilizando las técnicas geostadísticas de kriging ordinario y regresión-kriging.

  • Extraer las métricas de RMSE y R², utilizando la validación cruzada leave-one-out, con el propósito de establecer el mes donde se obtuvo la mejor predicción y performance de los valores de temperatura de la región.

3. Desarrollo

3.1. Preparación de datos

library(remotes) #paquete que trae función para instala un paquete desde github
library(tidyverse) #colección de paquetes para análisis de datos
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.1
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(sf) #manejo de datos vectoriales
Linking to GEOS 3.12.1, GDAL 3.8.4, PROJ 9.3.1; sf_use_s2() is TRUE
library(terra) #manejo de datos raster y vectoriales
terra 1.7.78

Adjuntando el paquete: 'terra'

The following object is masked from 'package:tidyr':

    extract
library(tmap) # creación de mapas temáticos
Breaking News: tmap 3.x is retiring. Please test v4, e.g. with
remotes::install_github('r-tmap/tmap')
library(geodata) # acceso a descarga de diferentes datos raster y vectoriales
library(rstac) # acceder a spatial temporal assets catalogs (STAC)
library(psych) # para estadistica

Adjuntando el paquete: 'psych'

The following objects are masked from 'package:terra':

    describe, distance, rescale

The following objects are masked from 'package:ggplot2':

    %+%, alpha
library(gt) #pquete para la creación de tablas
library(dplyr) #para manejo de dataframe
library(stars) #para tratamiento de matrices espaciotemporales
Cargando paquete requerido: abind
library(abind) #aplica combinación de matrices multidimiensionales
library(gstat) # Modelado, prediccion y simulación geoestadistica
library(spdep) #dependencia espacial: esquemas de ponderación, estadisticas
Cargando paquete requerido: spData
To access larger datasets in this package, install the spDataLarge
package with: `install.packages('spDataLarge',
repos='https://nowosad.github.io/drat/', type='source')`
library(sp) #clases y metodos para datos espaciales
library(units) # unidades de medida para vectores R
udunits database from C:/Users/criaguirre/AppData/Local/Programs/R/R-4.4.1/library/units/share/udunits/udunits2.xml
library(viridis)
Cargando paquete requerido: viridisLite
library(viridisLite)
library(spData)
library(raster)

Adjuntando el paquete: 'raster'

The following object is masked from 'package:dplyr':

    select
library(purrr)
library(stars)
library(raster)
library(ggplot2)
library(patchwork)

Adjuntando el paquete: 'patchwork'

The following object is masked from 'package:raster':

    area

The following object is masked from 'package:terra':

    area
# Directorio
setwd("~/00_tallegeo/taller01_geost")

# Base de datos
data_df <- read_rds('data/procesada/data_temp_con_predictores_Coq.rds') # vectorial puntos
predictorias_ras <- rast('data/raw/predictorias/predictores_Coq.tif') # raster
reg_coq_utm <- read_rds('data/raw/region_coquimbo.rds') # vectorial poligono
reg_coq_utm <- reg_coq_utm |> 
  st_transform(32719)
reg_coq_geo <- reg_coq_utm |> 
  st_transform(4326)

# Filtrar datos vectoriales por mes

data_ene_df <- data_df[data_df$mes == 1, c("station_id", "temp", "dem", "aspect", "slope", "dist_costa", "ndvi_ene", "lst_ene", "geometry")]
data_jun_df <- data_df[data_df$mes == 6, c("station_id", "temp", "dem", "aspect", "slope", "dist_costa", "ndvi_jun", "lst_jun", "geometry")]
data_oct_df <- data_df[data_df$mes == 10, c("station_id", "temp", "dem", "aspect", "slope", "dist_costa", "ndvi_oct", "lst_oct", "geometry")]
data_dic_df <- data_df[data_df$mes == 12, c("station_id", "temp", "dem", "aspect", "slope", "dist_costa", "ndvi_dic", "lst_dic", "geometry")]

# filtrar datos raster por mes

pred_ene_ras <- subset(predictorias_ras, c("dem", "aspect", "slope", "dist_costa", "ndvi_ene", "lst_ene"))
pred_st_ene <- pred_ene_ras |> st_as_stars() |> split('band')

pred_jun_ras <- subset(predictorias_ras, c("dem", "aspect", "slope", "dist_costa", "ndvi_jun", "lst_jun"))
pred_st_jun <- pred_jun_ras |> st_as_stars() |> split('band')

pred_oct_ras <- subset(predictorias_ras, c("dem", "aspect", "slope", "dist_costa", "ndvi_oct", "lst_oct"))
pred_st_oct <- pred_oct_ras |> st_as_stars() |> split('band')

pred_dic_ras <- subset(predictorias_ras, c("dem", "aspect", "slope", "dist_costa", "ndvi_dic", "lst_dic"))
pred_st_dic <- pred_dic_ras |> st_as_stars() |> split('band')

Se extraen los variogramas ajustados guardados del taller anterior.

fitv_ene <- readRDS('C:/Users/criaguirre/Documents/00_tallegeo/taller01_geost/SalidaTaller3/Variogramas/fitv_ene_variogram.rds')
fitv_jun <- readRDS('C:/Users/criaguirre/Documents/00_tallegeo/taller01_geost/SalidaTaller3/Variogramas/fitv_jun_variogram.rds')
fitv_oct <- readRDS('C:/Users/criaguirre/Documents/00_tallegeo/taller01_geost/SalidaTaller3/Variogramas/fitv_oct_variogram.rds')
fitv_dic <- readRDS('C:/Users/criaguirre/Documents/00_tallegeo/taller01_geost/SalidaTaller3/Variogramas/fitv_dic_variogram.rds')

Se extraen los variogramas residuales del modelamiento regresión lineal (TSF):

res_ene <- readRDS('C:/Users/criaguirre/Documents/00_tallegeo/taller01_geost/SalidaTaller3/Variogramas/res_ene_variogram.rds')
res_jun <- readRDS('C:/Users/criaguirre/Documents/00_tallegeo/taller01_geost/SalidaTaller3/Variogramas/res_jun_variogram.rds')
res_oct <- readRDS('C:/Users/criaguirre/Documents/00_tallegeo/taller01_geost/SalidaTaller3/Variogramas/res_oct_variogram.rds')
res_dic <- readRDS('C:/Users/criaguirre/Documents/00_tallegeo/taller01_geost/SalidaTaller3/Variogramas/res_dic_variogram.rds')

3.2. Interpolación con Kiging Oridnario

Interpolación con kriging ordinario con ayuda de los variogramas ajustados para cada mes

#Enero
temp_ok_ene <- krige(temp~1, data_ene_df, pred_st_ene, fitv_ene)
[using ordinary kriging]
temp_ok_ene <- rast(temp_ok_ene)

#Junio
temp_ok_jun <- krige(temp~1, data_jun_df, pred_st_jun, fitv_jun)
[using ordinary kriging]
temp_ok_jun <- rast(temp_ok_jun)

#Octubre
temp_ok_oct <- krige(temp~1, data_oct_df, pred_st_oct, fitv_oct)
[using ordinary kriging]
temp_ok_oct <- rast(temp_ok_oct)

# Diciembre
temp_ok_dic <- krige(temp~1, data_dic_df, pred_st_dic, fitv_dic)
[using ordinary kriging]
temp_ok_dic <- rast(temp_ok_dic)

Se obtiene una validación cruzada con el método Leave-one-out

temp_ok_loovc_ene <- krige.cv(temp~1, data_ene_df, fitv_ene)
temp_ok_loovc_jun <- krige.cv(temp~1, data_jun_df, fitv_jun) 
temp_ok_loovc_oct <- krige.cv(temp~1, data_oct_df, fitv_oct) 
temp_ok_loovc_dic <- krige.cv(temp~1, data_dic_df, fitv_dic) 

Obtención de las métricas de Ordinary Kriging

rmse_ok_ene <- sqrt(sum(temp_ok_loovc_ene$residual^2)/dim(temp_ok_loovc_ene)[1])
r2_ok_ene <- cor(temp_ok_loovc_ene$var1.pred,temp_ok_loovc_ene$observed)^2


# Definir los valores
mes <- "ene_ok"
rmse <- rmse_ok_ene
r2 <- r2_ok_ene

# Crear el dataframe
metric_ok_ene <- data.frame(
  mes = mes,
  rmse = rmse,
  r2 = r2
)

# Ver el resultado
print(metric_ok_ene)
     mes     rmse        r2
1 ene_ok 3.253914 0.3003487
rmse_ok_jun <- sqrt(sum(temp_ok_loovc_jun$residual^2)/dim(temp_ok_loovc_jun)[1])
r2_ok_jun <- cor(temp_ok_loovc_jun$var1.pred,temp_ok_loovc_jun$observed)^2

# Definir los valores
mes <- "jun_ok"
rmse <- rmse_ok_jun
r2 <- r2_ok_jun

# Crear el dataframe
metric_ok_jun <- data.frame(
  mes = mes,
  rmse = rmse,
  r2 = r2
)

# Ver el resultado
print(metric_ok_jun)
     mes     rmse        r2
1 jun_ok 2.978024 0.3254088
rmse_ok_oct <- sqrt(sum(temp_ok_loovc_oct$residual^2)/dim(temp_ok_loovc_oct)[1])
r2_ok_oct <- cor(temp_ok_loovc_oct$var1.pred,temp_ok_loovc_oct$observed)^2

# Definir los valores
mes <- "oct_ok"
rmse <- rmse_ok_oct
r2 <- r2_ok_oct

# Crear el dataframe
metric_ok_oct <- data.frame(
  mes = mes,
  rmse = rmse,
  r2 = r2
)

# Ver el resultado
print(metric_ok_oct)
     mes     rmse        r2
1 oct_ok 2.898769 0.5148232
rmse_ok_dic <- sqrt(sum(temp_ok_loovc_dic$residual^2)/dim(temp_ok_loovc_dic)[1])
r2_ok_dic <- cor(temp_ok_loovc_dic$var1.pred,temp_ok_loovc_dic$observed)^2

# Definir los valores
mes <- "dic_ok"
rmse <- rmse_ok_dic
r2 <- r2_ok_dic

# Crear el dataframe
metric_ok_dic <- data.frame(
  mes = mes,
  rmse = rmse,
  r2 = r2
)

# Ver el resultado
print(metric_ok_dic)
     mes     rmse        r2
1 dic_ok 2.099784 0.4449806

Unificar las métricas en un solo dataframe

# Unir los dataframes
metric_all_ok <- rbind(metric_ok_ene, metric_ok_jun, metric_ok_oct, metric_ok_dic)

# Ver el resultado
print(metric_all_ok)
     mes     rmse        r2
1 ene_ok 3.253914 0.3003487
2 jun_ok 2.978024 0.3254088
3 oct_ok 2.898769 0.5148232
4 dic_ok 2.099784 0.4449806

A continuación, se presenta una comparación de las métricas por mes del Ordinary Kriging

metric_all_ok |>
  pivot_longer(-mes) |>
  ggplot(aes(mes, value, fill = mes)) +  
  geom_col(alpha = .7) +
  geom_text(aes(label = round(value, 2)),  # Etiquetas con los valores redondeados a 2 decimales
            position = position_stack(vjust = 0.5),  # Coloca el texto en el centro de la barra
            color = "black",  # Color del texto
            size = 3.5) +     # Tamaño del texto
  coord_flip() +
  facet_grid(. ~ name, scales = 'free') +
  scale_fill_manual(
    name = "Meses de Predicción", 
    labels = c("ene_ok" = "Enero", "jun_ok" = "Junio", "oct_ok" = "Octubre", "dic_ok" = "Diciembre"),  
    values = c("ene_ok" = "blue", "jun_ok" = "green", "oct_ok" = "red", "dic_ok" = "purple")  
  ) +
  labs(
    title = "Métricas de interpolación con Ordinary Kriging", 
    x = "Meses de Modelamiento",  
    y = "Valor de Métrica"  
  ) +
  theme_bw() + 
  theme(
    plot.title = element_text(hjust = 0.5, size = 14, face = "bold"), 
    legend.position = "right"  
  )

Según el gráfico, octubre presenta el valor de R² más alto, lo que significa que el modelo de kriging logra explicar el 51% de la variabilidad de la temperatura en ese mes. Esto indica un ajuste relativamente bueno en comparación con los demás meses. Le sigue diciembre, con un R² de 0.44, lo que sugiere que el modelo también tiene un buen desempeño explicando la variabilidad de la temperatura en este periodo. En cambio, junio y enero muestran valores más bajos, con el modelo explicando alrededor del 30% de la variabilidad de la temperatura en esos meses. Esto indica que el modelo tiene más dificultades para capturar la variabilidad de la temperatura en junio y enero, lo cual podría deberse a una mayor complejidad en los patrones espaciales o a una variabilidad alta a corta distancia, probablemente causada por cambios abruptos en la geografía.

En cuanto a los valores de RMSE, diciembre registra el valor más bajo, de 2.1, lo que sugiere que las predicciones del modelo son más cercanas a los valores observados, indicando una mayor precisión en la interpolación de las temperaturas para este mes. Octubre y junio tienen valores de RMSE similares (2.9 y 2.98 respectivamente), lo que refleja una precisión moderada en ambos meses. Por otro lado, enero presenta el mayor RMSE, de 3.25, lo que indica que las predicciones del modelo para este mes tienen un error promedio más alto. Esto sugiere que enero es un mes más difícil de modelar debido a la complejidad de la variabilidad espacial de las temperaturas.

3.3. Regresion Kriging

Interpolación con Regresion Kriging se consideran los variograma de los residuos obtenido con el modelamiento de regresión lineal del taller 2 y 3.

A continuación, se genera la preduccióon con Regresion Kriging:

#Enero
temp_rk_ene <- krige(
                      temp~dem+aspect+slope+dist_costa+ndvi_ene+lst_ene,
                      data_ene_df, 
                      pred_st_ene,
                      res_ene)
[using universal kriging]
temp_rk_ene <- rast(temp_rk_ene)

#Junio
temp_rk_jun <- krige(
                      temp~dem+aspect+slope+dist_costa+ndvi_jun+lst_jun,
                      data_jun_df, 
                      pred_st_jun,
                      res_jun)
[using universal kriging]
temp_rk_jun <- rast(temp_rk_jun)

#Octubre
temp_rk_oct <- krige(
                      temp~dem+aspect+slope+dist_costa+ndvi_oct+lst_oct,
                      data_oct_df, 
                      pred_st_oct,
                      res_oct)
[using universal kriging]
temp_rk_oct <- rast(temp_rk_oct)

#Diciembre
temp_rk_dic <- krige(
                      temp~dem+aspect+slope+dist_costa+ndvi_dic+lst_dic,
                      data_dic_df, 
                      pred_st_dic,
                      res_dic)
[using universal kriging]
temp_rk_dic <- rast(temp_rk_dic)

Se aplica una validación cruzada Leave-one-out

temp_rk_loocv_ene <- krige.cv(temp~dem+aspect+slope+dist_costa+ndvi_ene+lst_ene,data_ene_df,
                           res_ene)

temp_rk_loocv_jun <- krige.cv(temp~dem+aspect+slope+dist_costa+ndvi_jun+lst_jun,data_jun_df,
                           res_jun)

temp_rk_loocv_oct <- krige.cv(temp~dem+aspect+slope+dist_costa+ndvi_oct+lst_oct,data_oct_df,
                           res_oct)

temp_rk_loocv_dic <- krige.cv(temp~dem+aspect+slope+dist_costa+ndvi_dic+lst_dic,data_dic_df,
                           res_dic)

Se calculan las métricas

rmse_rk_ene <- sqrt(sum(temp_rk_loocv_ene$residual^2)/dim(temp_rk_loocv_ene)[1])
r2_rk_ene <- cor(temp_rk_loocv_ene$var1.pred,temp_rk_loocv_ene$observed)^2

# Definir los valores
mes <- "ene_rk"
rmse <- rmse_rk_ene
r2 <- r2_rk_ene

# Crear el dataframe
metric_rk_ene <- data.frame(
  mes = mes,
  rmse = rmse,
  r2 = r2
)

# Ver el resultado
print(metric_rk_ene)
     mes     rmse        r2
1 ene_rk 2.355988 0.6327346
rmse_rk_jun <- sqrt(sum(temp_rk_loocv_jun$residual^2)/dim(temp_rk_loocv_jun)[1])
r2_rk_jun <- cor(temp_rk_loocv_jun$var1.pred,temp_rk_loocv_jun$observed)^2

# Definir los valores
mes <- "jun_rk"
rmse <- rmse_rk_jun
r2 <- r2_rk_jun

# Crear el dataframe
metric_rk_jun <- data.frame(
  mes = mes,
  rmse = rmse,
  r2 = r2
)

# Ver el resultado
print(metric_rk_jun)
     mes     rmse        r2
1 jun_rk 1.582512 0.8043488
rmse_rk_oct <- sqrt(sum(temp_rk_loocv_oct$residual^2)/dim(temp_rk_loocv_oct)[1])
r2_rk_oct <- cor(temp_rk_loocv_oct$var1.pred,temp_rk_loocv_oct$observed)^2

# Definir los valores
mes <- "oct_rk"
rmse <- rmse_rk_oct
r2 <- r2_rk_oct

# Crear el dataframe
metric_rk_oct <- data.frame(
  mes = mes,
  rmse = rmse,
  r2 = r2
)

# Ver el resultado
print(metric_rk_oct)
     mes     rmse        r2
1 oct_rk 2.146992 0.7360454
rmse_rk_dic <- sqrt(sum(temp_rk_loocv_dic$residual^2)/dim(temp_rk_loocv_dic)[1])
r2_rk_dic <- cor(temp_rk_loocv_dic$var1.pred,temp_rk_loocv_dic$observed)^2

# Definir los valores
mes <- "dic_rk"
rmse <- rmse_rk_dic
r2 <- r2_rk_dic

# Crear el dataframe
metric_rk_dic <- data.frame(
  mes = mes,
  rmse = rmse,
  r2 = r2
)

# Ver el resultado
print(metric_rk_dic)
     mes    rmse        r2
1 dic_rk 1.90588 0.5492359

Se une en un solo dataframe las métricas.

# Unir los dataframes
metric_all_rk <- rbind(metric_rk_ene, metric_rk_jun, metric_rk_oct, metric_rk_dic)

# Ver el resultado
print(metric_all_rk)
     mes     rmse        r2
1 ene_rk 2.355988 0.6327346
2 jun_rk 1.582512 0.8043488
3 oct_rk 2.146992 0.7360454
4 dic_rk 1.905880 0.5492359

Se genera un gráfico para las métricas del Regresion Kriging

metric_all_rk |>
  pivot_longer(-mes) |>
  ggplot(aes(mes, value, fill = mes)) +  
  geom_col(alpha = .7) +
  geom_text(aes(label = round(value, 2)),  # Etiquetas con los valores redondeados a 2 decimales
            position = position_stack(vjust = 0.5),  # Coloca el texto en el centro de la barra
            color = "black",  # Color del texto
            size = 3.5) +     # Tamaño del texto
  coord_flip() +
  facet_grid(. ~ name, scales = 'free') +
  scale_fill_manual(
    name = "Meses de Predicción", 
    labels = c("ene_rk" = "Enero", "jun_rk" = "Junio", "oct_rk" = "Octubre", "dic_rk" = "Diciembre"),  
    values = c("ene_rk" = "blue", "jun_rk" = "green", "oct_rk" = "red", "dic_rk" = "purple")  
  ) +
  labs(
    title = "Métricas de interpolación con Regresion Kriging", 
    x = "Meses de Modelamiento",  
    y = "Valor de Métrica"  
  ) +
  theme_bw() + 
  theme(
    plot.title = element_text(hjust = 0.5, size = 14, face = "bold"), 
    legend.position = "right"  
  )

Según el gráfico, junio destaca con el valor de R² más alto (0.8), lo que significa que el modelo de regresión kriging puede explicar el 80% de la variabilidad de la temperatura en este mes. Esto sugiere que el modelo ofrece un ajuste muy preciso para predecir la temperatura durante este periodo. Le sigue octubre, con un R² de 0.74, lo que también refleja un buen desempeño del modelo, explicando la mayor parte de la variabilidad de la temperatura en ese mes. Por otro lado, enero y diciembre tienen valores de R² más bajos, de 0.63 y 0.55 respectivamente, lo que indica que, aunque el ajuste es aceptable, el modelo tiene una menor capacidad para explicar la variabilidad de la temperatura en estos meses en comparación con junio y octubre.

En cuanto al error de las predicciones, junio también presenta el valor de RMSE más bajo, con 1.58, lo que significa que las predicciones del modelo para este mes son muy precisas, con un margen de error pequeño. Esto coincide con su alto valor de R². Diciembre le sigue con un RMSE de 1.91, lo que sugiere buenas predicciones, aunque no tan precisas como las de junio. Octubre, con un RMSE de 2.15, muestra un error un poco mayor, aunque sigue siendo razonable. Finalmente, enero tiene el valor de RMSE más alto de 2.36, lo que indica que las predicciones del modelo para este mes son menos precisas y tienen un mayor margen de error en comparación con los otros meses.

Para comparar las métricas de ambos Kriging, se confecciona un solo gráfico.

metric_all_ok2 <- rbind(metric_ok_ene, metric_ok_jun, metric_ok_oct, metric_ok_dic)
metric_all_rk2 <- rbind(metric_rk_ene, metric_rk_jun, metric_rk_oct, metric_rk_dic)

metric_all <- rbind(metric_all_ok2, metric_all_rk2)
metric_all |>
  pivot_longer(-mes) |>
  ggplot(aes(mes, value, fill = mes)) +  
  geom_col(alpha = .7) +
  geom_text(aes(label = round(value, 2)),  # Etiquetas con los valores redondeados a 2 decimales
            position = position_stack(vjust = 0.5),  # Coloca el texto en el centro de la barra
            color = "black",  # Color del texto
            size = 3.5) +     # Tamaño del texto
  coord_flip() +
  facet_grid(. ~ name, scales = 'free') +
  scale_fill_manual(
    name = "Meses de Predicción", 
    labels = c("ene_rk" = "Enero RK", "jun_rk" = "Junio RK", "oct_rk" = "Octubre RK", "dic_rk" = "Diciembre RK", "ene_ok" = "Enero OK", "jun_ok" = "Junio OK", "oct_ok" = "Octubre OK", "dic_ok" = "Diciembre OK"),  
    values = c("ene_rk" = "blue", "jun_rk" = "green", "oct_rk" = "red", "dic_rk" = "purple", "ene_ok" = "blue", "jun_ok" = "green", "oct_ok" = "red", "dic_ok" = "purple")  
  ) +
  labs(
    title = "Métricas de interpolación con Kriging", 
    x = "Meses de Modelamiento",  
    y = "Valor de Métrica"  
  ) +
  theme_bw() + 
  theme(
    plot.title = element_text(hjust = 0.5, size = 14, face = "bold"), 
    legend.position = "right"  
  )

De acuerdo con este gráfico, se observan fenómenos interesantes. Los meses que inicialmente mostraron un rendimiento regular con el método de Ordinary Kriging (OK) obtuvieron un rendimiento notablemente mejor al utilizar Regresion Kriging (RK). De hecho, en algunos casos, el desempeño de RK superó incluso al de los meses que inicialmente tenían las mejores métricas con OK. A continuación, se presenta una descripción general de estos resultados.

Enero: En enero, el R² mejora de 0.3 con OK a 0.63 con RK, mostrando una mejora significativa, aunque no tan marcada como en otros meses. El RMSE también se reduce considerablemente, pasando de 3.25 con OK a 2.36 con RK. Esto sugiere que la variabilidad de la temperatura en enero podría estar influenciada por factores adicionales, como la altitud o condiciones climáticas específicas, que RK es capaz de captar de forma más efectiva.

Junio: El método RK muestra un R² de 0.80, mucho más alto que el 0.33 obtenido con OK (kriging ordinario). Esto significa que RK es capaz de explicar el 80% de la variabilidad de la temperatura, mientras que OK solo captura un 33%. Además, el RMSE disminuye considerablemente al usar RK (1.58 frente a 2.98 con OK), lo que indica una reducción significativa en el margen de error de las predicciones. Esto sugiere que las variables adicionales utilizadas por RK, como covariables, aportan información útil que mejora la precisión del modelo, permitiendo una mejor representación de la variabilidad espacial de la temperatura en junio.

Octubre: En octubre, el R² mejora de 0.51 con OK a 0.74 con RK, lo que muestra un ajuste mucho mejor cuando se usan covariables. El RMSE baja de 2.9 con OK a 2.15 con RK, lo que significa que las predicciones se vuelven más precisas. Este aumento en el rendimiento de RK sugiere que en octubre hay factores adicionales, como la topografía o la vegetación, que son mejor capturados cuando se incluyen como variables explicativas, algo que OK no puede hacer por sí solo.

Diciembre: En diciembre, el R² pasa de 0.44 con OK a 0.55 con RK, lo que indica una mejor capacidad del modelo para explicar la variabilidad de la temperatura. El RMSE disminuye de 2.1 con OK a 1.91 con RK, lo que refleja una mayor precisión en las predicciones. Aunque la mejora no es tan notable como en otros meses, RK sigue superando a OK, probablemente gracias a la inclusión de covariables que aportan información adicional sobre la distribución de la temperatura.

En general, RK tiene una mejoría notable tanto en el ajuste del modelo como en la precisión de éste, probablemente ligado a la inclusión de covariables que explican de manera más efectiva la variabilidad de la temperatura.

3.4. Mapas comparativos

A continuación, se generan mapas para comparar la superficie generada por ambos modelos y tambien la varianza de los valores por mes.

# Extraer las capas de predicción y varianza
#Predicciones con Ordinary Kriging
pred_ok_ene <- subset(temp_ok_ene, "var1.pred_var1.pred")
pred_ok_jun <- subset(temp_ok_jun, "var1.pred_var1.pred")
pred_ok_oct <- subset(temp_ok_oct, "var1.pred_var1.pred")
pred_ok_dic <- subset(temp_ok_dic, "var1.pred_var1.pred")

#Predicciones con Regresion Kriging
pred_rk_ene <- subset(temp_rk_ene, "var1.pred_var1.pred")
pred_rk_jun <- subset(temp_rk_jun, "var1.pred_var1.pred")
pred_rk_oct <- subset(temp_rk_oct, "var1.pred_var1.pred")
pred_rk_dic <- subset(temp_rk_dic, "var1.pred_var1.pred")

#Varianza con Ordinary Kriging
var_ok_ene <- subset(temp_ok_ene, "var1.var_var1.var")
var_ok_jun <- subset(temp_ok_jun, "var1.var_var1.var")
var_ok_oct <- subset(temp_ok_oct, "var1.var_var1.var")
var_ok_dic <- subset(temp_ok_dic, "var1.var_var1.var")

#Varianza con Regresion Kriging
var_rk_ene <- subset(temp_rk_ene, "var1.var_var1.var")
var_rk_jun <- subset(temp_rk_jun, "var1.var_var1.var")
var_rk_oct <- subset(temp_rk_oct, "var1.var_var1.var")
var_rk_dic <- subset(temp_rk_dic, "var1.var_var1.var")

Predicción de Enero

# Crear el mapa de predicciones
map_pred_ok_ene <- tm_shape(pred_ok_ene) +
  tm_raster(style = 'cont', 
            palette = viridis::viridis(20),
            title = "Temp. Pred.°C") +
  tm_layout(main.title = "Ordinary Kriging - Enero",
            main.title.size = 1.1, 
            bg.color = "gray90", 
            frame = TRUE, 
            frame.lwd = 2, 
            frame.double.line = FALSE) +
  tm_shape(reg_coq_utm) +
  tm_borders() + 
  tm_compass(size = 2, type = "arrow", position = c("right", "top")) +
  tm_grid(projection = "+init=epsg:4326", 
          lines = TRUE, 
          col = "gray", 
          alpha = 0.5) +
  tm_legend(outside = TRUE, 
            bg.color = "white", 
            frame = TRUE)+
  tm_shape(data_ene_df) +
  tm_dots() +  
  tm_credits(paste0("RMSE: ", round(metric_all |> filter(mes == "ene_ok") |> pull(rmse),2), 
                    "\nR²: ", round(metric_all |> filter(mes == "ene_ok")|> pull(r2), 3)),
             position = c("right", "bottom"),
             bg.color = "white",     
             bg.alpha = 1) 

map_pred_rk_ene <- tm_shape(pred_rk_ene) +
  tm_raster(style = 'cont', 
            palette = viridis::viridis(20),
            title = "Temp. Pred.°C") +
  tm_layout(main.title = "Regresion Kriging - Enero",
            main.title.size = 1.1, 
            bg.color = "gray90", 
            frame = TRUE, 
            frame.lwd = 2, 
            frame.double.line = FALSE) +
  tm_shape(reg_coq_utm) +
  tm_borders() + 
  tm_compass(size = 2, type = "arrow", position = c("right", "top")) +
  tm_grid(projection = "+init=epsg:4326", 
          lines = TRUE, 
          col = "gray", 
          alpha = 0.5) +
  tm_legend(outside = TRUE, 
            bg.color = "white", 
            frame = TRUE)+
  tm_shape(data_ene_df) +
  tm_dots() +  
  tm_credits(paste0("RMSE: ", round(metric_all |> filter(mes == "ene_rk") |> pull(rmse),2), 
                    "\nR²: ", round(metric_all |> filter(mes == "ene_rk")|> pull(r2), 3)),
             position = c("right", "bottom"),
             bg.color = "white",     
             bg.alpha = 1) 

tmap_arrange(map_pred_ok_ene, map_pred_rk_ene, ncol = 2)
Warning in CPL_crs_from_input(x): GDAL Message 1: +init=epsg:XXXX syntax is
deprecated. It might return a CRS with a non-EPSG compliant axis order.

En enero, el método OK produce una superficie de temperatura más suave y uniforme, capturando principalmente la variación de temperaturas de este a oeste y una mayor continuidad de norte a sur. Las zonas costeras registran temperaturas más templadas, cercanas a los 15 °C, mientras que los valles centrales tienen temperaturas por encima de los 20 °C, y la cordillera principal presenta temperaturas más frías, entre 0 y 5 °C. Sin embargo, este método presenta un alto RMSE y solo logra explicar el 30% de la variabilidad de la temperatura.

Por otro lado, el uso de regresión kriging (RK) muestra que la distribución de la temperatura está más vinculada a las condiciones geográficas. Al incorporar covariables topográficas, el modelo se ajusta mejor, aumentando la capacidad de explicar la variabilidad de la temperatura al 63% y reduciendo el RMSE. Además, el RK logra capturar temperaturas mínimas de hasta -5 °C, por lo que el modelo sugiere a medida que la altitud aumenta, la temperatura disminuye; sin embargo, es importante señalar que en esas zonas de mayor altitud no hay estaciones de medición disponibles, por lo que esto será discutido en la siguiente sección.

Varianza de Enero

# Crear el mapa de varianza
map_var_ok_ene <- tm_shape(var_ok_ene) +
  tm_raster(style = 'cont', 
            palette = viridis::viridis(20),
            title = "Varianza") +
  tm_layout(main.title = "Varianza Ordinary Kriging Enero",
            main.title.size = 1.1, 
            bg.color = "gray90", 
            frame = TRUE, 
            frame.lwd = 2, 
            frame.double.line = FALSE) +
  tm_shape(reg_coq_utm) +
  tm_borders() + 
  tm_compass(size = 2, type = "arrow", position = c("right", "top")) +
  tm_grid(projection = "+init=epsg:4326", 
          lines = TRUE, 
          col = "gray", 
          alpha = 0.5) +
  tm_legend(outside = TRUE, 
            bg.color = "white", 
            frame = TRUE)

map_var_rk_ene <- tm_shape(var_rk_ene) +
  tm_raster(style = 'cont', 
            palette = viridis::viridis(20),
            title = "Varianza") +
  tm_layout(main.title = "Varianza Regresion Kriging Enero",
            main.title.size = 1.1, 
            bg.color = "gray90", 
            frame = TRUE, 
            frame.lwd = 2, 
            frame.double.line = FALSE) +
  tm_shape(reg_coq_utm) +
  tm_borders() + 
  tm_compass(size = 2, type = "arrow", position = c("right", "top")) +
  tm_grid(projection = "+init=epsg:4326", 
          lines = TRUE, 
          col = "gray", 
          alpha = 0.5) +
  tm_legend(outside = TRUE, 
            bg.color = "white", 
            frame = TRUE)


# Mostrar ambos mapas en paralelo
tmap_arrange(map_var_ok_ene, map_var_rk_ene, ncol = 2)

Como era de esperarse, las zonas de menor varianza coinciden con las áreas donde se dispone de datos. Sin embargo, se observan algunas situaciones particulares. En el caso de OK, la varianza aumenta significativamente en áreas donde no hay datos, alcanzando un máximo de 16, especialmente en la zona norte y en una parte del sureste. Por otro lado, el método RK no presenta este mismo patrón. La mayor varianza se concentra en las áreas de mayor altitud, como la cordillera principal. Sin embargo, en las zonas sin datos (norte y sureste), la varianza es baja. Esto podría deberse a que el modelo RK logra hacer predicciones más precisas en áreas con características similares a las de los puntos de observación. En cambio, en la alta montaña, donde hay pocas estaciones de medición, el modelo podría estar sobreestimando la temperatura debido a la falta de datos suficientes.

Predicción Junio

# Crear el mapa de predicciones
map_pred_ok_jun <- tm_shape(pred_ok_jun) +
  tm_raster(style = 'cont', 
            palette = viridis::viridis(20),
            title = "Temp. Pred.°C") +
  tm_layout(main.title = "Ordinary Kriging - Junio",
            main.title.size = 1.1, 
            bg.color = "gray90", 
            frame = TRUE, 
            frame.lwd = 2, 
            frame.double.line = FALSE) +
  tm_shape(reg_coq_utm) +
  tm_borders() + 
  tm_compass(size = 2, type = "arrow", position = c("right", "top")) +
  tm_grid(projection = "+init=epsg:4326", 
          lines = TRUE, 
          col = "gray", 
          alpha = 0.5) +
  tm_legend(outside = TRUE, 
            bg.color = "white", 
            frame = TRUE)+
  tm_shape(data_ene_df) +
  tm_dots() +  
  tm_credits(paste0("RMSE: ", round(metric_all |> filter(mes == "jun_ok") |> pull(rmse),2), 
                    "\nR²: ", round(metric_all |> filter(mes == "jun_ok")|> pull(r2), 3)),
             position = c("right", "bottom"),
             bg.color = "white",     
             bg.alpha = 1) 

map_pred_rk_jun <- tm_shape(pred_rk_jun) +
  tm_raster(style = 'cont', 
            palette = viridis::viridis(20),
            title = "Temp. Pred.°C") +
  tm_layout(main.title = "Regresion Kriging - Junio",
            main.title.size = 1.1, 
            bg.color = "gray90", 
            frame = TRUE, 
            frame.lwd = 2, 
            frame.double.line = FALSE) +
  tm_shape(reg_coq_utm) +
  tm_borders() + 
  tm_compass(size = 2, type = "arrow", position = c("right", "top")) +
  tm_grid(projection = "+init=epsg:4326", 
          lines = TRUE, 
          col = "gray", 
          alpha = 0.5) +
  tm_legend(outside = TRUE, 
            bg.color = "white", 
            frame = TRUE)+
  tm_shape(data_ene_df) +
  tm_dots() +  
  tm_credits(paste0("RMSE: ", round(metric_all |> filter(mes == "jun_rk") |> pull(rmse),2), 
                    "\nR²: ", round(metric_all |> filter(mes == "jun_rk")|> pull(r2), 3)),
             position = c("right", "bottom"),
             bg.color = "white",     
             bg.alpha = 1) 

tmap_arrange(map_pred_ok_jun, map_pred_rk_jun, ncol = 2)

Tanto con OK como con RK, se observa una superficie con temperaturas más bajas, típica de una estación fría, con valles centrales más cálidos y sectores de alta montaña más fríos. Sin embargo, el método OK presenta un R² bajo y un RMSE relativamente alto, lo que indica un ajuste menos preciso. En contraste, el RK muestra un mejor rendimiento, con un RMSE más bajo y un R² que alcanza el 80%, lo que significa que el modelo explica de manera más precisa la variabilidad de la temperatura en esta estación. Al igual que en enero, el RK predice temperaturas muy bajas en las cumbres de las montañas, con valores entre -5 y 0 °C.

Varianza Junio

map_var_ok_jun <- tm_shape(var_ok_jun) +
  tm_raster(style = 'cont', 
            palette = viridis::viridis(20),
            title = "Varianza") +
  tm_layout(main.title = "Varianza Ordinary Kriging Junio",
            main.title.size = 1.1, 
            bg.color = "gray90", 
            frame = TRUE, 
            frame.lwd = 2, 
            frame.double.line = FALSE) +
  tm_shape(reg_coq_utm) +
  tm_borders() + 
  tm_compass(size = 2, type = "arrow", position = c("right", "top")) +
  tm_grid(projection = "+init=epsg:4326", 
          lines = TRUE, 
          col = "gray", 
          alpha = 0.5) +
  tm_legend(outside = TRUE, 
            bg.color = "white", 
            frame = TRUE)

map_var_rk_jun <- tm_shape(var_rk_jun) +
  tm_raster(style = 'cont', 
            palette = viridis::viridis(20),
            title = "Varianza") +
  tm_layout(main.title = "Varianza Regresion Kriging Junio",
            main.title.size = 1.1, 
            bg.color = "gray90", 
            frame = TRUE, 
            frame.lwd = 2, 
            frame.double.line = FALSE) +
  tm_shape(reg_coq_utm) +
  tm_borders() + 
  tm_compass(size = 2, type = "arrow", position = c("right", "top")) +
  tm_grid(projection = "+init=epsg:4326", 
          lines = TRUE, 
          col = "gray", 
          alpha = 0.5) +
  tm_legend(outside = TRUE, 
            bg.color = "white", 
            frame = TRUE)


# Mostrar ambos mapas en paralelo
tmap_arrange(map_var_ok_jun, map_var_rk_jun, ncol = 2)

Al igual que en enero, la varianza es muy parecida a lo que se describió anteriormente.

Predicción Octubre

# Crear el mapa de predicciones
map_pred_ok_oct <- tm_shape(pred_ok_oct) +
  tm_raster(style = 'cont', 
            palette = viridis::viridis(20),
            title = "Temp. Pred.°C") +
  tm_layout(main.title = "Ordinary Kriging - Octubre",
            main.title.size = 1.1, 
            bg.color = "gray90", 
            frame = TRUE, 
            frame.lwd = 2, 
            frame.double.line = FALSE) +
  tm_shape(reg_coq_utm) +
  tm_borders() + 
  tm_compass(size = 2, type = "arrow", position = c("right", "top")) +
  tm_grid(projection = "+init=epsg:4326", 
          lines = TRUE, 
          col = "gray", 
          alpha = 0.5) +
  tm_legend(outside = TRUE, 
            bg.color = "white", 
            frame = TRUE)+
  tm_shape(data_ene_df) +
  tm_dots() +  
  tm_credits(paste0("RMSE: ", round(metric_all |> filter(mes == "oct_ok") |> pull(rmse),2), 
                    "\nR²: ", round(metric_all |> filter(mes == "oct_ok")|> pull(r2), 3)),
             position = c("right", "bottom"),
             bg.color = "white",     
             bg.alpha = 1) 

map_pred_rk_oct <- tm_shape(pred_rk_oct) +
  tm_raster(style = 'cont', 
            palette = viridis::viridis(20),
            title = "Temp. Pred.°C") +
  tm_layout(main.title = "Regresion Kriging - Octubre",
            main.title.size = 1.1, 
            bg.color = "gray90", 
            frame = TRUE, 
            frame.lwd = 2, 
            frame.double.line = FALSE) +
  tm_shape(reg_coq_utm) +
  tm_borders() + 
  tm_compass(size = 2, type = "arrow", position = c("right", "top")) +
  tm_grid(projection = "+init=epsg:4326", 
          lines = TRUE, 
          col = "gray", 
          alpha = 0.5) +
  tm_legend(outside = TRUE, 
            bg.color = "white", 
            frame = TRUE)+
  tm_shape(data_ene_df) +
  tm_dots() +  
  tm_credits(paste0("RMSE: ", round(metric_all |> filter(mes == "oct_rk") |> pull(rmse),2), 
                    "\nR²: ", round(metric_all |> filter(mes == "oct_rk")|> pull(r2), 3)),
             position = c("right", "bottom"),
             bg.color = "white",     
             bg.alpha = 1) 

tmap_arrange(map_pred_ok_oct, map_pred_rk_oct, ncol = 2)

Aunque octubre es una estación más cálida debido a la llegada de la primavera, se observan mayores contrastes de temperatura. En la costa, las temperaturas son templadas, entre 5 y 10 °C; en los valles centrales, oscilan entre 10 y 15 °C; y en las zonas de alta montaña, descienden por debajo de 0 °C. Sin embargo, el modelo RK predice mínimas de hasta -10 °C en estas áreas. A pesar de estas diferencias, ambos modelos muestran un muy buen rendimiento en términos de las métricas.

Varianza Octubre

map_var_ok_oct <- tm_shape(var_ok_oct) +
  tm_raster(style = 'cont', 
            palette = viridis::viridis(20),
            title = "Varianza") +
  tm_layout(main.title = "Varianza Ordinary Kriging Octubre",
            main.title.size = 1.1, 
            bg.color = "gray90", 
            frame = TRUE, 
            frame.lwd = 2, 
            frame.double.line = FALSE) +
  tm_shape(reg_coq_utm) +
  tm_borders() + 
  tm_compass(size = 2, type = "arrow", position = c("right", "top")) +
  tm_grid(projection = "+init=epsg:4326", 
          lines = TRUE, 
          col = "gray", 
          alpha = 0.5) +
  tm_legend(outside = TRUE, 
            bg.color = "white", 
            frame = TRUE)

map_var_rk_oct <- tm_shape(var_rk_oct) +
  tm_raster(style = 'cont', 
            palette = viridis::viridis(20),
            title = "Varianza") +
  tm_layout(main.title = "Varianza Regresion Kriging Octubre",
            main.title.size = 1.1, 
            bg.color = "gray90", 
            frame = TRUE, 
            frame.lwd = 2, 
            frame.double.line = FALSE) +
  tm_shape(reg_coq_utm) +
  tm_borders() + 
  tm_compass(size = 2, type = "arrow", position = c("right", "top")) +
  tm_grid(projection = "+init=epsg:4326", 
          lines = TRUE, 
          col = "gray", 
          alpha = 0.5) +
  tm_legend(outside = TRUE, 
            bg.color = "white", 
            frame = TRUE)


# Mostrar ambos mapas en paralelo
tmap_arrange(map_var_ok_oct, map_var_rk_oct, ncol = 2)

A diferencia de los meses anteriores, el modelo RK presenta un mayor aumento en la varianza de los datos predichos, con una distribución similar a la observada en el modelo OK, concentrándose principalmente en el norte y sureste. Además, la alta montaña muestra una mayor variabilidad, lo que podría explicar la tendencia del modelo a sobreestimar las temperaturas bajas en esta zona. También se observa un leve aumento de la varianza en el área costera, entre las latitudes 30.5° y 31.5°, probablemente debido a la escasez de estaciones de medición en ese sector.

Predicción Diciembre

# Crear el mapa de predicciones
map_pred_ok_dic <- tm_shape(pred_ok_dic) +
  tm_raster(style = 'cont', 
            palette = viridis::viridis(20),
            title = "Temp. Pred.°C") +
  tm_layout(main.title = "Ordinary Kriging - Diciembre",
            main.title.size = 1.1, 
            bg.color = "gray90", 
            frame = TRUE, 
            frame.lwd = 2, 
            frame.double.line = FALSE) +
  tm_shape(reg_coq_utm) +
  tm_borders() + 
  tm_compass(size = 2, type = "arrow", position = c("right", "top")) +
  tm_grid(projection = "+init=epsg:4326", 
          lines = TRUE, 
          col = "gray", 
          alpha = 0.5) +
  tm_legend(outside = TRUE, 
            bg.color = "white", 
            frame = TRUE)+
  tm_shape(data_ene_df) +
  tm_dots() +  
  tm_credits(paste0("RMSE: ", round(metric_all |> filter(mes == "dic_ok") |> pull(rmse),2), 
                    "\nR²: ", round(metric_all |> filter(mes == "dic_ok")|> pull(r2), 3)),
             position = c("right", "bottom"),
             bg.color = "white",     
             bg.alpha = 1) 

map_pred_rk_dic <- tm_shape(pred_rk_dic) +
  tm_raster(style = 'cont', 
            palette = viridis::viridis(20),
            title = "Temp. Pred.°C") +
  tm_layout(main.title = "Regresion Kriging - Diciembre",
            main.title.size = 1.1, 
            bg.color = "gray90", 
            frame = TRUE, 
            frame.lwd = 2, 
            frame.double.line = FALSE) +
  tm_shape(reg_coq_utm) +
  tm_borders() + 
  tm_compass(size = 2, type = "arrow", position = c("right", "top")) +
  tm_grid(projection = "+init=epsg:4326", 
          lines = TRUE, 
          col = "gray", 
          alpha = 0.5) +
  tm_legend(outside = TRUE, 
            bg.color = "white", 
            frame = TRUE)+
  tm_shape(data_ene_df) +
  tm_dots() +  
  tm_credits(paste0("RMSE: ", round(metric_all |> filter(mes == "dic_rk") |> pull(rmse),2), 
                    "\nR²: ", round(metric_all |> filter(mes == "dic_rk")|> pull(r2), 3)),
             position = c("right", "bottom"),
             bg.color = "white",     
             bg.alpha = 1) 

tmap_arrange(map_pred_ok_dic, map_pred_rk_dic, ncol = 2)

En este mes, ambos modelos mostraron métricas similares y una distribución de la temperatura bastante parecida, especialmente en cuanto al rango de temperaturas. Ambos ofrecen un RMSE relativamente bajo, lo que indica una buena precisión en las predicciones. Sin embargo, el R² se encuentra entre el 45% y el 55%, lo que sugiere que el modelo solo logra explicar parcialmente la variabilidad de la temperatura.

Varianza Diciembre

map_var_ok_dic <- tm_shape(var_ok_dic) +
  tm_raster(style = 'cont', 
            palette = viridis::viridis(20),
            title = "Varianza") +
  tm_layout(main.title = "Varianza Ordinary Kriging Diciembre",
            main.title.size = 1.1, 
            bg.color = "gray90", 
            frame = TRUE, 
            frame.lwd = 2, 
            frame.double.line = FALSE) +
  tm_shape(reg_coq_utm) +
  tm_borders() + 
  tm_compass(size = 2, type = "arrow", position = c("right", "top")) +
  tm_grid(projection = "+init=epsg:4326", 
          lines = TRUE, 
          col = "gray", 
          alpha = 0.5) +
  tm_legend(outside = TRUE, 
            bg.color = "white", 
            frame = TRUE)

map_var_rk_dic <- tm_shape(var_rk_dic) +
  tm_raster(style = 'cont', 
            palette = viridis::viridis(20),
            title = "Varianza") +
  tm_layout(main.title = "Varianza Regresion Kriging Diciembre",
            main.title.size = 1.1, 
            bg.color = "gray90", 
            frame = TRUE, 
            frame.lwd = 2, 
            frame.double.line = FALSE) +
  tm_shape(reg_coq_utm) +
  tm_borders() + 
  tm_compass(size = 2, type = "arrow", position = c("right", "top")) +
  tm_grid(projection = "+init=epsg:4326", 
          lines = TRUE, 
          col = "gray", 
          alpha = 0.5) +
  tm_legend(outside = TRUE, 
            bg.color = "white", 
            frame = TRUE)


# Mostrar ambos mapas en paralelo
tmap_arrange(map_var_ok_dic, map_var_rk_dic, ncol = 2)

La distribución de la varianza es similar a lo de octubre, y al igual que los otros meses se relacionan ya sea por falta de puntos de observación como por sobre estimación por topografía.

En general, los análisis revelan que la distribución de la temperatura está fuertemente influenciada por la geografía de la región, con diferencias marcadas entre las temperaturas costeras, los valles centrales y las zonas montañosas, reflejando la importancia de las condiciones locales en la variabilidad térmica.

4. Discusión y conclusión.

La variabilidad en los valores de R² y RMSE entre los distintos meses sugiere que la precisión del modelo de Ordinary Kriging (OK) varía dependiendo de la estacionalidad. Por ejemplo, los meses de octubre y diciembre presentan un desempeño más sólido, con valores de R² más altos y un RMSE más bajo, lo cual indica una mejor capacidad de predicción de la temperatura. Esto podría ser una señal de que, durante estos meses, la distribución espacial de la temperatura sigue un patrón más estable y definido. En contraste, enero y junio muestran un desempeño menos favorable con valores deR² más bajos y un RMSE más alto, lo cual sugiere que la interpolación enfrenta mayores desafíos en estos meses. Esto podría estar relacionado con patrones de temperatura más complejos, la presencia de variaciones abruptas o valores atípicos, y la alta variabilidad espacial de la temperatura, lo que dificulta la capacidad del modelo para ajustarse a los datos. Estos resultados enfatizan la importancia de considerar la estacionalidad y la distribución espacial de las temperaturas en la evaluación de la precisión de los modelos de interpolación.

En cuanto al rendimiento de predicción, el Regresión Kriging (RK) mostró un mejor desempeño global en comparación con OK, con una mayor capacidad explicativa y menor error de predicción, especialmente durante los meses de junio y octubre. Durante estos meses, el modelo alcanzó un R² cercano al 80%, lo cual indica una alta capacidad para capturar la variabilidad espacial de la temperatura. Este buen desempeño puede estar relacionado con patrones de temperatura más estables o con una relación más fuerte entre las variables auxiliares utilizadas y la variabilidad espacial de la temperatura. Sin embargo, en meses como enero y diciembre, aunque el modelo de RK mejora respecto a OK, los valores de R²y RMSE son menores, lo que sugiere una mayor variabilidad en las condiciones de temperatura o la presencia de valores atípicos. Aun así, las predicciones obtenidas siguen siendo útiles para capturar las tendencias generales. Esto refuerza la importancia de considerar la estacionalidad y las características geográficas al aplicar técnicas de interpolación.

La comparación entre los modelos de OK y RK muestra claramente que RK supera a OK en todos los meses. La mejora se refleja en el aumento del R² y la reducción del RMSE, lo cual indica que el modelo de RK es más preciso y tiene una mayor capacidad para explicar la variabilidad de la temperatura. Esta mejora se debe a que RK incorpora variables adicionales (como la altitud, la distancia a la costa, y otros factores geográficos) que permiten capturar mejor la complejidad espacial de la temperatura, en lugar de depender solo de la estructura espacial observada en los datos, como es el caso de OK. En meses como junio y octubre, la mejora es especialmente notable, sugiriendo que las variables auxiliares utilizadas en RK están fuertemente correlacionadas con la variabilidad de la temperatura. Por otro lado, la baja performance de OK en estos meses podría indicar que la estructura espacial de la temperatura por sí sola no es suficiente para explicar su distribución. Esto evidencia la importancia de seleccionar un método de interpolación adecuado según la disponibilidad de datos adicionales y la complejidad de la variabilidad espacial del fenómeno.

Con respecto a la predicción de la temperatra, en general los mapas muestran patrones geográficos esperados: las áreas costeras tienden a tener temperaturas más templadas y una continuidad térmica mayor, mientras que las zonas de alta montaña presentan variaciones más pronunciadas y temperaturas más bajas. En los modelos RK, las temperaturas mínimas en zonas montañosas pueden alcanzar valores tan bajos como -10 °C, reflejando la capacidad del modelo para captar variaciones espaciales más sutiles gracias a las variables auxiliares. Sin embargo, la falta de estaciones de medición en ciertas áreas, como el norte y sureste de la región, introduce mayores incertidumbres en las predicciones de ambos modelos, especialmente en áreas de montaña. Esto puede llevar a una sobreestimación de las temperaturas bajas en zonas de alta altitud.

En términos de precisión, RK muestra un mejor rendimiento, especialmente en meses fríos como junio, donde el R² alcanzó hasta un 80%, indicando una capacidad superior para capturar la variabilidad espacial de la temperatura. Sin embargo, ambos métodos enfrentan desafíos en áreas con una baja densidad de estaciones de medición, lo que sugiere la necesidad de mejorar la cobertura de datos en estas regiones para obtener predicciones más fiables.

En conclusión, la comparación entre OK y RK muestra que la inclusión de variables auxiliares en RK mejora significativamente la precisión de las predicciones de temperatura. Mientras que OK es útil para captar patrones generales en contextos con pocos datos adicionales, RK se adapta mejor a la complejidad de la variabilidad espacial, especialmente en regiones con cambios topográficos significativos. La elección del método depende de la disponibilidad de datos y del nivel de precisión necesario.

Además, en este caso los métodos geoestadísticos (OK y RK) superan a los determinísticos en la precisión de las predicciones segun los resultados en los talleres anteriores, probablemente debido a la incorporación de covariables topográficas y variogramas, lo que permite captar la varianza en función de la distancia y mejorar el ajuste de los modelos.

5. Referencias

Hengl, T., Heuvelink, G y Rossiter, D. 2007. About regresssion-kriging: From equations to case studies. Computers & Geosciences.