Análisis de Métodos de Predicción Espacial

Author

Diego Vega, Natalia Tapia, Cristobal Carriaga

Published

October 17, 2024

# Configuración inicial
options(repos = c(CRAN = "https://cloud.r-project.org"))
knitr::opts_chunk$set(echo = TRUE)

Introducción

En este análisis se utilizaron diferentes métodos de interpolación espacial para estimar la temperatura en la región del Biobío a partir de datos recolectados in-situ y predictores generados previamente. Se compararon los métodos de Vecino Más Cercano (VMP), Inverso a la Distancia (IDW), y Kriging con variables auxiliares. Cada uno de estos métodos fue evaluado utilizando métricas de error y gráficos de comparación.

Objetivos

  • Implementar métodos de predicción espacial determinísticos y de regresión para estimar temperaturas en la región del Biobío.
  • Comparar el desempeño de los métodos mediante métricas como el RMSE y el coeficiente de determinación (R²).
  • Generar mapas temáticos para visualizar la distribución espacial de las predicciones de temperatura y su varianza.

0. Instalación de Paquetes

install.packages(c('gt', 'viridis', 'gstat', 'stars'))
Installing packages into 'C:/Users/Administrador/AppData/Local/R/win-library/4.4'
(as 'lib' is unspecified)
package 'gt' successfully unpacked and MD5 sums checked
package 'viridis' successfully unpacked and MD5 sums checked
package 'gstat' successfully unpacked and MD5 sums checked
Warning: cannot remove prior installation of package 'gstat'
Warning in file.copy(savedcopy, lib, recursive = TRUE): problema al copiar
C:\Users\Administrador\AppData\Local\R\win-library\4.4\00LOCK\gstat\libs\x64\gstat.dll
a
C:\Users\Administrador\AppData\Local\R\win-library\4.4\gstat\libs\x64\gstat.dll:
Permission denied
Warning: restored 'gstat'
package 'stars' successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\Administrador\AppData\Local\Temp\RtmpgpoO3X\downloaded_packages

1. Cargar Paquetes

library(terra)         # Análisis espacial
terra 1.7.78
library(sf)            # Datos vectoriales
Linking to GEOS 3.12.1, GDAL 3.8.4, PROJ 9.3.1; sf_use_s2() is TRUE
library(tmap)          # Mapas temáticos
Breaking News: tmap 3.x is retiring. Please test v4, e.g. with
remotes::install_github('r-tmap/tmap')
library(tidyverse)     # 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() ──
✖ tidyr::extract() masks terra::extract()
✖ 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(stars)         # Datos raster
Cargando paquete requerido: abind
library(gstat)         # Geostatística
library(dplyr)         # Manipulación de datos
library(gt)            # Tablas
library(ggplot2)       # Visualización de datos
library(abind)         # Funciones para arrays
library(viridis)       # Paleta de colores
Cargando paquete requerido: viridisLite

2. Cargar Datos

region_sf <- read_sf("C:/Geoestadistica/data/procesada/region_biobio.gpkg") |> st_transform(crs =32718)
data_temp <- read_rds('C:/Geoestadistica/data/procesada/data_estas_temp_con_predictores.rds')
predictores <- rast("C:/Geoestadistica/data/procesada/predictores/todos_predictores.tif")
preds <- rast('C:/Geoestadistica/data/procesada/predictores/todos_predictores.tif')
st_crs(data_temp) <- crs(predictores)

3. Generación de la Grilla

bb <- st_bbox(region_sf)
grilla <- rast(xmin = bb$xmin, xmax = bb$xmax,
               ymin = bb$ymin, ymax = bb$ymax, 
               res = 500, crs = "EPSG:32718") 



# Convertir a objeto stars
grilla_st <- st_as_stars(grilla)
Warning: [readValues] raster has no values

4. Verificación de Puntos Reales y Ficticios

data_temp <- data_temp |> mutate(estacion_ficticia = ifelse(station_id >= 1000, "Ficticia", "Real"))
# Visualización de estaciones
tmap_mode('plot')
tmap mode set to plotting
tm_shape(region_sf) + 

  tm_borders() +
  tm_shape(data_temp) +
  tm_dots(col = "estacion_ficticia", size = 0.2, 
          palette = c("blue", "red"),  # Color azul para reales, rojo para ficticias
          title = "Tipo de Estación") +
  tm_layout(legend.outside = TRUE,       # Colocar la leyenda afuera
            legend.title.size = 3,     # Tamaño del título de la leyenda
            legend.text.size = 1)      # Tamaño del texto de la leyenda

