1. Introducción:
Este cuaderno de interpolacion espacial nos va aservir a ver las
funciones de distintas librerias como lo son:
library(sp),library(terra),library(sf),library(stars),library(gstat),library(automap),
library(leaflet),library(leafem),library(ggplot2),library(dplyr). Todo
esto nos va a ayudar a crear una vision de lo que es una interpolacion
espacial del departamento del Cauca. Para lo sigueinte podemos decir que
en este cuaderno vamos a ver lo que es la interpolación lo cual es una
técnica fundamental en geomática que permite estimar valores
desconocidos de una variable geoespacial,como la altitud, la temperatura
o la humedad del suelo, en ubicaciones donde no se han realizado
mediciones directas, a partir de un conjunto de datos conocidos. Por lo
anteiror vamos a ver lo que es el metdod OK (ordinary Kriging) y el
metodo IDW.
2. Cofiguración
En esta parte vamos a borrar todos los datos guadados, para que nos
quede libre la memoria que vamos a utilizar con los nuevos valores y
nuevas variables.
rm(list =ls())
Como lo mensiocnamos anteriormente toca primero utilizar las
siguientes
librerias.library(sp),library(terra),library(sf),library(stars),library(gstat),library(automap),library(leaflet),library(leafem),library(ggplot2),
library(curl),library(dplyr), para luego desarrollar el codigo.
library(sp)
library(terra)
## terra 1.8.29
library(sf)
## Linking to GEOS 3.11.2, GDAL 3.8.2, PROJ 9.3.1; sf_use_s2() is TRUE
library(stars)
## Loading required package: abind
library(gstat)
library(automap)
library(leaflet)
library(leafem)
library(ggplot2)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:terra':
##
## intersect, union
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(curl)
## Warning: package 'curl' was built under R version 4.3.3
## Using libcurl 8.3.0 with Schannel
h<- new_handle()
handle_setopt(h,http_version=2)
3. Datos de entrada.
En esta parte lo que vamos a realizar en el ingreso de datos Raster
al sistema para luego trabajar con ellos, estos son los datos de carbono
organico de suelos (soc).
archivo <- ("soc_igh_15_30.tif")
(soc <- rast(archivo))
## class : SpatRaster
## dimensions : 1056, 969, 1 (nrow, ncol, nlyr)
## resolution : 250, 250 (x, y)
## extent : -8677750, -8435500, 106750, 370750 (xmin, xmax, ymin, ymax)
## coord. ref. : Interrupted_Goode_Homolosine
## source : soc_igh_15_30.tif
## name : soc_igh_15_30
En este paso vamos a convertir las unidades de SOC dividiendolas
sobre 10.
soc.perc <- soc/10
En esta parte vamos a proyectar a datos geograficos con la funcion
“project”, los valores dados se dan en grados.
geog ="+proj=longlat +datum=WGS84"
(geog.soc = project(soc.perc, geog))
## class : SpatRaster
## dimensions : 1064, 993, 1 (nrow, ncol, nlyr)
## resolution : 0.002229862, 0.002229862 (x, y)
## extent : -77.95047, -75.73621, 0.9579311, 3.330504 (xmin, xmax, ymin, ymax)
## coord. ref. : +proj=longlat +datum=WGS84 +no_defs
## source(s) : memory
## name : soc_igh_15_30
## min value : 14.63106
## max value : 269.90146
Aqui lo que vamos a hacer es un ploteo utilizando leaflet y leafem.
El mapa muestra los valores de carbono organico del suelo en la region
del departamento del Cauca
m <- leaflet() %>%
addTiles() %>%
leafem:::addGeoRaster(
stars.soc,
opacity = 0.8,
colorOptions = colorOptions(palette = c("orange", "yellow", "cyan", "green"),
domain = 14:270)
)
#
m # Print the map
4. Toma de muestras
Aqui se toma una muestra aleatoria de 500 puntos del raster de
carbono organico del suelo y luego de estos se los convierte a sf para
un analiis espacial.
set.seed(123456)
# Random sampling of 500 points
(samples <- spatSample(geog.soc, 500, "random", as.points=TRUE))
## class : SpatVector
## geometry : points
## dimensions : 500, 1 (geometries, attributes)
## extent : -77.94935, -75.74179, 0.9679655, 3.324929 (xmin, xmax, ymin, ymax)
## coord. ref. : +proj=longlat +datum=WGS84 +no_defs
## names : soc_igh_15_30
## type : <num>
## values : 69.41
## 51.87
## NA
(muestras <- sf::st_as_sf(samples))
Aqui creamos un data frame, con las siguintes columnas el
identificador (id), la longitud, latitud y el valor de carbono organico
del suelo.
(sitios <- data.frame(id, longit, latit, soc))
Elimina culquier fila del dataframe que contenga NA en algunas de
sus columnas.
sitios <- na.omit(sitios)
Ver las primeras filas
head(sitios)
Se crea un mapa intrativo que muestra la distribución espacial del
SOC como los puntos de meustreo de cada lugar del departamento el cual
nos da un valor por cada municipio que se representa con un circulo de
color naranja.
m <- leaflet() %>%
addTiles() %>%
leafem:::addGeoRaster(
stars.soc,
opacity = 0.7,
colorOptions = colorOptions(palette = c("black", "yellow", "cyan", "orange"),
domain = 14:270)
) %>%
addMarkers(lng=sitios$longit,lat=sitios$latit, popup=sitios$soc, clusterOptions = markerClusterOptions())
m # Print the map
5.Interpolación IDW
En este tipo de interpolación no necesita de un semi
variograma.
En g1 se esta creando un objeto (gstat),el soc_igh_15_30 es una
variable este esta en raster, nmuestras es el conjunto de puntos
muestreados de SOC.
g1 = gstat(formula = soc_igh_15_30 ~ 1, data = nmuestras)
Posteriormente, se define el raster de plantilla para poner los
datos. Aqui el 4 nos quiere decir que este coge por cada 4 cuadros que
da es una celda que hace, esto hace que redusca la resolución del raster
original.
rrr = aggregate(geog.soc, 4)
Se imprime la variable previamente diseñada para ver y comprobar que
todos los valores sean correctos para el departamento.
rrr
## class : SpatRaster
## dimensions : 266, 249, 1 (nrow, ncol, nlyr)
## resolution : 0.008919447, 0.008919447 (x, y)
## extent : -77.95047, -75.72952, 0.9579311, 3.330504 (xmin, xmax, ymin, ymax)
## coord. ref. : +proj=longlat +datum=WGS84 +no_defs
## source(s) : memory
## name : soc_igh_15_30
## min value : 15.96767
## max value : 258.72571
El sigueinte paso es asignar un valor constante a las celdas este es
de 1, lo que va a repercutir en la grilla.
values(rrr) <-1
Aqui renombramos la capa.
names(rrr) <- "valor"
Verificación del raster creado, los valores son 1.
rrr
## class : SpatRaster
## dimensions : 266, 249, 1 (nrow, ncol, nlyr)
## resolution : 0.008919447, 0.008919447 (x, y)
## extent : -77.95047, -75.72952, 0.9579311, 3.330504 (xmin, xmax, ymin, ymax)
## coord. ref. : +proj=longlat +datum=WGS84 +no_defs
## source(s) : memory
## name : valor
## min value : 1
## max value : 1
Convertimos el raster rrr a un objeto stars con la funcion de
st_as_stars.
stars.rrr = st_as_stars(rrr)
Aqui interpolamos que esta definida en g1 sobre stars.rrr, todos los
objeto se guardan en z1 que es un objeto stars.
z1 = predict(g1, stars.rrr)
## [inverse distance weighted interpolation]
Vemos que en z1 en var1.pred tiene los valores interpolados de SOC y
en var1.var la vrianza de la predicción.
z1
## stars object with 2 dimensions and 2 attributes
## attribute(s):
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## var1.pred 18.10718 49.76386 57.72762 67.8056 73.04993 198.2528 0
## var1.var NA NA NA NaN NA NA 66234
## dimension(s):
## from to offset delta refsys x/y
## x 1 249 -77.95 0.008919 +proj=longlat +datum=WGS8... [x]
## y 1 266 3.331 -0.008919 +proj=longlat +datum=WGS8... [y]
Aqui podemos ver la primera capa del raster interpolado.
z1 = z1["var1.pred",,]
names(z1) = "soc"
Imprimimos la variable crada z1
z1
## stars object with 2 dimensions and 1 attribute
## attribute(s):
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## soc 18.10718 49.76386 57.72762 67.8056 73.04993 198.2528
## dimension(s):
## from to offset delta refsys x/y
## x 1 249 -77.95 0.008919 +proj=longlat +datum=WGS8... [x]
## y 1 266 3.331 -0.008919 +proj=longlat +datum=WGS8... [y]
5.1 Creación de paleta de Color
Aqui creamos una paleta de colores para representar los valores de
SOC interpolados.Las celdas NA se presentan transparentes.
paleta <- colorNumeric(palette = c("orange", "yellow", "cyan", "green"), domain = 18:200, na.color = "transparent")
Creación del mapa. En este podemos ver la superficie interpolada de
SOC estimada en IDW,podemos ver los puntos reales muestreados en el
mapa, una leyenda para una interpretación de los colores. Los colores se
componen de naranja, amarillo, cyan y verde.
m <- leaflet() %>%
addTiles() %>%
leafem:::addGeoRaster(
z1,
opacity = 0.7,
colorOptions = colorOptions(palette = c("orange", "yellow", "cyan", "green"),
domain = 18:200)
) %>%
addMarkers(lng=sitios$longit,lat=sitios$latit, popup=sitios$soc, clusterOptions = markerClusterOptions()) %>%
addLegend("bottomright", pal=paleta, values= z1$soc,
title = "IDW SOC interpolation [%]"
)
m # Print the map
6 OK INTERPOLATION (ordinary krying)
v_emp_ok = variogram(soc_igh_15_30 ~ 1, data=nmuestras)
Creamos un ploteo de la variable v_emp_ok anteriormente creada
haciendo variograma de las muestras, para mirar la tendencia de estos
datos que nos dan.
plot(v_emp_ok)

