Contexto del desarrollo del caso

Base de datos: Datos_Completos_Aguacate.xlsx”

Descripción de datos: Información de clima y areas de una finca en Cauca (Colombia), con la cual se va a realizar geoestadística con:

  1. Evaluar autocorrelación espacial con el semivariograma.
  2. Identificar el mejor modelo teórico.
  3. Realizar una predicción espacial usando la metodología krigin.
  4. Generar imagen de la predicción espacial.
Nota: Si en algún evento la variable “Temperature” no tiene una autocorrelación espacial siginificativa, se puede seleccionar otra variable para realizar el desarrollo de la actividad (pueden ser “Relative_Humidity”, “Wind_Speed”, “Altitude”).

Desarrollo

library(readxl)
## Warning: package 'readxl' was built under R version 4.4.3
library(geoR)
## Warning: package 'geoR' was built under R version 4.4.3
## --------------------------------------------------------------
##  Analysis of Geostatistical Data
##  For an Introduction to geoR go to http://www.leg.ufpr.br/geoR
##  geoR version 1.9-5 (built on 2025-04-25) is now loaded
## --------------------------------------------------------------
library(raster)
## Warning: package 'raster' was built under R version 4.4.3
## Cargando paquete requerido: sp
## Warning: package 'sp' was built under R version 4.4.3
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
library(leaflet)
## Warning: package 'leaflet' was built under R version 4.4.3
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.4.3
library(raster)
library(RColorBrewer)
View(datos_aguacate)
str(datos_aguacate)
## tibble [20,271 × 21] (S3: tbl_df/tbl/data.frame)
##  $ id_arbol                      : chr [1:20271] "1" "2" "3" "4" ...
##  $ Latitude                      : num [1:20271] 2.38 2.38 2.38 2.38 2.38 ...
##  $ Longitude                     : num [1:20271] -76.6 -76.6 -76.6 -76.6 -76.6 ...
##  $ FORMATTED_DATE_TIME           : chr [1:20271] "21/08/2019  9:22:57 a, m," "21/08/2019  9:27:13 a, m," "21/08/2019  9:36:36 a, m," "21/08/2019  9:38:02 a, m," ...
##  $ Psychro_Wet_Bulb_Temperature  : num [1:20271] 14.8 11.6 12.9 14.1 14.3 14.2 14.4 12.8 15 14 ...
##  $ Station_Pressure              : num [1:20271] 805 805 806 806 805 ...
##  $ Relative_Humidity             : num [1:20271] 33.6 36.8 31.5 33.2 34.3 33.8 34.9 34.2 33.6 34 ...
##  $ Crosswind                     : num [1:20271] 0.2 3.6 0.4 0.6 0.4 0.5 0.6 2.9 0.4 0.7 ...
##  $ Temperature                   : num [1:20271] 25.7 20.8 23.7 25 25 25 24.9 22.9 26.2 24.6 ...
##  $ Barometric_Pressure           : num [1:20271] 805 805 806 806 805 ...
##  $ Headwind                      : num [1:20271] 0.7 3.5 0.7 0.7 0.4 0.1 0 2.2 0.2 0.7 ...
##  $ Direction_True                : num [1:20271] 166 314 332 139 129 83 93 128 118 137 ...
##  $ Direction_Mag                 : num [1:20271] 165 313 331 139 128 83 92 127 118 137 ...
##  $ Wind_Speed                    : num [1:20271] 0.8 5.1 0.8 0.9 0.6 0.5 0.6 3.7 0.5 1 ...
##  $ Heat_Stress_Index             : num [1:20271] 24.1 19.5 22 23.2 23.3 23.3 23.2 21.5 24.6 22.9 ...
##  $ Altitude                      : num [1:20271] 1896 1895 1889 1890 1894 ...
##  $ Dew_Point                     : num [1:20271] 8.6 5.5 5.8 7.7 8.1 7.9 8.3 6.3 8.9 7.7 ...
##  $ Density_Altitude              : num [1:20271] 2.74 2.57 2.66 2.71 2.71 ...
##  $ Wind_Chill                    : num [1:20271] 25.7 20.8 23.7 24.9 24.9 24.9 24.8 22.9 26.2 24.5 ...
##  $ Estado_Fenologico_Predominante: num [1:20271] 715 715 715 715 715 715 715 715 715 715 ...
##  $ Frutos_Afectados              : num [1:20271] 0 3 0 0 1 0 0 0 0 21 ...

