library(dplyr)
library(ggplot2)
library(lubridate)
library(sf)
library(terra)
library(tmap)
library(stars)
library(gstat)
library(viridis)
library(readr)Geoestadistica
Taller 2: Métodos de predicción espacial determinísticos y de regresión
1 SETUP
1.1 Cargar Librerías
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.