Una vez ejecutada la función, el resultado (v_mod_ok) contiene tanto
el variograma experimental como el modelo ajustado. Este resultado se
visualiza con plot(v_mod_ok), lo que permite evaluar gráficamente la
calidad del ajuste. El modelo resultante será clave para aplicar
técnicas de interpolación espacial como el kriging, permitiendo estimar
valores de carbono del suelo en ubicaciones no muestreadas, basándose en
la estructura espacial observada en los datos originales.
plot(v_mod_ok)

El modelo de variograma muestra cómo varía el carbono orgánico del
suelo (SOC) según la distancia entre muestras. Tiene un rango de unos
101 metros, lo que indica que los datos están correlacionados
espacialmente dentro de esa distancia. El efecto nugget es bajo, lo que
sugiere buena calidad en los datos. Este modelo sirve para aplicar
kriging y estimar valores de SOC en áreas donde no se tomaron
muestras.
v_mod_ok$var_model
Se aplica kriging ordinario para estimar valores de carbono orgánico
del suelo (SOC) en zonas no muestreadas, usando la estructura espacial
capturada por el variograma.
g2 = gstat(formula = soc_igh_15_30 ~ 1, model = v_mod_ok$var_model, data = nmuestras)
z2= predict(g2, stars.rrr)
## [using ordinary kriging]
7. Validacion cruzada para sacar los errores.
Se aplica una validación cruzada con gstat.cv() para evaluar el
desempeño del modelo de kriging. Este procedimiento predice los valores
de carbono orgánico del suelo (SOC) dejando fuera cada muestra, uno a
uno.
### Este código se corre desde la consola, linea por línea.
#cv1 = gstat.cv(g1)
#cv2 = gstat.cv(g2)
#cv1 = na.omit(cv1)
#cv1 = gstat.cv(g1)
cv1(cross validation)
Lo que podemos interpretar de la imagen es que tenemos unos datos
mas impresisos a medida que nos alejsmos del centro del departamento,
son datos mas impresisos que los datos que estan en el centro. Y aun mas
se encuantran datos mas impresisos en los lugares como los de la costa
pacifica. Esto se dice que se espera que los datos no sean muy grandes
ni muy pequeños, osea que no se alejen del 10% de sobreestimación.

