Aplicaciones de Estadística Espacial
1. Análisis exploratorio
Análisis exploratorio tomando como parámetro la
Temperatura
datos <- read_excel("Datos_Completos_Aguacate_Sort.xlsx", col_names = TRUE)
datatable(
head(datos),
options = list(
pageLength = -1,
paging = FALSE,
searching = FALSE,
scrollX = TRUE
),
caption = "Tabla de datos"
)
# Creación del objeto geodata seleccionando la temeratura como variable de interés.
geodatos_geoR_temperatura <- as.geodata(datos, coords.col = c("Longitude", "Latitude"), data.col = "Temperature")
# Objeto geodata
plot.geodata(geodatos_geoR_temperatura)

# Creación de sf object
datos_sf <- st_as_sf(datos, coords = c("Longitude", "Latitude"), crs = 4326)
# Creación de un mapa de puntos básico con ggplot
ggplot() +
annotation_map_tile(type = "osm", zoom = 14) + # OpenStreetMap (OSM) como fondo
geom_sf(data = datos_sf, aes(color = Temperature), size = 2, alpha = 0.7) +
coord_sf() +
labs(title = "Mapa de Puntos de Temperatura",
x = "Longitud", y = "Latitud") +
theme_minimal() +
scale_color_viridis_c()

Interpretación:
- Los puntos están distribuidos de manera uniforme dentro del área
estudiada, lo que indica que los datos fueron recolectados en una región
continua sin zonas vacías evidentes.
- La distribución homogénea sugiere que se realizaron mediciones
sistemáticas a lo largo del espacio, cubriendo toda la región de
interés.
- En el gráfico de dispersión de coordenadas (Latitud y Longitud), no
se observa un patrón direccional claro. Esto indica que las variables
medidas no parecen variar de forma significativa en relación con la
posición geográfica en el espacio.
- La densidad de temperatura muestra un rango principal entre 24 y 28
grados centígrados, con algunos valores extremos que alcanzan 30 grados.
Esto indica una zona con temperaturas mayormente cálidas y valores
consistentes en la región de estudio.
- La distribución se aproxima a una forma normal, con un ligero sesgo
hacia temperaturas más altas. Esto podría reflejar condiciones
climáticas estables en la región.
- En el mapa de puntos, se observa que las temperaturas más bajas
(alrededor de 24 grados) están distribuidas de manera dispersa y no
concentradas en un área específica, mientras que las temperaturas más
altas (cercanas a 28 grados) se encuentran distribuidas de manera
uniforme.
- El mapa indica una variabilidad suave en las temperaturas, sin
cambios bruscos en valores entre regiones cercanas.
Análisis de la distribución de las distancias y
Semivariograma de todos los puntos (Temperatura)
# Calcular las distancias entre puntos en la región
distancias_temperatura <- as.vector(dist(geodatos_geoR_temperatura$coords))
# Visualizar un resumen de las distancias
summary(distancias_temperatura)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.712e-05 4.051e-04 6.408e-04 6.827e-04 9.178e-04 1.959e-03
# Crear un histograma de las distancias
hist(distancias_temperatura, breaks = 20, main = "Distribución de distancias",
xlab = "Distancia", ylab = "Frecuencia", col = "lightblue")

uvec_bins_tempt <- seq(0.00001712, 0.001959, by = 0.0001)
variograma_temepratura <- variog(geodata = geodatos_geoR_temperatura, option ="bin", uvec = uvec_bins_tempt)
## variog: computing omnidirectional variogram
plot(variograma_temepratura, main="Semivariogrma de todas las regiones (Temperatura)", xlab = "Distancia", ylab = "Semivarianza", pch=16)

Interpretación:
- El semivariograma muestra una clara tendencia creciente en la
semivarianza a medida que aumenta la distancia entre los puntos. Esto
sugiere que las mediciones de temperatura en puntos cercanos están más
correlacionadas, mientras que las mediciones en puntos más alejados son
menos similares.
- En las distancias más cortas (cercanas a 0), la semivarianza
comienza con valores bajos, lo que confirma que los puntos muy próximos
entre sí tienen valores de temperatura similares.
- A medida que la distancia aumenta, la semivarianza crece rápidamente
hasta estabilizarse alrededor de los 0.001.
- El rango de autocorrelación espacial puede interpretarse como la
distancia hasta donde la semivarianza deja de aumentar
significativamente que es aproximadamente 0.001.
- En las distancias mayores a 0.0015, la semivarianza parece disminuir
levemente. Esto puede deberse a un efecto de ruido o a la presencia de
puntos atípicos.
- El semivariograma refleja un comportamiento típico de los datos
espaciales donde los valores cercanos están
correlacionados, pero esta correlación disminuye con la
distancia hasta alcanzar un nivel de independencia.
2. Identificar modelo teórico
# Ajustar modelos teóricos al semivariograma experimental
modelo_esferico <- variofit(variograma_temepratura, cov.model = "spherical", ini.cov.pars = c(2, 0.0005))
## variofit: covariance model used is spherical
## variofit: weights used: npairs
## variofit: minimisation function used: optim
modelo_exponencial <- variofit(variograma_temepratura, cov.model = "exponential", ini.cov.pars = c(2, 0.0005))
## variofit: covariance model used is exponential
## variofit: weights used: npairs
## variofit: minimisation function used: optim
modelo_gaussiano <- variofit(variograma_temepratura, cov.model = "gaussian", ini.cov.pars = c(2, 0.0005))
## variofit: covariance model used is gaussian
## variofit: weights used: npairs
## variofit: minimisation function used: optim
# Visualización del semivariograma y los modelos teóricos ajustados
plot(variograma_temepratura, main = "Ajuste de Modelos Teóricos", xlab = "Distancia", ylab = "Semivarianza")
lines(modelo_esferico, col = "blue", lwd = 2, lty = 1) # Modelo esférico
lines(modelo_exponencial, col = "red", lwd = 2, lty = 2) # Modelo exponencial
lines(modelo_gaussiano, col = "green", lwd = 2, lty = 3) # Modelo gaussiano
# Agregar leyenda
legend("bottomright", legend = c("Esférico", "Exponencial", "Gaussiano"),
col = c("blue", "red", "green"), lwd = 2, lty = c(1, 2, 3))