Análisis Exploratorio y Limpieza de datos

Datos_faltantes <- data.frame(colnames(datos_aguacate ), sapply(datos_aguacate, function(x) sum(is.na(x))))
Datos_faltantes <- Datos_faltantes[c(2:4, 9), ]

#Limpiando Dataframe
rownames(Datos_faltantes) <- NULL
colnames(Datos_faltantes) <- c("Variable", "Datos Faltantes")

#Presentando información en formato tabla
kable_classic(kbl(Datos_faltantes, caption = "<center><b>Tabla 1. Datos Faltantes por Variable</b></center>"), full_width = F)
Tabla 1. Datos Faltantes por Variable
Variable Datos Faltantes
Latitude 0
Longitude 0
FORMATTED_DATE_TIME 0
Temperature 0

Análisis

Se solicitó solo usar el periodo 01/10/2020 10:11:12 a, m,

# Eliminar espacios no quiebre

datos_aguacate$FORMATTED_DATE_TIME <- gsub(
  "\u00A0", " ", datos_aguacate$FORMATTED_DATE_TIME)

# Filtramos nuevamente la cadena de texto solicitada
FincaAgu_Filtro <- datos_aguacate[
datos_aguacate$FORMATTED_DATE_TIME == "01/10/2020  10:11:12 a, m,",]
print(FincaAgu_Filtro)
## # A tibble: 534 × 21
##    id_arbol Latitude Longitude FORMATTED_DATE_TIME        Psychro_Wet_Bulb_Tem…¹
##    <chr>       <dbl>     <dbl> <chr>                                       <dbl>
##  1 1            2.39     -76.7 01/10/2020  10:11:12 a, m,                   22  
##  2 2            2.39     -76.7 01/10/2020  10:11:12 a, m,                   21.4
##  3 3            2.39     -76.7 01/10/2020  10:11:12 a, m,                   21.8
##  4 4            2.39     -76.7 01/10/2020  10:11:12 a, m,                   22.8
##  5 5            2.39     -76.7 01/10/2020  10:11:12 a, m,                   22.6
##  6 6            2.39     -76.7 01/10/2020  10:11:12 a, m,                   21.5
##  7 7            2.39     -76.7 01/10/2020  10:11:12 a, m,                   22.2
##  8 8            2.39     -76.7 01/10/2020  10:11:12 a, m,                   22.6
##  9 9            2.39     -76.7 01/10/2020  10:11:12 a, m,                   23  
## 10 10           2.39     -76.7 01/10/2020  10:11:12 a, m,                   22.7
## # ℹ 524 more rows
## # ℹ abbreviated name: ¹​Psychro_Wet_Bulb_Temperature
## # ℹ 16 more variables: Station_Pressure <dbl>, Relative_Humidity <dbl>,
## #   Crosswind <dbl>, Temperature <dbl>, Barometric_Pressure <dbl>,
## #   Headwind <dbl>, Direction_True <dbl>, Direction_Mag <dbl>,
## #   Wind_Speed <dbl>, Heat_Stress_Index <dbl>, Altitude <dbl>, Dew_Point <dbl>,
## #   Density_Altitude <dbl>, Wind_Chill <dbl>, …

Geoestadística

# Convertir dataframe en geodata
geo_datos <- as.geodata(
  FincaAgu_Filtro,coords.col = 3:2,data.col = 5)

# Convertir dataframe en geodata
FincaAguacate_geo <- as.geodata(
   FincaAgu_Filtro,coords.col = 3:2,data.col = 5)

# Gráficar geodata
par(mfrow = c(2, 1), mar = c(0, 4, 0, 4))
plot.new()
text(x = 0.5, y = 0.5, labels = "Figura 1. Geodata de la Temperatura", 
     cex = 1.7)
plot(geo_datos)

summary(dist(FincaAgu_Filtro[3:2]))
##      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

Variograma

# Crear variograma
FincaAguacate_variog <- variog(FincaAguacate_geo,option = "bin",
                               uvec=seq(0,9.178e-04,9.178e-05), messages = FALSE)

# Calcular margen de correlación
FincaAguacate_marks <- variog.mc.env(FincaAguacate_geo,
                                     obj=FincaAguacate_variog, messages = FALSE)

