Geoestadistica

Author

Marco Mora Pablo Pedraza Pedro Straub

Taller 2: Métodos de predicción espacial determinísticos y de regresión

1 SETUP

1.1 Cargar Librerías

library(dplyr)
library(ggplot2)
library(lubridate)
library(sf)
library(terra)
library(tmap)
library(stars)
library(gstat)
library(viridis)
library(readr)

2 Febrero

2.1 Preparar datos para interpolación

2.1.1 Carga de datos

# Leer la región
region <- read_rds('C:/Re6/Geoestadistica/Talleres/data/procesada/reg_nuble_utm.rds')

# Cargar datos de temperatura
data_temp_feb <- read_rds('C:/Re6/Geoestadistica/Talleres/data/procesada/data_temp_Febrero.rds')[c('station_id','temp')]
# Muestreo de datos
set.seed(432)
data_temp_mod_feb <- data_temp_feb |> sample_frac(0.8)
data_temp_nuble_feb <- data_temp_feb |> filter(!(station_id %in% data_temp_mod_feb$station_id))
# Definición de la función de cálculo
calc_met <- function(ras,object_sf,var = 'temp') {
  df_nuble <- terra::extract(ras,terra::vect(object_sf)) |> 
    cbind(object_sf[,var]) 
  rmse <- function(obs,pred) sqrt(sum((obs-pred)^2)/length(obs))
  rmse_v <- rmse(df_nuble[,3],df_nuble[,2])
  r2 <- cor(df_nuble[,3],df_nuble[,2])^2
  c('rmse' = rmse_v,'rsq' = r2)
}
# Visualización con tmap
tm_shape(region) + 
  tm_borders() +
  tm_shape(data_temp_feb) +  # Asegúrate de usar el objeto sf
  tm_dots(col = 'temp', title = "Temperatura") +
  tm_layout(legend.outside = TRUE)

2.1.2 Grilla

bb <- st_bbox(region)
grilla <- rast(xmin = bb$xmin,xmax = bb$xmax,
               ymin = bb$ymin,ymax = bb$ymax, 
               res=1000,crs="EPSG:32719") 

grilla_st <- grilla |>   st_as_stars() #como clase stars
class(grilla_st)
grilla |> as.polygons() |> plot()

2.2 Voronoi (Polígonos de Thiessen)

temp_vor_feb <- voronoi(vect(data_temp_mod_feb)) |> 
  terra::rasterize(grilla,'temp') |> 
  mask(vect(region)) 
(met_vor <- calc_met(temp_vor_feb,data_temp_nuble_feb))
plot(temp_vor)

rmse: 1.4836205
rsq: 0.6741448

2.3 Vecino más próximo

#K=1
temp_nn <- idw(temp~1, data_temp_mod_feb, grilla_st,nmax=1)
temp_nn_feb <- temp_nn |> rast() |> mask(vect(region)) |> trim() 
(met_nn1_feb <- calc_met(temp_nn_feb[[1]],data_temp_feb))
plot(temp_nn_feb)

rmse: 1.4836204
rsq: 0.6741448

#K=5
temp_nn5 <- idw(temp~1, data_temp_mod_feb, grilla_st,nmax=5)
temp_nn5_feb <- temp_nn5 |> rast() |> mask(vect(region)) |> trim() 
(met_nn5_feb <- calc_met(temp_nn5_feb[[1]],data_temp_feb))
plot(temp_nn5_feb)

rmse: 1.4960542
rsq: 0.6830163

#K=10
temp_nn10 <- idw(temp~1, data_temp_mod_feb, grilla_st,nmax=10)
temp_nn10_feb <- temp_nn10 |> rast() |> mask(vect(region)) |> trim() 
(met_nn10_feb <- calc_met(temp_nn10_feb[[1]],data_temp_feb))
plot(temp_nn10_feb)

rmse: 1.6151940
rsq: 0.6381154

2.4 Inverso de la Distancia

temp_idw <- idw(temp~1, data_temp_mod_feb, grilla_st)
temp_idw_feb <- temp_idw |> rast() |> mask(vect(region)) |> trim() 
met_idw_feb <- calc_met(temp_idw_feb[[1]],data_temp_feb)
# Configurar el modo de visualización
tmap_mode("plot")  # Usa "view" si prefieres una visualización interactiva
# Visualizar con tmap
tm_shape(temp_idw_feb[[1]]) +
  tm_raster(style = 'cont',palette = viridis::viridis(20)) +
  tm_shape(region) + 
  tm_borders() +
  tm_shape(data_temp_feb) +
  tm_dots(col='temp',title = "Temperatura (°C)",style = 'jenks',palette = viridis::viridis(10))

2.5 Regresión en coordenadas

data_temp_mod_feb_ <- cbind(data_temp_mod_feb,st_coordinates(data_temp_mod_feb))
mod.lm1_feb <- lm(temp ~ X + Y, data=data_temp_mod_feb_)

mod.lm2_feb <- lm(temp ~ X + Y + I(X^2) + I(Y^2) + I(X*Y), data=data_temp_mod_feb_)

summary(mod.lm1_feb)$r.squared

summary(mod.lm2_feb)$adj.r.squared

summary(mod.lm2_feb)$r.squared

temp_ts_feb <- c(grilla, grilla)
xy <- xyFromCell(grilla,1:ncell(grilla)) |> 
  as_tibble() |> set_names(c('X','Y'))
values(temp_ts_feb[[1]])<-  predict(mod.lm1_feb, newdata=xy)

values(temp_ts_feb[[2]]) <- predict(mod.lm1_feb, newdata=xy,se.fit=TRUE,inerval='prediction')$se.fit
names(temp_ts_feb) <- c('temperatura','error_estandar')
temp <- mask(temp_ts_feb, vect(region))
(met_ts1_feb <- calc_met(temp_ts_feb[[1]],data_temp_mod_feb))

class(grilla)
plot((met_ts1_feb))

rmse: 2.56077567
rsq: 0.08624797

# Asegúrate de que data_temp_mod sea un objeto sf
data_temp_mod_feb_sf <- cbind(data_temp_mod_feb, st_coordinates(data_temp_mod_feb))

# Ajustar los modelos lineales
mod.lm1_feb_sf <- lm(temp ~ X + Y, data = data_temp_mod_feb_sf)
mod.lm2_feb_sf <- lm(temp ~ X + Y + I(X^2) + I(Y^2) + I(X*Y), data = data_temp_mod_feb_sf)

# Resumen de los modelos
summary(mod.lm1_feb_sf)$r.squared
summary(mod.lm2_feb_sf)$adj.r.squared
summary(mod.lm2_feb_sf)$r.squared
# Usar c() para combinar SpatRaster
temp_ts_feb_2 <- c(grilla, grilla)  

# Crear un data frame de coordenadas
xy <- xyFromCell(grilla, 1:ncell(grilla)) |> 
  as_tibble() |> 
  set_names(c('X', 'Y'))
# Predicciones y creación de rasters "Primer modelo"
values(temp_ts_feb_2[[1]]) <- predict(mod.lm1_feb, newdata = xy)
values(temp_ts_feb_2[[2]]) <- predict(mod.lm1_feb, newdata = xy, se.fit = TRUE, interval = 'prediction')$se.fit