#sp::bubble(as(cv1[, "residual"], "Spatial"))
Este valor indica que, en promedio, las estimaciones del modelo se
desvían ±21 unidades del valor real de carbono orgánico del suelo (SOC).
Un RMSE bajo sugiere que el modelo tiene buena precisión; en este caso,
dependerá del rango total de valores de SOC para juzgar si ese error es
aceptable.
#sqrt(sum((cv1$var1.pred - cv1$observed)^2) / nrow(cv1))
#cv2 = gstat.cv(g2)
Analisis de burbujas de OK
En este analizamos con cun diagrama de burbujas la presicion de los
datos que se dieron en el mapa y se mira que tan acertados son y por lo
cual que tan confiable es hacerlo.
#cv2 = na.omit(cv2)
#cv2
#cv2 = st_as_sf(cv2)

#sp::bubble(as(cv2[, "residual"], "Spatial"))
El gráfico muestra la distribución espacial de los residuos
obtenidos tras aplicar un modelo de interpolación en el departamento del
Cauca. Los residuos positivos, representados en color verde, indican que
el modelo subestimó los valores reales, mientras que los residuos
negativos (en rosa) muestran sobreestimación. El tamaño de los puntos
refleja la magnitud del error en cada ubicación: los puntos más grandes
señalan áreas donde la discrepancia entre el valor observado y el
estimado es mayor. Este tipo de visualización es útil para identificar
zonas donde el modelo presenta menor precisión, permitiendo ajustes como
la incorporación de más datos de entrada, la modificación de parámetros
o el uso de métodos alternativos de interpolación. Evaluar los residuos
es esencial para mejorar la calidad del análisis espacial y asegurar que
las decisiones basadas en estos datos sean confiables.
#sqrt(sum((cv2$var1.pred - cv2$observed)^2) / nrow(cv2))