5. Método del Vecino Más Cercano (VMP)

#04 Metodo vecino mas cercano----


interpolar_por_mes <- function(mes_numero) {
  
  # Filtrar los datos para el mes específico
  data_temp_filtered <- data_temp |> filter(mes == mes_numero & station_id <= 1000)
  
  # Obtener las coordenadas para las estaciones
  coords <- st_coordinates(data_temp_filtered)
  
  # Definir los valores de k para los vecinos
  kas <- c(3, 5, 10)
  
  # Aplicar validación cruzada y obtener las predicciones
  out_kas <- purrr::map_df(1:nrow(data_temp_filtered), \(i) { 
    purrr::map_df(kas, \(k) {  # Iterar en los valores de k
      
      # Interpolación con IDW excluyendo el i-ésimo punto usando la misma grilla
      temp_nn <- idw(temp ~ 1, data_temp_filtered[-i,], grilla_st, nmax = k)
      
      # Convertir a SpatRaster si no es ya uno
      temp_nn <- rast(temp_nn) |> mask(vect(region_sf)) |> trim()  
      
      # Comprobar si temp_nn es un objeto SpatRaster
      if (!inherits(temp_nn, "SpatRaster")) {
        stop("temp_nn no es un objeto SpatRaster.")
      }
      
      # Extraer el valor interpolado en la posición i
      df <- terra::extract(temp_nn, coords[i, , drop = FALSE])  # Usar terra::extract
      
      # Guardar el ráster para cada k y mes
      filename <- paste0("RasterVMP_mes_", mes_numero, "_k", k, "_idw_", i, ".tif")
      writeRaster(temp_nn, file.path('C:/Geoestadistica/data/procesada/vmp2', filename), overwrite = TRUE) 
      
      df |> mutate(k = k)
    })
  })
  
  # Repetir los valores observados para todos los k
  observados <- rep(data_temp_filtered$temp, each = length(kas))
  
  # Combinar datos de predicciones con los observados y las coordenadas
  data_cv_kas <- cbind(coords, out_kas, observados)
  
  # Definir la función de RMSE
  rmse <- function(obs, pred) sqrt(sum((obs - pred)^2) / length(obs))
  
  # Calcular los residuos y el Z-Score
  data_cv_kas <- data_cv_kas |> 
    mutate(residuos = observados - var1.pred_var1.pred,  # Ajustar el nombre de la columna
           zscore = scale(residuos))
  
  # Calcular métricas de evaluación
  data_cv_kas_sum <- data_cv_kas |> 
    group_by(k) |> 
    summarize(rmse = rmse(observados, var1.pred_var1.pred),  # Usar el nombre correcto de la columna
              r2 = cor(observados, var1.pred_var1.pred)^2) |> 
    mutate(mes = mes_numero)  # Agregar el mes a las métricas
  
  return(list(data_cv_kas_sum = data_cv_kas_sum, data_cv_kas = data_cv_kas))
}

# Lista de meses para iterar: marzo (3), junio (6), septiembre (9), diciembre (12)

meses <- c(3, 6, 9, 12)

# Aplicar la función para cada mes y guardar los resultados

resultados_meses <- purrr::map(meses, \(mes_numero) {
  cat("Procesando el mes:", mes_numero, "\n")  # Mostrar en qué mes está trabajando
  interpolar_por_mes(mes_numero)
})
Procesando el mes: 3 
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Procesando el mes: 6 
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Procesando el mes: 9 
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Procesando el mes: 12 
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
# Extraer resultados

data_cv_kas_sum_lista <- purrr::map(resultados_meses, "data_cv_kas_sum")
data_cv_kas_lista <- purrr::map(resultados_meses, "data_cv_kas")

# Combinar todos los resultados en un solo data frame

data_cv_kas_sum_total <- bind_rows(data_cv_kas_sum_lista, .id = "mes")
data_cv_kas_total <- bind_rows(data_cv_kas_lista, .id = "mes")

# Asegúrate de que la columna 'mes' sea un factor con etiquetas correctas

data_cv_kas_sum_total$mes <- factor(data_cv_kas_sum_total$mes,
                                    levels = c(1, 2, 3, 4),
                                    labels = c("Marzo", "Junio", "Septiembre", "Diciembre"))