names(temp_ts_feb_2) <- c('temperatura', 'error_estandar')
temp <- mask(temp_ts_feb_2, vect(region))  # Asegurarse de que region sea un objeto válido

# Calcular métricas para el primer modelo
met_ts1_feb_2 <- calc_met(temp_ts_feb_2[[1]], data_temp_feb)
# Predicciones y creación de rasters "Segundo modelo"
temp_ts2_feb <- c(grilla, grilla)  # Usar c() para el segundo conjunto de rasters
values(temp_ts2_feb[[1]]) <- predict(mod.lm2_feb_sf, newdata = xy)
values(temp_ts2_feb[[2]]) <- predict(mod.lm2_feb_sf, newdata = xy, se.fit = TRUE, interval = 'prediction')$se.fit

names(temp_ts2_feb) <- c('temperatura', 'error_estandar')
temp_ts2_feb <- mask(temp_ts2_feb, vect(region))  # Asegúrate de que region sea un objeto válido

# Calcular métricas para el segundo modelo
met_ts2_feb <- calc_met(temp_ts2_feb[[1]], data_temp_feb)

plot(met_ts2_feb)

Recopilación de los resultados

2.6 Modelos de Regesión Lineal

2.6.1 Preparacion de datos

region <- read_rds('C:/Re6/Geoestadistica/Talleres/data/procesada/reg_nuble_utm.rds')
data_temp_feb <- read_rds('C:/Re6/Geoestadistica/Talleres/data/procesada/data_nuble_temp_con_predictores_feb.rds')
preds_feb <- rast('C:/Re6/Geoestadistica/Talleres/data/procesada/predictores_febrero.tif')
grilla <- preds_feb[[1]]
values(grilla) <- NA
# Muestreo de datos
set.seed(234)
data_temp_mod_feb <- data_temp_feb |> sample_frac(0.8)
data_temp_val_feb <- data_temp_feb |> filter(!(station_id %in% data_temp_mod_feb$station_id))
# Definición de la función de cálculo
calc_met <- function(ras,object_sf,var = 'temp') {
  df_val <- terra::extract(ras,terra::vect(object_sf)) |> 
    cbind(object_sf[,var]) 
  rmse <- function(obs,pred) sqrt(sum((obs-pred)^2)/length(obs))
  rmse_v <- rmse(df_val[,3],df_val[,2])
  r2 <- cor(df_val[,3],df_val[,2])^2
  c('rmse' = rmse_v,'rsq' = r2)
}

2.6.2 Regresión lineal

# Regresión lineal

# Podemos ajustar el modelo de regresión utilizando la función lm (regresion simple), glm (regresión generalizada). Luego utilizar terra::predict para predecir en el raster.

mod_lm1_feb <- lm(temp~dem,data_temp_mod_feb)
temp_mod_lm1_feb <- terra::predict(preds_feb,mod_lm1_feb,se.fit = TRUE)
met_mod_lm1_feb <- calc_met(temp_mod_lm1_feb,data_temp_mod_feb)
print(met_mod_lm1_feb)


val_lm1_feb <- lm(temp~dem,data_temp_val_feb)
temp_val_lm1_feb <- terra::predict(preds_feb,val_lm1_feb,se.fit = TRUE)
met_val_lm1_feb <- calc_met(temp_val_lm1_feb,data_temp_val_feb)
print(met_val_lm1_feb)
# Regresión Utilizando todos los Predictores

mod_lm1_feb_6 <- lm(temp~dem+aspect+slope+dist_costa+ndvi_feb+lst_feb,data_temp_mod_feb)
temp_mod_lm1_feb_6 <- terra::predict(preds_feb,mod_lm1_feb_6,se.fit = TRUE)
met_mod_lm1_feb_6 <- calc_met(temp_mod_lm1_feb_6,data_temp_mod_feb)
print(met_mod_lm1_feb_6)


val_lm1_feb_6 <- lm(temp~dem+aspect+slope+dist_costa+ndvi_feb+lst_feb,data_temp_val_feb)
temp_val_lm1_feb_6 <- terra::predict(preds_feb,val_lm1_feb_6,se.fit = TRUE)
met_val_lm1_feb_6 <- calc_met(temp_val_lm1_feb_6,data_temp_val_feb)

#Dataframe con los resultados
results_summary <- data.frame(
  Método = c("Voronoi", 
             "Vecino más próximo (K=1)", 
             "Vecino más próximo (K=5)", 
             "Vecino más próximo (K=10)", 
             "Inverso de la distancia", 
             "Regresión en coordenadas (1)", 
             "Regresión en coordenadas (2)", 
             "Regresión lineal",
             "Regresión lineal (2)"),
  
  RMSE = c(met_vor["rmse"], 
           met_nn1_feb["rmse"], 
           met_nn5_feb["rmse"], 
           met_nn10_feb["rmse"], 
           met_idw_feb["rmse"], 
           met_ts1_feb["rmse"], 
           met_ts2_feb["rmse"], 
           met_mod_lm1_feb["rmse"],
           met_mod_lm1_feb_2["rmse"]),
  R2 = c(met_vor["rsq"], 
         met_nn1_feb["rsq"], 
         met_nn5_feb["rsq"], 
         met_nn10_feb["rsq"], 
         met_idw_feb["rsq"],
         met_ts1_feb["rsq"], 
         met_ts2_feb["rsq"],
         met_mod_lm1_feb["rsq"],
         met_mod_lm1_feb_2["rsq"]),
  R2_Ajustado = c(NA, 
                  NA, 
                  NA, 
                  NA, 
                  NA,
                  summary(mod.lm1_feb_sf)$adj.r.squared, 
                  summary(mod.lm2_feb_sf)$adj.r.squared,
                  NA,
                  NA)
)

# Mostrar el cuadro resumen
library(knitr)
kable(results_summary, digits =3,align="c")

Recopilación de los resultados

Método RMSE R2 R2_Ajustado
Voronoi 1.484 0.674 NA
Vecino más próximo (k=1) 1.484 0.674 NA
Vecino más próximo (k=5) 1.496 0.683 NA
Vecino más próximo (k=10) 1.615 0.638 NA
Inverso a la distancia 1.770 0.588 NA
Regresión en coordenadas (1) 2.561 0.086 0.551
Regresión en coordenadas (2) 0.824 0.838 0.888
Regresión lineal 19.794 0.823 NA
Regresión lineal (6) 19.748 0.500 NA

3 Julio

3.1 Preparar datos para interpolación

3.1.1 Carga de datos

# Leer la región
region <- read_rds('C:/Re6/Geoestadistica/Talleres/data/procesada/reg_nuble_utm.rds')

