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.