# Convertir mes a factor con etiquetas para data_cv_kas_total

data_cv_kas_total$mes <- factor(data_cv_kas_total$mes,
                                levels = c(1, 2, 3, 4),
                                labels = c("Marzo", "Junio", "Septiembre", "Diciembre"))
#ver datos de VMP
print(data_cv_kas_sum_total)
# A tibble: 12 × 4
       k  rmse    r2 mes       
   <dbl> <dbl> <dbl> <fct>     
 1     3 0.706 0.776 Marzo     
 2     5 0.735 0.770 Marzo     
 3    10 0.844 0.749 Marzo     
 4     3 0.475 0.187 Junio     
 5     5 0.467 0.201 Junio     
 6    10 0.463 0.195 Junio     
 7     3 0.480 0.421 Septiembre
 8     5 0.488 0.373 Septiembre
 9    10 0.486 0.380 Septiembre
10     3 0.810 0.872 Diciembre 
11     5 0.900 0.860 Diciembre 
12    10 1.12  0.846 Diciembre 
#4.1Comparación de error medio cuadrático entre modelos por mes

ggplot(data_cv_kas_sum_total, aes(x = as.factor(k), y = rmse, fill = mes)) +
  geom_bar(stat = "identity", position = "dodge", na.rm = TRUE) +
  geom_text(aes(label = round(rmse, 2)), position = position_dodge(width = 0.9), vjust = -0.3, na.rm = TRUE) +
  ggtitle("Comparación de RMSE entre Modelos por Mes") +
  xlab("k") +
  ylab("RMSE") +
  scale_fill_manual(name = "Mes", values = c("Marzo" = "steelblue", "Junio" = "orange", "Septiembre" = "green", "Diciembre" = "red")) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

#4.2 Comparación del coeficiente de determinación entre modelos por mes
ggplot(data_cv_kas_sum_total, aes(x = as.factor(k), y = r2, fill = mes)) +
  geom_bar(stat = "identity", position = "dodge", na.rm = TRUE) +
  geom_text(aes(label = round(r2, 2)), position = position_dodge(width = 0.9), vjust = -0.3, na.rm = TRUE) +
  ggtitle("Comparación de R² entre Modelos por Mes") +
  xlab("k") +
  ylab("R²") +
  scale_fill_manual(name = "Mes", values = c("Marzo" = "steelblue", "Junio" = "orange", "Septiembre" = "green", "Diciembre" = "red")) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

#4.3 Visualización de residuos por mes y k
ggplot(data_cv_kas_total, aes(x = residuos, fill = as.factor(k))) +
  geom_histogram(bins = 30, alpha = 0.7, position = "identity") +
  labs(title = "Distribución de Residuos por Mes y k",
       x = "Residuos",
       y = "Frecuencia") +
  theme_minimal() +
  facet_grid(mes ~ k) +  # Facetas por mes y k
  scale_fill_viridis_d(name = "k")  # Colores diferenciados para k

#4.4Visualización de Z-Scores por mes y k

ggplot(data_cv_kas_total, aes(x = zscore, fill = as.factor(k))) +
  geom_histogram(bins = 30, alpha = 0.7, position = "identity") +
  labs(title = "Distribución de Z-Scores por Mes y k",
       x = "Z-Score",
       y = "Frecuencia") +
  theme_minimal() +
  facet_grid(mes ~ k) +  # Facetas por mes y k
  scale_fill_viridis_d(name = "k")  # Colores diferenciados para k

#4.5 Gráfico de dispersión para valores observados vs valores predichos por mes

ggplot(data_cv_kas_total, aes(x = observados, y = var1.pred_var1.pred, color = as.factor(k))) +
  geom_point(alpha = 0.7) +
  geom_abline(intercept = 0, slope = 1, color = "red", linetype = "dashed") +  # Línea de referencia
  labs(title = "Predicciones vs Observados por Mes y k",
       x = "Valores Observados",
       y = "Valores Predichos") +
  theme_minimal() +
  facet_grid(mes ~ k) +  # Facetas por mes y k
  scale_color_viridis_d(name = "k")  # Colores diferenciados para k

#4.6 Creación y promedios para cada uno de los meses trabajados y los valores k considerados
#Lista de meses y valores de k
meses <- c(3, 6, 9, 12)
kas <- c(3, 5, 10)