# Cargar datos de temperatura
data_temp_jul <- read_rds('C:/Re6/Geoestadistica/Talleres/data/procesada/data_temp_julio.rds')[c('station_id','temp')]
# Muestreo de datos
set.seed(432)
data_temp_mod_jul <- data_temp_jul |> sample_frac(0.8)
data_temp_nuble_jul <- data_temp_jul |> filter(!(station_id %in% data_temp_mod_jul$station_id))
# Definición de la función de cálculo
calc_met <- function(ras,object_sf,var = 'temp') {
  df_nuble <- terra::extract(ras,terra::vect(object_sf)) |> 
    cbind(object_sf[,var]) 
  rmse <- function(obs,pred) sqrt(sum((obs-pred)^2)/length(obs))
  rmse_v <- rmse(df_nuble[,3],df_nuble[,2])
  r2 <- cor(df_nuble[,3],df_nuble[,2])^2
  c('rmse' = rmse_v,'rsq' = r2)
}
# Visualización con tmap
tm_shape(region) + 
  tm_borders() +
  tm_shape(data_temp_jul) +  # Asegúrate de usar el objeto sf
  tm_dots(col = 'temp', title = "Temperatura") +
  tm_layout(legend.outside = TRUE)

3.1.2 Grilla

bb <- st_bbox(region)
grilla <- rast(xmin = bb$xmin,xmax = bb$xmax,
               ymin = bb$ymin,ymax = bb$ymax, 
               res=1000,crs="EPSG:32719") 

grilla_st <- grilla |>   st_as_stars() #como clase stars
class(grilla_st)
grilla |> as.polygons() |> plot()

3.2 Voronoi (Polígonos de Thiessen)

temp_vor_jul <- voronoi(vect(data_temp_mod_jul)) |> 
  terra::rasterize(grilla,'temp') |> 
  mask(vect(region)) 
(met_vor <- calc_met(temp_vor_jul,data_temp_nuble_jul))
plot(temp_vor)

rmse: 1.1103368
rsq: 0.871748

3.3 Vecino más próximo

#K=1
temp_nn <- idw(temp~1, data_temp_mod_jul, grilla_st,nmax=1)
temp_nn_jul <- temp_nn |> rast() |> mask(vect(region)) |> trim() 
(met_nn1_jul <- calc_met(temp_nn_jul[[1]],data_temp_jul))
plot(temp_nn_jul)

rmse: 1.1103367
rsq: 0.871748

#K=5
temp_nn5 <- idw(temp~1, data_temp_mod_jul, grilla_st,nmax=5)
temp_nn5_jul <- temp_nn5 |> rast() |> mask(vect(region)) |> trim() 
(met_nn5_jul <- calc_met(temp_nn5_jul[[1]],data_temp_jul))
plot(temp_nn5_jul)

rmse: 0.8592316
rsq: 0.9238373

#K=10
temp_nn10 <- idw(temp~1, data_temp_mod_jul, grilla_st,nmax=10)
temp_nn10_jul <- temp_nn10 |> rast() |> mask(vect(region)) |> trim() 
(met_nn10_jul <- calc_met(temp_nn10_jul[[1]],data_temp_jul))
plot(temp_nn10_jul)

rmse: 0.8885167
rsq: 0.9295383

3.4 Inverso de la Distancia

temp_idw <- idw(temp~1, data_temp_mod_jul, grilla_st)
temp_idw_jul <- temp_idw |> rast() |> mask(vect(region)) |> trim() 
met_idw_jul <- calc_met(temp_idw_jul[[1]],data_temp_jul)
# Configurar el modo de visualización
tmap_mode("plot")  # Usa "view" si prefieres una visualización interactiva
# Visualizar con tmap
tm_shape(temp_idw_jul[[1]]) +
  tm_raster(style = 'cont',palette = viridis::viridis(20)) +
  tm_shape(region) + 
  tm_borders() +
  tm_shape(data_temp_jul) +
  tm_dots(col='temp',title = "Temperatura (°C)",style = 'jenks',palette = viridis::viridis(10))

3.5 Regresión en coordenadas

data_temp_mod_jul_ <- cbind(data_temp_mod_jul,st_coordinates(data_temp_mod_jul))
mod.lm1_jul <- lm(temp ~ X + Y, data=data_temp_mod_jul_)

mod.lm2_jul <- lm(temp ~ X + Y + I(X^2) + I(Y^2) + I(X*Y), data=data_temp_mod_jul_)

summary(mod.lm1_jul)$r.squared

summary(mod.lm2_jul)$adj.r.squared

summary(mod.lm2_jul)$r.squared

temp_ts_jul <- c(grilla, grilla)
xy <- xyFromCell(grilla,1:ncell(grilla)) |> 
  as_tibble() |> set_names(c('X','Y'))
values(temp_ts_jul[[1]])<-  predict(mod.lm1_jul, newdata=xy)

values(temp_ts_jul[[2]]) <- predict(mod.lm1_jul, newdata=xy,se.fit=TRUE,inerval='prediction')$se.fit
names(temp_ts_jul) <- c('temperatura','error_estandar')
temp <- mask(temp_ts_jul, vect(region))
(met_ts1_jul <- calc_met(temp_ts_jul[[1]],data_temp_mod_jul))

class(grilla)
plot((met_ts1_jul))

rmse: 1.371590
rsq: 0.781705

# Asegúrate de que data_temp_mod sea un objeto sf
data_temp_mod_jul_sf <- cbind(data_temp_mod_jul, st_coordinates(data_temp_mod_jul))

# Ajustar los modelos lineales
mod.lm1_jul_sf <- lm(temp ~ X + Y, data = data_temp_mod_jul_sf)
mod.lm2_jul_sf <- lm(temp ~ X + Y + I(X^2) + I(Y^2) + I(X*Y), data = data_temp_mod_jul_sf)

# Resumen de los modelos
summary(mod.lm1_jul_sf)$r.squared
summary(mod.lm2_jul_sf)$adj.r.squared
summary(mod.lm2_jul_sf)$r.squared
# Usar c() para combinar SpatRaster
temp_ts_jul_2 <- c(grilla, grilla)  

# Crear un data frame de coordenadas
xy <- xyFromCell(grilla, 1:ncell(grilla)) |> 
  as_tibble() |> 
  set_names(c('X', 'Y'))
# Predicciones y creación de rasters "Primer modelo"
values(temp_ts_jul_2[[1]]) <- predict(mod.lm1_jul, newdata = xy)
values(temp_ts_jul_2[[2]]) <- predict(mod.lm1_jul, newdata = xy, se.fit = TRUE, interval = 'prediction')$se.fit

names(temp_ts_jul_2) <- c('temperatura', 'error_estandar')
temp <- mask(temp_ts_jul_2, vect(region))  # Asegurarse de que region sea un objeto válido

# Calcular métricas para el primer modelo
met_ts1_jul_2 <- calc_met(temp_ts_jul_2[[1]], data_temp_jul)
# Predicciones y creación de rasters "Segundo modelo"
temp_ts2_jul <- c(grilla, grilla)  # Usar c() para el segundo conjunto de rasters
values(temp_ts2_jul[[1]]) <- predict(mod.lm2_jul_sf, newdata = xy)
values(temp_ts2_jul[[2]]) <- predict(mod.lm2_jul_sf, newdata = xy, se.fit = TRUE, interval = 'prediction')$se.fit

names(temp_ts2_jul) <- c('temperatura', 'error_estandar')
temp_ts2_jul <- mask(temp_ts2_jul, vect(region))  # Asegúrate de que region sea un objeto válido

# Calcular métricas para el segundo modelo
met_ts2_jul <- calc_met(temp_ts2_jul[[1]], data_temp_jul)

plot(met_ts2_jul)

Recopilación de los resultados

3.6 Modelos de Regesión Lineal

3.6.1 Preparacion de datos