# Graficar semivariograma
plot(FincaAguacate_variog, main = "Figura 2. Semivariograma de Temperatura",
     xlab = "Distancia", ylab = "Semivarianza")
lines(FincaAguacate_marks)

La semivariograma muestra que la temperatura tiene una correlación espacial.

# Humedad relativa
# Convertir dataframe en geodata
FincaAguacate_geo2 <- as.geodata(
  FincaAgu_Filtro,coords.col = 3:2,data.col = 7)

# Crear variograma
FincaAguacate_variog2 <- variog(FincaAguacate_geo2,option = "bin",
                                uvec=seq(0,9.178e-04,9.178e-05), messages = FALSE)

# Calcular margen de correlación
FincaAguacate_marks2 <- variog.mc.env(FincaAguacate_geo2,
                                      obj=FincaAguacate_variog2, messages = FALSE)

# Graficar semivariograma
plot(FincaAguacate_variog2, main = "Figura 3. Semivariograma de Humedad Relativa",
     xlab = "Distancia", ylab = "Semivarianza")
lines(FincaAguacate_marks2)

Modelo Teórico con la temperatura

#Fijar rango de evaluación
val_ini <- expand.grid(seq(1.5,3,l=10), seq(4e-04,6e-04,l=10))

# Gráficar semiovariograma junto a las curvas teóricas
plot(FincaAguacate_variog, main = "Figura 4. Semivariograma de Temperatura\ncon modelos teóricos",
     xlab = "Distancia", ylab = "Semivarianza")
FincaAguacate_exp <- variofit(FincaAguacate_variog, ini=val_ini,
                                 cov.model="exponential", wei="npair",
                                 min="optim", messages = FALSE)
FincaAguacate_gaus <- variofit(FincaAguacate_variog, ini=val_ini,
                               cov.model="gaussian", wei="npair",
                               min="optim",nugget = 0, messages = FALSE)
FincaAguacate_spe <- variofit(FincaAguacate_variog, ini=val_ini, 
                              cov.model="spheric",fix.nug=TRUE, 
                              wei="npair", min="optim", messages = FALSE)
lines(FincaAguacate_exp,col="yellow")
lines(FincaAguacate_gaus,col="red")
lines(FincaAguacate_spe,col="black")

Predicción espacial

#Crear dataframe del área a gráficar
area_val <- data.frame(Modelo=c("Min. Long", "Max Long.", "Min. Lat", "Max. Lat"),
                               Suma_Errores=c(min(FincaAgu_Filtro[3]), max(FincaAgu_Filtro[3]), min(FincaAgu_Filtro[2]), max(FincaAgu_Filtro[2])))

#Crear tabla para visualizar los valores del área
kbl(area_val, caption = "<center><b>Tabla 2. Rango de área a graficar</b></center>", col.names=c("Línea","Valor"))%>%
  kable_classic(full_width = F)
Tabla 2. Rango de área a graficar
Línea Valor
Min. Long -76.711799
Max Long. -76.710215
Min. Lat 2.392101
Max. Lat 2.393634
# Graficar grilla de terreno
FincaAguacate_grilla <- expand.grid(lon=seq(-76.7118, -76.71022, l=100),
                                 lat=seq(2.392101, 2.393634, l=100))
plot(FincaAguacate_grilla, main = "Figura 4. Grilla del terreno",
     xlab = "Longitud", ylab = "Latitud")
points(FincaAgu_Filtro[3:2],col="yellow")

geodatos_kr=krige.conv(FincaAguacate_geo, loc=FincaAguacate_grilla,
                       krige= krige.control(nugget=0,trend.d="cte", 
                                            trend.l="cte",cov.pars=c(sigmasq=2.2842, phi=0.0001 )))
## krige.conv: model with constant mean
## krige.conv: Kriging performed using global neighbourhood
par(mfrow=c(1,2))
contour(geodatos_kr,main="kriging Predict", drawlabels=TRUE)

image(geodatos_kr, main="kriging Predict", xlab="East", ylab="North")

Conclusión

La temperatura varia en el área analizada, no presenta un patrón no uniforme. La correlación de la temperatura no fue muy fuerte, sin embargo se observa que los áboles de aguacate se encuentran situados en las areas dentro de las mejores varianzas. Esto podría aportar a seleccionar el terreno más adecuado para el cultivo de árboles para mayor producción de frutos.