# Iterar sobre meses y valores de k
for (mes in meses) {
  for (k in kas) {
    # Cargar los rásteres de las diferentes iteraciones para un mes y un valor de k
    raster_files <- list.files('C:/Geoestadistica/data/procesada/vmp2', 
                               pattern = paste0("RasterVMP_mes_", mes, "_k", k, "_idw_"), 
                               full.names = TRUE)
    
    # Cargar todos los rásteres en una lista, asegurándose de que son objetos raster válidos
    rasters_list <- lapply(raster_files, function(file) {
      raster <- tryCatch({
        rast(file)
      }, error = function(e) {
        message("Error al cargar el archivo: ", file)
        return(NULL) # Devolver NULL si hay un error
      })
      return(raster)
    })
    
    # Filtrar los objetos NULL (los que no se pudieron cargar)
    rasters_list <- Filter(Negate(is.null), rasters_list)
    
    # Verificar si la lista de rásteres no está vacía
    if (length(rasters_list) > 0) {
      # Convertir la lista a un objeto SpatRaster
      raster_stack <- do.call(c, rasters_list) # Combina las listas de rásteres
      
      # Calcular el promedio de los rásteres usando terra::app
      raster_promedio <- app(raster_stack, fun = mean, na.rm = TRUE)
      
      # Guardar el ráster promedio
      filename_promedio <- paste0("RasterVMP_mes_", mes, "_k", k, "_promedio.tif")
      writeRaster(raster_promedio, file.path('C:/Geoestadistica/data/procesada/vmp2', filename_promedio), overwrite = TRUE)
      
      cat("Promedio guardado para mes:", mes, "y k:", k, "\n")
    } else {
      cat("No se encontraron rásteres válidos para mes:", mes, "y k:", k, "\n")
    }
  }
}
Promedio guardado para mes: 3 y k: 3 
Promedio guardado para mes: 3 y k: 5 
Promedio guardado para mes: 3 y k: 10 
Promedio guardado para mes: 6 y k: 3 
Promedio guardado para mes: 6 y k: 5 
Promedio guardado para mes: 6 y k: 10 
Promedio guardado para mes: 9 y k: 3 
Promedio guardado para mes: 9 y k: 5 
Promedio guardado para mes: 9 y k: 10 
Promedio guardado para mes: 12 y k: 3 
Promedio guardado para mes: 12 y k: 5 
Promedio guardado para mes: 12 y k: 10 
# Cargar los rasters desde los archivos por mes y k seleccionados
raster_marzo <- rast("C:/Geoestadistica/data/procesada/vmp2/RasterVMP_mes_3_k3_promedio.tif")    # Raster de marzo
raster_junio <- rast("C:/Geoestadistica/data/procesada/vmp2/RasterVMP_mes_6_k3_promedio.tif")    # Raster de junio
raster_septiembre <- rast("C:/Geoestadistica/data/procesada/vmp2/RasterVMP_mes_9_k3_promedio.tif") # Raster de septiembre
raster_diciembre <- rast("C:/Geoestadistica/data/procesada/vmp2/RasterVMP_mes_12_k3_promedio.tif") # Raster de diciembre

# Crear un stack de rasters
RasterVMP_stack <- c(raster_marzo, raster_junio, raster_septiembre, raster_diciembre)

# Nombres para los rasters en el stack
names(RasterVMP_stack) <- c("Marzo", "Junio", "Septiembre", "Diciembre")

#Cartografías utilizando el método del vecino más próximo (k=3)