region <- read_rds('C:/Re6/Geoestadistica/Talleres/data/procesada/reg_nuble_utm.rds')
data_temp_jul <- read_rds('C:/Re6/Geoestadistica/Talleres/data/procesada/data_nuble_temp_con_predictores_jul.rds')
preds_jul <- rast('C:/Re6/Geoestadistica/Talleres/data/procesada/predictores_julio.tif')
grilla <- preds_jul[[1]]
values(grilla) <- NA
# Muestreo de datos
set.seed(234)
data_temp_mod_jul <- data_temp_jul |> sample_frac(0.8)
data_temp_val_jul <- data_temp_jul |> filter(!(station_id %in% data_temp_mod_jul$station_id))
# Definición de la función de cálculo
calc_met <- function(ras,object_sf,var = 'temp') {
  df_val <- terra::extract(ras,terra::vect(object_sf)) |> 
    cbind(object_sf[,var]) 
  rmse <- function(obs,pred) sqrt(sum((obs-pred)^2)/length(obs))
  rmse_v <- rmse(df_val[,3],df_val[,2])
  r2 <- cor(df_val[,3],df_val[,2])^2
  c('rmse' = rmse_v,'rsq' = r2)
}

3.6.2 Regresión lineal

# Regresión lineal

# Podemos ajustar el modelo de regresión utilizando la función lm (regresion simple), glm (regresión generalizada). Luego utilizar terra::predict para predecir en el raster.

mod_lm1_jul <- lm(temp~dem,data_temp_mod_jul)
temp_mod_lm1_jul <- terra::predict(preds_jul,mod_lm1_jul,se.fit = TRUE)
met_mod_lm1_jul <- calc_met(temp_mod_lm1_jul,data_temp_mod_jul)
print(met_mod_lm1_jul)


val_lm1_jul <- lm(temp~dem,data_temp_val_jul)
temp_val_lm1_jul <- terra::predict(preds_jul,val_lm1_jul,se.fit = TRUE)
met_val_lm1_jul <- calc_met(temp_val_lm1_jul,data_temp_val_jul)
print(met_val_lm1_jul)
# Regresión Utilizando todos los Predictores

mod_lm1_jul_6 <- lm(temp~dem+aspect+slope+dist_costa+ndvi_jul+lst_jul,data_temp_mod_jul)
temp_mod_lm1_jul_6 <- terra::predict(preds_jul,mod_lm1_jul_6,se.fit = TRUE)
met_mod_lm1_jul_6 <- calc_met(temp_mod_lm1_jul_6,data_temp_mod_jul)
print(met_mod_lm1_jul_6)


val_lm1_jul_6 <- lm(temp~dem+aspect+slope+dist_costa+ndvi_jul+lst_jul,data_temp_val_jul)
temp_val_lm1_jul_6 <- terra::predict(preds_jul,val_lm1_jul_6,se.fit = TRUE)
met_val_lm1_jul_6 <- calc_met(temp_val_lm1_jul_6,data_temp_val_jul)
#Dataframe con los resultados
results_summary <- data.frame(
  Método = c("Voronoi", 
             "Vecino más próximo (K=1)", 
             "Vecino más próximo (K=5)", 
             "Vecino más próximo (K=10)", 
             "Inverso de la distancia", 
             "Regresión en coordenadas (1)", 
             "Regresión en coordenadas (2)", 
             "Regresión lineal",
             "Regresión lineal (6)"),
  
  RMSE = c(met_vor["rmse"], 
           met_nn1_jul["rmse"], 
           met_nn5_jul["rmse"], 
           met_nn10_jul["rmse"], 
           met_idw_jul["rmse"], 
           met_ts1_jul["rmse"], 
           met_ts2_jul["rmse"], 
           met_mod_lm1_jul["rmse"],
           met_mod_lm1_jul_6["rmse"]),
  R2 = c(met_vor["rsq"], 
         met_nn1_jul["rsq"], 
         met_nn5_jul["rsq"], 
         met_nn10_jul["rsq"], 
         met_idw_jul["rsq"], 
         met_ts1_jul["rsq"], 
         met_ts2_jul["rsq"], 
         met_mod_lm1_jul["rsq"],
         met_mod_lm1_jul_6["rsq"]),
  R2_Ajustado = c(NA, 
                  NA, 
                  NA, 
                  NA, 
                  NA,
                  summary(mod.lm1_jul_sf)$adj.r.squared, 
                  summary(mod.lm2_jul_sf)$adj.r.squared,
                  NA,
                  NA)
)

# Mostrar el cuadro resumen
library(knitr)
kable(results_summary, digits =3,align="c")

Recopilación de los resultados

Método RMSE R2 R2_Ajustado
Voronoi 1.110 0.872 NA
Vecino más próximo (k=1) 1.110 0.872 NA
Vecino más próximo (k=5) 0.859 0.924 NA
Vecino más próximo (k=10) 0.889 0.930 NA
Inverso a la distancia 1.255 0.910 NA
Regresión en coordenadas (1) 1.372 0.782 0.722
Regresión en coordenadas (2) 0.799 0.914 0.937
Regresión lineal 7.497 0.823 NA
Regresión lineal (6) 7.443 0.571 NA

4 septiembre

4.1 Preparar datos para interpolación

4.1.1 Carga de datos

# Leer la región
region <- read_rds('C:/Re6/Geoestadistica/Talleres/data/procesada/reg_nuble_utm.rds')

# Cargar datos de temperatura
data_temp_sept <- read_rds('C:/Re6/Geoestadistica/Talleres/data/procesada/data_temp_septiembre.rds')[c('station_id','temp')]
# Muestreo de datos
set.seed(432)
data_temp_mod_sept <- data_temp_sept |> sample_frac(0.8)
data_temp_nuble_sept <- data_temp_sept |> filter(!(station_id %in% data_temp_mod_sept$station_id))
# Definición de la función de cálculo
calc_met <- function(ras,object_sf,var = 'temp') {
  df_nuble <- terra::extract(ras,terra::vect(object_sf)) |> 
    cbind(object_sf[,var]) 
  rmse <- function(obs,pred) sqrt(sum((obs-pred)^2)/length(obs))
  rmse_v <- rmse(df_nuble[,3],df_nuble[,2])
  r2 <- cor(df_nuble[,3],df_nuble[,2])^2
  c('rmse' = rmse_v,'rsq' = r2)
}
# Visualización con tmap
tm_shape(region) + 
  tm_borders() +
  tm_shape(data_temp_sept) +  # Asegúrate de usar el objeto sf
  tm_dots(col = 'temp', title = "Temperatura") +
  tm_layout(legend.outside = TRUE)

4.1.2 Grilla

bb <- st_bbox(region)
grilla <- rast(xmin = bb$xmin,xmax = bb$xmax,
               ymin = bb$ymin,ymax = bb$ymax, 
               res=1000,crs="EPSG:32719") 

grilla_st <- grilla |>   st_as_stars() #como clase stars
class(grilla_st)
grilla |> as.polygons() |> plot()

4.2 Voronoi (Polígonos de Thiessen)

temp_vor_sept <- voronoi(vect(data_temp_mod_sept)) |> 
  terra::rasterize(grilla,'temp') |> 
  mask(vect(region)) 