# Comparar el error de los modelos
error_esferico <- modelo_esferico$value
error_exponencial <- modelo_exponencial$value
error_gaussiano <- modelo_gaussiano$value
# Imprimir los errores
print(error_esferico)
## [1] 11166.43
print(error_exponencial)
## [1] 5843.131
print(error_gaussiano)
## [1] 25818.86
# Identificar el modelo con menor error
mejor_modelo <- which.min(c(error_esferico, error_exponencial, error_gaussiano))
modelos <- c("Esférico", "Exponencial", "Gaussiano")
print(paste("El mejor modelo es:", modelos[mejor_modelo]))
## [1] "El mejor modelo es: Exponencial"
Modelo exponencial:
print(modelo_exponencial)
## variofit: model parameters estimated by WLS (weighted least squares):
## covariance model is: exponential
## parameter estimates:
## tausq sigmasq phi
## 0.8541 2.5269 0.0002
## Practical Range with cor=0.05 for asymptotic range: 0.000594513
##
## variofit: minimised weighted sum of squares = 5843.131
Interpretación:
- El modelo exponencial es el que tiene el menor error (5843.131) en
comparación con el modelo esférico (11166.43) y el modelo gaussiano
(25818.86). Esto indica que el modelo exponencial es el que mejor
representa el comportamiento del semivariograma experimental.
- La autocorrelación espacial de la temperatura es fuerte para
distancias cortas, pero disminuye rápidamente conforme los puntos se
separan. Esto sugiere que los factores que influyen en la temperatura
tienen un impacto local significativo.
- Este modelo puede ser utilizado para realizar predicciones
espaciales mediante Kriging.
3. Implementación técnica de Kriging
# Crear una malla de predicción (grid)
x_pred <- seq(min(geodatos_geoR_temperatura$coords[, 1]), max(geodatos_geoR_temperatura$coords[, 1]), length.out = 100)
y_pred <- seq(min(geodatos_geoR_temperatura$coords[, 2]), max(geodatos_geoR_temperatura$coords[, 2]), length.out = 100)
grid_pred <- expand.grid(x = x_pred, y = y_pred) # Crear una cuadrícula con las coordenadas
# Configuración de Kriging
kriging_result <- krige.conv(
geodata = geodatos_geoR_temperatura,
locations = grid_pred, # Coordenadas de predicción
krige = krige.control(
obj.model = modelo_exponencial, # Modelo ajustado
trend.d = "cte", # Tendencia constante
cov.pars = c(2.5269, 0.0002), # Parámetros del modelo exponencial
nugget = 0.8541 # Nugget
)
)
## krige.conv: model with constant mean
## krige.conv: Kriging performed using global neighbourhood
# Convierte las predicciones a una matriz para graficar
z_pred <- matrix(kriging_result$predict, nrow = length(x_pred), ncol = length(y_pred))
# Grafica las predicciones
image(
x_pred, y_pred, z_pred,
main = "Kriging - Predicción de Temperatura",
xlab = "Longitude", ylab = "Latitude", col = terrain.colors(100)
)
# Agrega contornos para visualizar mejor las predicciones
contour(
x_pred, y_pred, z_pred,
add = TRUE, drawlabels = TRUE, col = "blue"
)

4. Conclusiones:
- El análisis muestra que la temperatura está influenciada por
factores espaciales locales, pero las variaciones son relativamente
suaves.
- Las zonas más cálidas y más frías están bien definidas, lo que puede
ser útil para estudios relacionados con la influencia de microclimas o
características ambientales específicas.
- Este modelo puede ser utilizado para realizar interpolaciones en
áreas similares o para evaluar el impacto de variables locales en la
distribución de la temperatura.
- Las temperaturas están distribuidas de manera suave, sin cambios
abruptos, lo que refleja la consistencia de los datos y la influencia
limitada de factores extremos.
- Las zonas con temperaturas más altas (27°C - 28°C) podrían requerir
estrategias de manejo específicas, como riego adicional o cobertura
vegetal, para mitigar el estrés térmico y mantener la calidad del
aguacate.