tm_shape(RasterVMP_stack) +  # Añadir el ráster de temperatura
  tm_raster(style = 'quantile', 
            palette = viridis(20), 
            title = "Rango de Temperatura (°C)", 
            colorNA = "grey90",  # Color para valores NA
            alpha = 0.9) +  # Ajustar la transparencia del ráster
  tm_shape(region_sf) +  # Añadir la capa de la región
  tm_borders(lwd = 3) +  # Dibujar los bordes de la región con mayor grosor
  tm_shape(data_temp) +  # Añadir los puntos de datos de temperatura
  tm_dots(col = 'temp', 
          title = "Temperatura Media (°C)",  # Título descriptivo de la leyenda
          style = 'jenks', 
          palette = '-RdYlBu', 
          size = 0.3,  # Aumentar el tamaño de los puntos
          alpha = 1) +  # Ajustar la transparencia de los puntos
  tm_compass(position = c("left", "top"), type = "4star", size = 0.7) +  # Añadir flecha del norte
  tm_grid() +  # Añadir una cuadrícula
  tm_layout(
    main.title = "Vecino más Cercano (k = 3)",  # Título principal
    main.title.size = 1,  # Tamaño del título
    main.title.position = "center",  # Centrar el título
    main.title.fontface = "bold",  # Negrita para el título
    legend.outside = TRUE,  # Colocar la leyenda afuera
    legend.title.size = 0.9,  # Tamaño del título de la leyenda
    legend.text.size = 0.7,  # Tamaño del texto de la leyenda
    legend.position = c("left", "bottom"),  # Posición de la leyenda
    frame = FALSE  # Eliminar el marco del mapa
  )

tmap_mode('plot')
tmap mode set to plotting
print(RasterVMP_stack)
class       : SpatRaster 
dimensions  : 453, 523, 4  (nrow, ncol, nlyr)
resolution  : 500, 500  (x, y)
extent      : 590787.8, 852287.8, 5738181, 5964681  (xmin, xmax, ymin, ymax)
coord. ref. : WGS 84 / UTM zone 18S (EPSG:32718) 
sources     : RasterVMP_mes_3_k3_promedio.tif  
              RasterVMP_mes_6_k3_promedio.tif  
              RasterVMP_mes_9_k3_promedio.tif  
              RasterVMP_mes_12_k3_promedio.tif  
names       :    Marzo,    Junio, Septiembre, Diciembre 
min values  : 13.57104,  8.89374,   8.721667,  12.06568 
max values  : 17.87124, 10.70980,  10.991252,  18.93818 

6. Método de Inverso a la Distancia (IDW)

# Definir la función para el proceso de interpolación y validación cruzada

interpolar_por_mes <- function(mes_numero) {
  
  # Filtrar los datos para el mes específico
  data_temp_filtered <- data_temp |> filter(mes == mes_numero & station_id <= 1000)
  
  # Obtener las coordenadas para las estaciones
  coords <- st_coordinates(data_temp_filtered)
  
  # Aplicar validación cruzada y obtener las predicciones
  out_IDW <- purrr::map_df(1:nrow(data_temp_filtered), \(i) { 
    # Interpolación con IDW excluyendo el i-ésimo punto
    temp_nn <- idw(temp ~ 1, data_temp_filtered[-i,], grilla_st)
    
    # Aplicar máscara para la región y ajustar el raster
    temp_nn <- rast(temp_nn) |> mask(vect(region_sf)) |> trim()  
    
    # Extraer el valor interpolado en la posición i
    # Asegúrate de que coords[i, ] esté en el formato correcto
    df <- terra::extract(temp_nn, coords[i, , drop = FALSE])  # Cambié aquí para usar terra::extract
    
    # Guardar el ráster para cada mes
    filename <- paste0("RasterIDW_mes_", mes_numero, "_idw_", i, ".tif")
    writeRaster(temp_nn, file.path('C:/Geoestadistica/data/procesada/IDW', filename), overwrite = TRUE)
    
    df
  })
  
  # Repetir los valores observados para todos los k
  observados_IDW <- data_temp_filtered$temp
  
  # Combinar datos de predicciones con los observados
  data_cv_IDW <- cbind(out_IDW, observados_IDW)
  
  # Definir la función de RMSE
  rmse <- function(obs, pred) sqrt(sum((obs - pred)^2) / length(obs))
  
  # Calcular los residuos y el Z-Score
  data_cv_IDW <- data_cv_IDW |> 
    mutate(residuos = observados_IDW - var1.pred_var1.pred,
           zscore = scale(residuos))
  
  # Calcular métricas de evaluación
  data_cv_IDW_sum <- data_cv_IDW |> 
    summarize(rmse = rmse(observados_IDW, var1.pred_var1.pred),
              r2 = cor(observados_IDW, var1.pred_var1.pred)^2) |> 
    mutate(mes = mes)  # Agregar el mes a las métricas
  
  return(list(data_cv_IDW_sum = data_cv_IDW_sum, data_cv_IDW = data_cv_IDW))
}


# Lista de meses para iterar: marzo (3), junio (6), septiembre (9), diciembre (12)

meses <- c(3, 6, 9, 12)