(met_vor <- calc_met(temp_vor_sept,data_temp_nuble_sept))
plot(temp_vor)

rmse: 0.7928260
rsq: 0.9416366

4.3 Vecino más próximo

#K=1
temp_nn <- idw(temp~1, data_temp_mod_sept, grilla_st,nmax=1)
temp_nn_sept <- temp_nn |> rast() |> mask(vect(region)) |> trim() 
(met_nn1_sept <- calc_met(temp_nn_sept[[1]],data_temp_sept))
plot(temp_nn_sept)

rmse: 0.7928259
rsq: 0.9416366

#K=5
temp_nn5 <- idw(temp~1, data_temp_mod_sept, grilla_st,nmax=5)
temp_nn5_sept <- temp_nn5 |> rast() |> mask(vect(region)) |> trim() 
(met_nn5_sept <- calc_met(temp_nn5_sept[[1]],data_temp_sept))
plot(temp_nn5_sept)

rmse: 0.7055862
rsq: 0.9539346

#K=10
temp_nn10 <- idw(temp~1, data_temp_mod_sept, grilla_st,nmax=10)
temp_nn10_sept <- temp_nn10 |> rast() |> mask(vect(region)) |> trim() 
(met_nn10_sept <- calc_met(temp_nn10_sept[[1]],data_temp_sept))
plot(temp_nn10_sept)

rmse: 0.7389683
rsq: 0.9584372

4.4 Inverso de la Distancia

temp_idw <- idw(temp~1, data_temp_mod_sept, grilla_st)
temp_idw_sept <- temp_idw |> rast() |> mask(vect(region)) |> trim() 
met_idw_sept <- calc_met(temp_idw_sept[[1]],data_temp_sept)
# Configurar el modo de visualización
tmap_mode("plot")  # Usa "view" si prefieres una visualización interactiva
# Visualizar con tmap
tm_shape(temp_idw_sept[[1]]) +
  tm_raster(style = 'cont',palette = viridis::viridis(20)) +
  tm_shape(region) + 
  tm_borders() +
  tm_shape(data_temp_sept) +
  tm_dots(col='temp',title = "Temperatura (°C)",style = 'jenks',palette = viridis::viridis(10))

4.5 Regresión en coordenadas

data_temp_mod_sept_ <- cbind(data_temp_mod_sept,st_coordinates(data_temp_mod_sept))
mod.lm1_sept <- lm(temp ~ X + Y, data=data_temp_mod_sept_)

mod.lm2_sept <- lm(temp ~ X + Y + I(X^2) + I(Y^2) + I(X*Y), data=data_temp_mod_sept_)

summary(mod.lm1_sept)$r.squared

summary(mod.lm2_sept)$adj.r.squared

summary(mod.lm2_sept)$r.squared

temp_ts_sept <- c(grilla, grilla)
xy <- xyFromCell(grilla,1:ncell(grilla)) |> 
  as_tibble() |> set_names(c('X','Y'))
values(temp_ts_sept[[1]])<-  predict(mod.lm1_sept, newdata=xy)

values(temp_ts_sept[[2]]) <- predict(mod.lm1_sept, newdata=xy,se.fit=TRUE,inerval='prediction')$se.fit
names(temp_ts_sept) <- c('temperatura','error_estandar')
temp <- mask(temp_ts_sept, vect(region))
(met_ts1_sept <- calc_met(temp_ts_sept[[1]],data_temp_mod_sept))

class(grilla)
plot((met_ts1_sept))

rmse: 1.6882437
rsq: 0.7494381

# Asegúrate de que data_temp_mod sea un objeto sf
data_temp_mod_sept_sf <- cbind(data_temp_mod_sept, st_coordinates(data_temp_mod_sept))

# Ajustar los modelos lineales
mod.lm1_sept_sf <- lm(temp ~ X + Y, data = data_temp_mod_sept_sf)
mod.lm2_sept_sf <- lm(temp ~ X + Y + I(X^2) + I(Y^2) + I(X*Y), data = data_temp_mod_sept_sf)

# Resumen de los modelos
summary(mod.lm1_sept_sf)$r.squared
summary(mod.lm2_sept_sf)$adj.r.squared
summary(mod.lm2_sept_sf)$r.squared
# Usar c() para combinar SpatRaster
temp_ts_sept_2 <- c(grilla, grilla)  

# Crear un data frame de coordenadas
xy <- xyFromCell(grilla, 1:ncell(grilla)) |> 
  as_tibble() |> 
  set_names(c('X', 'Y'))
# Predicciones y creación de rasters "Primer modelo"
values(temp_ts_sept_2[[1]]) <- predict(mod.lm1_sept, newdata = xy)
values(temp_ts_sept_2[[2]]) <- predict(mod.lm1_sept, newdata = xy, se.fit = TRUE, interval = 'prediction')$se.fit

names(temp_ts_sept_2) <- c('temperatura', 'error_estandar')
temp <- mask(temp_ts_sept_2, vect(region))  # Asegurarse de que region sea un objeto válido

# Calcular métricas para el primer modelo
met_ts1_sept_2 <- calc_met(temp_ts_sept_2[[1]], data_temp_sept)
# Predicciones y creación de rasters "Segundo modelo"
temp_ts2_sept <- c(grilla, grilla)  # Usar c() para el segundo conjunto de rasters
values(temp_ts2_sept[[1]]) <- predict(mod.lm2_sept_sf, newdata = xy)
values(temp_ts2_sept[[2]]) <- predict(mod.lm2_sept_sf, newdata = xy, se.fit = TRUE, interval = 'prediction')$se.fit

names(temp_ts2_sept) <- c('temperatura', 'error_estandar')
temp_ts2_sept <- mask(temp_ts2_sept, vect(region))  # Asegúrate de que region sea un objeto válido

# Calcular métricas para el segundo modelo
met_ts2_sept <- calc_met(temp_ts2_sept[[1]], data_temp_sept)

plot(met_ts2_sept)

Recopilación de los resultados

4.6 Modelos de Regesión Lineal

4.6.1 Preparacion de datos

region <- read_rds('C:/Re6/Geoestadistica/Talleres/data/procesada/reg_nuble_utm.rds')
data_temp_sept <- read_rds('C:/Re6/Geoestadistica/Talleres/data/procesada/data_nuble_temp_con_predictores_sept.rds')
preds_sept <- rast('C:/Re6/Geoestadistica/Talleres/data/procesada/predictores_septiembre.tif')
grilla <- preds_sept[[1]]
values(grilla) <- NA
# Muestreo de datos
set.seed(234)
data_temp_mod_sept <- data_temp_sept |> sample_frac(0.8)
data_temp_val_sept <- data_temp_sept |> filter(!(station_id %in% data_temp_mod_sept$station_id))
# Definición de la función de cálculo
calc_met <- function(ras,object_sf,var = 'temp') {
  df_val <- terra::extract(ras,terra::vect(object_sf)) |> 
    cbind(object_sf[,var]) 
  rmse <- function(obs,pred) sqrt(sum((obs-pred)^2)/length(obs))
  rmse_v <- rmse(df_val[,3],df_val[,2])
  r2 <- cor(df_val[,3],df_val[,2])^2
  c('rmse' = rmse_v,'rsq' = r2)
}