# Aplicar la función para cada mes y guardar los resultados

resultados_meses <- purrr::map(meses, \(mes_numero) {
  cat("Procesando el mes:", mes_numero, "\n")  # Mostrar en qué mes está trabajando
  interpolar_por_mes(mes_numero)
})
Procesando el mes: 3 
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Procesando el mes: 6 
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Procesando el mes: 9 
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Procesando el mes: 12 
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
[inverse distance weighted interpolation]
Warning in asMethod(object): complete map seems to be NA's -- no selection was
made
# Extraer resultados

data_cv_IDW_sum_lista <- purrr::map(resultados_meses, "data_cv_IDW_sum")
data_cv_IDW_lista <- purrr::map(resultados_meses, "data_cv_IDW")

# Combinar todos los resultados en un solo data frame

data_cv_IDW_sum_total <- bind_rows(data_cv_IDW_sum_lista, .id = "mes")
data_cv_IDW_total <- bind_rows(data_cv_IDW_lista, .id = "mes")

# Asegúrate de que la columna 'mes' sea un factor con etiquetas correctas

data_cv_IDW_sum_total$mes <- factor(data_cv_IDW_sum_total$mes,
                                    levels = c(1, 2, 3, 4),
                                    labels = c("Marzo", "Junio", "Septiembre", "Diciembre"))

# Convertir mes a factor con etiquetas para data_cv_IDW_total

data_cv_IDW_total$mes <- factor(data_cv_IDW_total$mes,
                                levels = c(1, 2, 3, 4),
                                labels = c("Marzo", "Junio", "Septiembre", "Diciembre"))
#Resultados de las métricas para el cálculo del inverso a la distancia (IDW)

print(data_cv_IDW_sum_total)
       rmse        r2        mes
1 0.8806653 0.7334018      Marzo
2 0.4604365 0.1972029      Junio
3 0.4850496 0.3812938 Septiembre
4 1.1580016 0.8385473  Diciembre
#5.2 Comparación de error medio cuadrático entre modelos por mes
ggplot(data_cv_IDW_sum_total, aes(x = 'IDW', y = rmse, fill = mes)) +
  geom_bar(stat = "identity", position = "dodge", na.rm = TRUE) +
  geom_text(aes(label = round(rmse, 2)), position = position_dodge(width = 0.9), vjust = -0.3, na.rm = TRUE) +
  ggtitle("Comparación de RMSE entre Modelos por Mes") +
  xlab("MESES") +
  ylab("RMSE") +
  scale_fill_manual(name = "Mes", values = c("Marzo" = "steelblue", "Junio" = "orange", "Septiembre" = "green", "Diciembre" = "red")) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

#5.3 Comparación del coeficiente de determinación entre modelos por mes
ggplot(data_cv_IDW_sum_total, aes(x = 'IDW', y = r2, fill = mes)) +
  geom_bar(stat = "identity", position = "dodge", na.rm = TRUE) +
  geom_text(aes(label = round(r2, 2)), position = position_dodge(width = 0.9), vjust = -0.3, na.rm = TRUE) +
  ggtitle("Comparación de R² entre Modelos por Mes") +
  xlab("MESES") +
  ylab("R²") +
  scale_fill_manual(name = "Mes", values = c("Marzo" = "steelblue", "Junio" = "orange", "Septiembre" = "green", "Diciembre" = "red")) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

#5.4 Visualización de los residuos por mes
ggplot(data_cv_IDW_total, aes(x = residuos, fill = mes)) +
  geom_histogram(bins = 30, alpha = 0.7) +
  labs(title = "Distribución de Residuos por Mes",
       x = "Residuos",
       y = "Frecuencia") +
  theme_minimal() +
  facet_wrap(~mes)

#5.5 Visualización de Z-Scores por mes
ggplot(data_cv_IDW_total, aes(x = zscore, fill = mes)) +
  geom_histogram(bins = 30, alpha = 0.7) +
  labs(title = "Distribución de Z-Scores por Mes",
       x = "Z-Score",
       y = "Frecuencia") +
  theme_minimal() +
  facet_wrap(~mes)

#5.6 Gráfico de dispersión para valores observados vs valores predichos por mes
ggplot(data_cv_IDW_total, aes(x = observados_IDW, y = var1.pred_var1.pred, color = mes)) +
  geom_point(alpha = 0.7) +
  geom_abline(intercept = 0, slope = 1, color = "red", linetype = "dashed") +  # Línea de referencia
  labs(title = "Predicciones vs Observados por Mes",
       x = "Valores Observados",
       y = "Valores Predichos") +
  theme_minimal() +
  facet_wrap(~mes)