4.6.2 Regresión lineal

# Regresión lineal

# Podemos ajustar el modelo de regresión utilizando la función lm (regresion simple), glm (regresión generalizada). Luego utilizar terra::predict para predecir en el raster.

mod_lm1_sept <- lm(temp~dem,data_temp_mod_sept)
temp_mod_lm1_sept <- terra::predict(preds_sept,mod_lm1_sept,se.fit = TRUE)
met_mod_lm1_sept <- calc_met(temp_mod_lm1_sept,data_temp_mod_sept)
print(met_mod_lm1_sept)


val_lm1_sept <- lm(temp~dem,data_temp_val_sept)
temp_val_lm1_sept <- terra::predict(preds_sept,val_lm1_sept,se.fit = TRUE)
met_val_lm1_sept <- calc_met(temp_val_lm1_sept,data_temp_val_sept)
print(met_val_lm1_sept)
# Regresión Utilizando todos los Predictores

mod_lm1_sept_6 <- lm(temp~dem+aspect+slope+dist_costa+ndvi_sept+lst_sept,data_temp_mod_sept)
temp_mod_lm1_sept_6 <- terra::predict(preds_sept,mod_lm1_sept_6,se.fit = TRUE)
met_mod_lm1_sept_6 <- calc_met(temp_mod_lm1_sept_6,data_temp_mod_sept)
print(met_mod_lm1_sept_6)


val_lm1_sept_6 <- lm(temp~dem+aspect+slope+dist_costa+ndvi_sept+lst_sept,data_temp_val_sept)
temp_val_lm1_sept_6 <- terra::predict(preds_sept,val_lm1_sept_6,se.fit = TRUE)
met_val_lm1_sept_6 <- calc_met(temp_val_lm1_sept_6,data_temp_val_sept)
#Dataframe con los resultados
results_summary <- data.frame(
  Método = c("Voronoi", 
             "Vecino más próximo (K=1)", 
             "Vecino más próximo (K=5)", 
             "Vecino más próximo (K=10)", 
             "Inverso de la distancia", 
             "Regresión en coordenadas (1)", 
             "Regresión en coordenadas (2)", 
             "Regresión lineal",
             "Regresión lineal (6)"),
  
  RMSE = c(met_vor["rmse"], 
           met_nn1_sept["rmse"], 
           met_nn5_sept["rmse"], 
           met_nn10_sept["rmse"], 
           met_idw_sept["rmse"], 
           met_ts1_sept["rmse"], 
           met_ts2_sept["rmse"], 
           met_mod_lm1_sept["rmse"],
           met_mod_lm1_sept_6["rmse"]),
  R2 = c(met_vor["rsq"], 
         met_nn1_sept["rsq"], 
         met_nn5_sept["rsq"], 
         met_nn10_sept["rsq"], 
         met_idw_sept["rsq"], 
         met_ts1_sept["rsq"], 
         met_ts2_sept["rsq"],
         met_mod_lm1_sept["rsq"],
         met_mod_lm1_sept_6["rsq"]),
  R2_Ajustado = c(NA, 
                  NA, 
                  NA, 
                  NA, 
                  NA,
                  summary(mod.lm1_sept_sf)$adj.r.squared, 
                  summary(mod.lm2_sept_sf)$adj.r.squared,
                  NA,
                  NA) # Asegúrate de que el número de elementos sea consistente
)

# Mostrar el cuadro resumen
library(knitr)
kable(results_summary, digits =3,align="c")

Recopilación de los resultados

Método RMSE R2 R2_Ajustado
Voronoi 0.793 0.942 NA
Vecino más próximo (k=1) 0.793 0.942 NA
Vecino más próximo (k=5) 0.706 0.954 NA
Vecino más próximo (k=10) 0.739 0.958 NA
Inverso a la distancia 1.207 0.938 NA
Regresión en coordenadas (1) 1.688 0.749 0.709
Regresión en coordenadas (2) 0.867 0.926 0.955
Regresión lineal 8.810 0.823 NA
Regresión lineal (6) 8.760 0.574 NA

5 Noviembre

5.1 Preparar datos para interpolación

5.1.1 Carga de datos

# Leer la región
region <- read_rds('C:/Re6/Geoestadistica/Talleres/data/procesada/reg_nuble_utm.rds')

# Cargar datos de temperatura
data_temp_novt <- read_rds('C:/Re6/Geoestadistica/Talleres/data/procesada/data_temp_noviembre.rds')[c('station_id','temp')]
# Muestreo de datos
set.seed(432)
data_temp_mod_novt <- data_temp_novt |> sample_frac(0.8)
data_temp_nuble_novt <- data_temp_novt |> filter(!(station_id %in% data_temp_mod_novt$station_id))
# Definición de la función de cálculo
calc_met <- function(ras,object_sf,var = 'temp') {
  df_nuble <- terra::extract(ras,terra::vect(object_sf)) |> 
    cbind(object_sf[,var]) 
  rmse <- function(obs,pred) sqrt(sum((obs-pred)^2)/length(obs))
  rmse_v <- rmse(df_nuble[,3],df_nuble[,2])
  r2 <- cor(df_nuble[,3],df_nuble[,2])^2
  c('rmse' = rmse_v,'rsq' = r2)
}
# Visualización con tmap
tm_shape(region) + 
  tm_borders() +
  tm_shape(data_temp_novt) +  # Asegúrate de usar el objeto sf
  tm_dots(col = 'temp', title = "Temperatura") +
  tm_layout(legend.outside = TRUE)

5.1.2 Grilla

bb <- st_bbox(region)
grilla <- rast(xmin = bb$xmin,xmax = bb$xmax,
               ymin = bb$ymin,ymax = bb$ymax, 
               res=1000,crs="EPSG:32719") 

grilla_st <- grilla |>   st_as_stars() #como clase stars
class(grilla_st)
grilla |> as.polygons() |> plot()

5.2 Voronoi (Polígonos de Thiessen)

temp_vor_novt <- voronoi(vect(data_temp_mod_novt)) |> 
  terra::rasterize(grilla,'temp') |> 
  mask(vect(region)) 
(met_vor <- calc_met(temp_vor_novt,data_temp_nuble_novt))
plot(temp_vor)

rmse: 0.6991380
rsq: 0.9372314

5.3 Vecino más próximo

#K=1
temp_nn <- idw(temp~1, data_temp_mod_novt, grilla_st,nmax=1)
temp_nn_novt <- temp_nn |> rast() |> mask(vect(region)) |> trim() 
(met_nn1_novt <- calc_met(temp_nn_novt[[1]],data_temp_novt))
plot(temp_nn_novt)

rmse: 0.6991380
rsq: 0.9372314

#K=5
temp_nn5 <- idw(temp~1, data_temp_mod_novt, grilla_st,nmax=5)
temp_nn5_novt <- temp_nn5 |> rast() |> mask(vect(region)) |> trim() 
(met_nn5_novt <- calc_met(temp_nn5_novt[[1]],data_temp_novt))
plot(temp_nn5_novt)

rmse: 0.6514114
rsq: 0.9449036

#K=10
temp_nn10 <- idw(temp~1, data_temp_mod_novt, grilla_st,nmax=10)
temp_nn10_novt <- temp_nn10 |> rast() |> mask(vect(region)) |> trim() 
(met_nn10_novt <- calc_met(temp_nn10_novt[[1]],data_temp_novt))
plot(temp_nn10_novt)