#5.7 Iteraciones para cada mes para obtener los promedios de temperatura
# Lista de meses
meses <- c(3, 6, 9, 12)

# Iterar sobre meses
for (mes in meses) {
  # Cargar los rásteres de las diferentes iteraciones para un mes
  raster_files <- list.files('C:/Geoestadisticadata/procesada/IDW', 
                             pattern = paste0("RasterIDW_mes_", mes, "_idw_"), 
                             full.names = TRUE)
  
  # Cargar todos los rásteres en una lista, asegurándose de que son objetos raster válidos
  rasters_list <- lapply(raster_files, function(file) {
    raster <- tryCatch({
      rast(file)
    }, error = function(e) {
      message("Error al cargar el archivo: ", file)
      return(NULL) # Devolver NULL si hay un error
    })
    return(raster)
  })
  
  # Filtrar los objetos NULL (los que no se pudieron cargar)
  rasters_list <- Filter(Negate(is.null), rasters_list)
  
  # Verificar si la lista de rásteres no está vacía
  if (length(rasters_list) > 0) {
    # Convertir la lista a un objeto SpatRaster
    raster_stack <- do.call(c, rasters_list) # Combina las listas de rásteres
    
    # Calcular el promedio de los rásteres usando terra::app
    raster_promedio <- app(raster_stack, fun = mean, na.rm = TRUE)
    
    # Guardar el ráster promedio
    filename_promedio <- paste0("RasterIDW_mes_", mes, "_promedio.tif")
    writeRaster(raster_promedio, file.path('C:/Geoestadistica/data/procesada/IDW', filename_promedio), overwrite = TRUE)
    
    cat("Promedio guardado para mes:", mes, "\n")
  } else {
    cat("No se encontraron rásteres válidos para mes:", mes, "\n")
  }
}
No se encontraron rásteres válidos para mes: 3 
No se encontraron rásteres válidos para mes: 6 
No se encontraron rásteres válidos para mes: 9 
No se encontraron rásteres válidos para mes: 12 
# 5.8 Carga de los rásters promedio y creación del stack
# Cargar los rasters promedios
raster_marzo <- rast("C:/Geoestadistica/data/procesada/IDW/RasterIDW_mes_3_promedio.tif")
raster_junio <- rast("C:/Geoestadistica/data/procesada/IDW/RasterIDW_mes_6_promedio.tif")
raster_septiembre <- rast("C:/Geoestadistica/data/procesada/IDW/RasterIDW_mes_9_promedio.tif")
raster_diciembre <- rast("C:/Geoestadistica/data/procesada/IDW/RasterIDW_mes_12_promedio.tif")

# Crear un stack de rasters
RasterIDW_stack <- c(raster_marzo, raster_junio, raster_septiembre, raster_diciembre)

# Nombres para los rasters en el stack
names(RasterIDW_stack) <- c("Marzo", "Junio", "Septiembre", "Diciembre")

#5.9 Cartografías utilizando el método del inverso a la distancia (IDW)
tm_shape(RasterIDW_stack) +  # Añadir el ráster de temperatura
  tm_raster(style = 'quantile', 
            palette = viridis(20), 
            title = "Rango de Temperatura (°C)", 
            colorNA = "grey90",  # Color para valores NA
            alpha = 0.9) +  # Ajustar la transparencia del ráster
  tm_shape(region_sf) +  # Añadir la capa de la región
  tm_borders(lwd = 3) +  # Dibujar los bordes de la región con mayor grosor
  tm_shape(data_temp) +  # Añadir los puntos de datos de temperatura
  tm_dots(col = 'temp', 
          title = "Temperatura Media (°C)",  # Título descriptivo de la leyenda
          style = 'jenks', 
          palette = '-RdYlBu', 
          size = 0.3,  # Aumentar el tamaño de los puntos
          alpha = 1) +  # Ajustar la transparencia de los puntos
  tm_compass(position = c("left", "top"), type = "4star", size = 0.7) +  # Añadir flecha del norte
  tm_grid() +  # Añadir una cuadrícula
  tm_layout(
    main.title = "Inverso de la Distancia IDW",  # Título principal
    main.title.size = 1,  # Tamaño del título
    main.title.position = "center",  # Centrar el título
    main.title.fontface = "bold",  # Negrita para el título
    legend.outside = TRUE,  # Colocar la leyenda afuera
    legend.title.size = 0.9,  # Tamaño del título de la leyenda
    legend.text.size = 0.7,  # Tamaño del texto de la leyenda
    legend.position = c("left", "bottom"),  # Posición de la leyenda
    frame = FALSE  # Eliminar el marco del mapa
  )

7. Regresión Lineal con Kriging

# Regresión lineal con predictores
names(preds) <- make.unique(names(preds))
kriging_por_mes <- function(mes_numero) {
  mes_nombre <- c("marzo", "junio", "septiembre", "diciembre")[which(meses == mes_numero)]
  pred_vars <- c('dem', 'aspect', 'slope', 'dist_costa', paste0('ndvi_', mes_nombre), paste0('lst_', mes_nombre))
  pred_vars_presentes <- pred_vars[pred_vars %in% names(preds)]
  preds_mes <- subset(preds, pred_vars_presentes)
  preds_mes_st <- preds_mes |> st_as_stars() |> split('band')
  data_temp_filtered <- data_temp |> filter(mes == mes_numero)
  temp_lm6 <- krige(temp ~ dem + aspect + slope + dist_costa + get(paste0('ndvi_', mes_nombre)) + get(paste0('lst_', mes_nombre)), data_temp_filtered, preds_mes_st)
  temp_lm6_raster <- rast(temp_lm6)
  temp_lm6_loocv <- krige.cv(temp ~ dem + aspect + slope + dist_costa + get(paste0('ndvi_', mes_nombre)) + get(paste0('lst_', mes_nombre)), data_temp_filtered)
  rmse_loocv <- sqrt(mean((temp_lm6_loocv$observed - temp_lm6_loocv$var1.pred)^2))
  r2_loocv <- cor(temp_lm6_loocv$observed, temp_lm6_loocv$var1.pred)^2
  return(list(prediccion_raster = temp_lm6_raster, loocv = list(modelo = temp_lm6_loocv, metricas = c(rmse_loocv, r2_loocv))))
}

resultados_kriging <- purrr::map(meses, \(mes_numero) { kriging_por_mes(mes_numero) })
[ordinary or weighted least squares prediction]
[ordinary or weighted least squares prediction]
[ordinary or weighted least squares prediction]
[ordinary or weighted least squares prediction]

8. Visualización de Resultados

8.1 Comparación de RMSE entre Modelos

ggplot(data_cv_kas_sum_total, aes(x = as.factor(k), y = rmse, fill = mes)) +
  geom_bar(stat = "identity", position = "dodge", na.rm = TRUE) +
  geom_text(aes(label = round(rmse, 2)), position = position_dodge(width = 0.9), vjust = -0.3, na.rm = TRUE) +
  ggtitle("Comparación de RMSE entre Modelos por Mes") +
  xlab("k") +
  ylab("RMSE") +
  scale_fill_manual(name = "Mes", values = c("Marzo" = "steelblue", "Junio" = "orange", "Septiembre" = "green", "Diciembre" = "red")) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

8.2 Comparación del Coeficiente de Determinación R²

ggplot(data_cv_IDW_sum_total, aes(x = 'IDW', y = r2, fill = mes)) +
  geom_bar(stat = "identity", position = "dodge", na.rm = TRUE) +
  geom_text(aes(label = round(r2, 2)), position = position_dodge(width = 0.9), vjust = -0.3, na.rm = TRUE) +
  ggtitle("Comparación de R² entre Modelos por Mes") +
  xlab("Meses") +
  ylab("R²") +
  scale_fill_manual(name = "Mes", values = c("Marzo" = "steelblue", "Junio" = "orange", "Septiembre" = "green", "Diciembre" = "red")) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Conclusiones

En este análisis, se evaluaron varios métodos de interpolación espacial para predecir la temperatura en la región del Biobío. Los métodos de VMP, IDW y Kriging mostraron distintas capacidades para captar las variaciones espaciales de temperatura, siendo evaluados a través de métricas como RMSE y R². Estos resultados proporcionan una visión de la eficacia de cada método para análisis futuros y destacan la importancia de seleccionar el método adecuado para cada contexto geoespacial.