rmse: 0.6667952
rsq: 0.9502888

5.4 Inverso de la Distancia

temp_idw <- idw(temp~1, data_temp_mod_novt, grilla_st)
temp_idw_novt <- temp_idw |> rast() |> mask(vect(region)) |> trim() 
met_idw_novt <- calc_met(temp_idw_novt[[1]],data_temp_novt)
# Configurar el modo de visualización
tmap_mode("plot")  # Usa "view" si prefieres una visualización interactiva
# Visualizar con tmap
tm_shape(temp_idw_novt[[1]]) +
  tm_raster(style = 'cont',palette = viridis::viridis(20)) +
  tm_shape(region) + 
  tm_borders() +
  tm_shape(data_temp_novt) +
  tm_dots(col='temp',title = "Temperatura (°C)",style = 'jenks',palette = viridis::viridis(10))

5.5 Regresión en coordenadas

data_temp_mod_novt_ <- cbind(data_temp_mod_novt,st_coordinates(data_temp_mod_novt))
mod.lm1_novt <- lm(temp ~ X + Y, data=data_temp_mod_novt_)

mod.lm2_novt <- lm(temp ~ X + Y + I(X^2) + I(Y^2) + I(X*Y), data=data_temp_mod_novt_)

summary(mod.lm1_novt)$r.squared

summary(mod.lm2_novt)$adj.r.squared

summary(mod.lm2_novt)$r.squared

temp_ts_novt <- c(grilla, grilla)
xy <- xyFromCell(grilla,1:ncell(grilla)) |> 
  as_tibble() |> set_names(c('X','Y'))
values(temp_ts_novt[[1]])<-  predict(mod.lm1_novt, newdata=xy)

values(temp_ts_novt[[2]]) <- predict(mod.lm1_novt, newdata=xy,se.fit=TRUE,inerval='prediction')$se.fit
names(temp_ts_novt) <- c('temperatura','error_estandar')
temp <- mask(temp_ts_novt, vect(region))
(met_ts1_novt <- calc_met(temp_ts_novt[[1]],data_temp_mod_novt))

class(grilla)
plot((met_ts1_novt))

rmse: 1.6760755
rsq: 0.6533929

# Asegúrate de que data_temp_mod sea un objeto sf
data_temp_mod_novt_sf <- cbind(data_temp_mod_novt, st_coordinates(data_temp_mod_novt))

# Ajustar los modelos lineales
mod.lm1_novt_sf <- lm(temp ~ X + Y, data = data_temp_mod_novt_sf)
mod.lm2_novt_sf <- lm(temp ~ X + Y + I(X^2) + I(Y^2) + I(X*Y), data = data_temp_mod_novt_sf)

# Resumen de los modelos
summary(mod.lm1_novt_sf)$r.squared
summary(mod.lm2_novt_sf)$adj.r.squared
summary(mod.lm2_novt_sf)$r.squared
# Usar c() para combinar SpatRaster
temp_ts_novt_2 <- c(grilla, grilla)  

# Crear un data frame de coordenadas
xy <- xyFromCell(grilla, 1:ncell(grilla)) |> 
  as_tibble() |> 
  set_names(c('X', 'Y'))
# Predicciones y creación de rasters "Primer modelo"
values(temp_ts_novt_2[[1]]) <- predict(mod.lm1_novt, newdata = xy)
values(temp_ts_novt_2[[2]]) <- predict(mod.lm1_novt, newdata = xy, se.fit = TRUE, interval = 'prediction')$se.fit

names(temp_ts_novt_2) <- c('temperatura', 'error_estandar')
temp <- mask(temp_ts_novt_2, vect(region))  # Asegurarse de que region sea un objeto válido

# Calcular métricas para el primer modelo
met_ts1_novt_2 <- calc_met(temp_ts_novt_2[[1]], data_temp_novt)
# Predicciones y creación de rasters "Segundo modelo"
temp_ts2_novt <- c(grilla, grilla)  # Usar c() para el segundo conjunto de rasters
values(temp_ts2_novt[[1]]) <- predict(mod.lm2_novt_sf, newdata = xy)
values(temp_ts2_novt[[2]]) <- predict(mod.lm2_novt_sf, newdata = xy, se.fit = TRUE, interval = 'prediction')$se.fit

names(temp_ts2_novt) <- c('temperatura', 'error_estandar')
temp_ts2_novt <- mask(temp_ts2_novt, vect(region))  # Asegúrate de que region sea un objeto válido

# Calcular métricas para el segundo modelo
met_ts2_novt <- calc_met(temp_ts2_novt[[1]], data_temp_novt)

plot(met_ts2_novt)

Recopilación de los resultados

5.6 Modelos de Regesión Lineal

5.6.1 Preparacion de datos

region <- read_rds('C:/Re6/Geoestadistica/Talleres/data/procesada/reg_nuble_utm.rds')
data_temp_nov <- read_rds('C:/Re6/Geoestadistica/Talleres/data/procesada/data_nuble_temp_con_predictores_nov.rds')
preds_nov <- rast('C:/Re6/Geoestadistica/Talleres/data/procesada/predictores_noviembre.tif')
grilla <- preds_nov[[1]]
values(grilla) <- NA
# Muestreo de datos
set.seed(234)
data_temp_mod_nov <- data_temp_nov |> sample_frac(0.8)
data_temp_val_nov <- data_temp_nov |> filter(!(station_id %in% data_temp_mod_nov$station_id))
# Definición de la función de cálculo
calc_met <- function(ras,object_sf,var = 'temp') {
  df_val <- terra::extract(ras,terra::vect(object_sf)) |> 
    cbind(object_sf[,var]) 
  rmse <- function(obs,pred) sqrt(sum((obs-pred)^2)/length(obs))
  rmse_v <- rmse(df_val[,3],df_val[,2])
  r2 <- cor(df_val[,3],df_val[,2])^2
  c('rmse' = rmse_v,'rsq' = r2)
}

5.6.2 Regresión lineal

# Regresión lineal

# Podemos ajustar el modelo de regresión utilizando la función lm (regresion simple), glm (regresión generalizada). Luego utilizar terra::predict para predecir en el raster.

mod_lm1_nov <- lm(temp~dem,data_temp_mod_nov)
temp_mod_lm1_nov <- terra::predict(preds_nov,mod_lm1_nov,se.fit = TRUE)
met_mod_lm1_nov <- calc_met(temp_mod_lm1_nov,data_temp_mod_nov)
print(met_mod_lm1_nov)


val_lm1_nov <- lm(temp~dem,data_temp_val_nov)
temp_val_lm1_nov <- terra::predict(preds_nov,val_lm1_nov,se.fit = TRUE)
met_val_lm1_nov <- calc_met(temp_val_lm1_nov,data_temp_val_nov)
print(met_val_lm1_nov)
# Regresión Utilizando todos los Predictores

mod_lm1_nov_6 <- lm(temp~dem+aspect+slope+dist_costa+ndvi_nov+lst_nov,data_temp_mod_nov)
temp_mod_lm1_nov_6 <- terra::predict(preds_nov,mod_lm1_nov_6,se.fit = TRUE)
met_mod_lm1_nov_6 <- calc_met(temp_mod_lm1_nov_6,data_temp_mod_nov)
print(met_mod_lm1_nov_6)


val_lm1_nov_6 <- lm(temp~dem+aspect+slope+dist_costa+ndvi_nov+lst_nov,data_temp_val_nov)
temp_val_lm1_nov_6 <- terra::predict(preds_nov,val_lm1_nov_6,se.fit = TRUE)
met_val_lm1_nov_6 <- calc_met(temp_val_lm1_nov_6,data_temp_val_nov)
#Dataframe con los resultados
results_summary <- data.frame(
  Método = c("Voronoi", 
             "Vecino más próximo (K=1)", 
             "Vecino más próximo (K=5)", 
             "Vecino más próximo (K=10)", 
             "Inverso de la distancia", 
             "Regresión en coordenadas (1)", 
             "Regresión en coordenadas (2)", 
             "Regresión lineal",
             "Regresión lineal (6)"),
  
  RMSE = c(met_vor["rmse"], 
           met_nn1_nov["rmse"], 
           met_nn5_nov["rmse"], 
           met_nn10_nov["rmse"], 
           met_idw_nov["rmse"], 
           met_ts1_nov["rmse"], 
           met_ts2_nov["rmse"], 
           met_mod_lm1_nov["rmse"],
           met_mod_lm1_nov_6["rmse"]),
  R2 = c(met_vor["rsq"], 
         met_nn1_nov["rsq"], 
         met_nn5_nov["rsq"], 
         met_nn10_nov["rsq"], 
         met_idw_nov["rsq"], 
         met_ts1_nov["rsq"], 
         met_ts2_nov["rsq"], 
         met_mod_lm1_nov["rsq"],
         met_mod_lm1_nov_6["rsq"]),
  R2_Ajustado = c(NA, 
                  NA, 
                  NA, 
                  NA, 
                  NA,
                  summary(mod.lm1_nov_sf)$adj.r.squared, 
                  summary(mod.lm2_nov_sf)$adj.r.squared,
                  NA,
                  NA)
)

# Mostrar el cuadro resumen
library(knitr)
kable(results_summary, digits =3,align="c")

Recopilación de los resultados

Método RMSE R2 R2_Ajustado
Voronoi 0.699 0.937 NA
Vecino más próximo (k=1) 0.699 0.937 NA
Vecino más próximo (k=5) 0.651 0.945 NA
Vecino más próximo (k=10) 0.667 0.950 NA
Inverso a la distancia 1.042 0.928 NA
Regresión en coordenadas (1) 1.676 0.653 0.651
Regresión en coordenadas (2) 0.717 0.930 0.959
Regresión lineal 12.261 0.823 NA
Regresión lineal (6) 12.207 0.418 NA

6 Discusión

6.1 Discusión de Resultados Febrero

  • Los métodos de Voronoi y vecino más próximo (k=1) presentan el RMSE más bajo, 1.484, lo que indica una buena precisión. Sin embargo, los métodos vecino más próximo (k=5) muestra un rendimiento superior, con RMSE de 0.683, respectivamente.

  • En cuanto al R², el vecino más próximo (k=5) destaca con un valor de 0.683, seguido por el k=1 con 0.674 y el inverso a la distancia con 0.910. La regresión en coordenadas (2) también se distingue con un R² ajustado de 0.838 y un R² ajustado de 0.888, lo que indica una alta capacidad explicativa. Por el contrario, la regresión en coordenadas (1) registra un R² ajustado de 0.551, inferior al de la regresión en coordenadas (2).

  • La regresión lineal con un predictor, muestra un RMSE de 19.794 y un R² de 0.823, lo que sugiere un desempeño deficiente en comparación con los métodos mencionados.

  • En conclusión, los métodos de vecino más próximo (k=1 y k=5) son los más precisos y explicativos, mientras que la regresión en coordenadas (2) logra un balance efectivo entre complejidad y capacidad explicativa. La selección del método debe basarse en la precisión y la capacidad de explicar la variabilidad de los datos.

6.2 Discusión de Resultados Julio

  • Los métodos de vecino más próximo (k=5 ) presenta el RMSE más bajo, 0,859, indicando alta precisión. Sin embargo, el vecino más próximo (k=10) ofrece un rendimiento superior con RMSE de 0.889 y R² de.0,93.

  • En cuanto al R², el vecino más próximo (k=5) alcanza 0.924, seguido por el k=10 con 0.930 y el inverso a la distancia con 0.910. La regresión en coordenadas (2) destaca con R² de 0.914 y R² ajustado de 0.937, superando a la regresión en coordenadas (1), que tiene un R² ajustado de 0.722.

  • La regresión lineal muestra un RMSE elevado de 7.497 y un R² de 0.823, lo que indica un desempeño deficiente.

  • En conclusión, los métodos de vecino más próximo (k=5 y k=10) son los más precisos y explicativos, mientras que la regresión en coordenadas (2) ofrece un balance efectivo entre complejidad y capacidad explicativa. La selección del método debe basarse en la precisión y la capacidad para explicar la variabilidad de los datos

6.3 Discusión de Resultados Septiembre

  • Los métodos de Voronoi y vecino más próximo (k=1) presentan un RMSE de 0.793, indicando buena precisión. El vecino más próximo (k=5) muestra un rendimiento superior con un RMSE de 0.706, seguido por k=10 con 0.739.

  • En cuanto al R², el vecino más próximo (k=5) alcanza 0.954, y k=10 llega a 0.958. La regresión en coordenadas (2) tiene un R² de 0.926 y un R² ajustado de 0.955, demostrando alta capacidad explicativa. En contraste, la regresión en coordenadas (1) presenta un R² ajustado de 0.749.

  • La regresión lineal registra un RMSE de 8.810 y un R² de 0.823, reflejando un desempeño deficiente.

  • En conclusión, los métodos de vecino más próximo (k=5 y k=10) son los más precisos y explicativos, mientras que la regresión en coordenadas (2) ofrece un buen equilibrio entre complejidad y ajuste. La selección del método debe priorizar la precisión y la capacidad explicativa.

6.4 Discusión de Resultados Noviembre

  • Los métodos de Voronoi y vecino más próximo (k=1) presentan un RMSE de 0.699, indicando una buena precisión. El vecino más próximo (k=5) muestra un rendimiento superior con un RMSE de 0.651, seguido por k=10 con 0.667.

  • En términos de R², el vecino más próximo (k=10) alcanza 0.950, mientras que k=5 llega a 0.945. La regresión en coordenadas (2) tiene un R² de 0.930 y un R² ajustado de 0.959, lo que refleja una alta capacidad explicativa. En contraste, la regresión en coordenadas (1) presenta un R² ajustado de 0.651, lo que es inferior a los modelos mencionados.

  • La regresión lineal registra un RMSE de 12.261 y un R² de 0.823, lo que sugiere un desempeño deficiente.

  • En conclusión, los métodos de vecino más próximo (k=5 y k=10) son los más precisos y explicativos, mientras que la regresión en coordenadas (2) proporciona un buen equilibrio entre complejidad y ajuste. La elección del método debe priorizar tanto la precisión como la capacidad explicativa.