require(readxl)
require(dplyr)
require(ggplot2)
require(leaflet)
require(geoR)
require(sf)

1 Filtración de datos

Extraemos los datos necesarios del documento de Excel, correspondientes a los registros del 01/10/2020 a las 10:11:12 a.m. Además, filtramos la información relevante, que incluye las coordenadas y la variable de temperatura.

excel = read_excel("~/Maestria/Segundo Semestre/Electiva/actividad 3/Datos_Completos_Aguacate.xlsx", sheet = 2)


datos_aguacate_temp <- excel %>%
  select(`Latitude`, `Longitude`, `Temperature` )


head(datos_aguacate_temp, n=10)
## # A tibble: 10 × 3
##    Latitude Longitude Temperature
##       <dbl>     <dbl>       <dbl>
##  1     2.39     -76.7        23.9
##  2     2.39     -76.7        23.5
##  3     2.39     -76.7        24.5
##  4     2.39     -76.7        25.9
##  5     2.39     -76.7        26  
##  6     2.39     -76.7        24.5
##  7     2.39     -76.7        25.5
##  8     2.39     -76.7        25.7
##  9     2.39     -76.7        26  
## 10     2.39     -76.7        25.9

Se puede apreciar en el mapa la ubicación de la finca de aguacate

leaflet() %>% 
  addTiles() %>% 
  addCircleMarkers(lng = datos_aguacate_temp$Longitude,lat = datos_aguacate_temp$Latitude,radius = 0.2,color = "green")

2 Analisis Exploratorio

geodatos = as.geodata(datos_aguacate_temp, coords.col = 2:1, data.col = 3)

plot(geodatos)

En los gráficos podemos observar las áreas con las temperaturas más altas y más bajas, las cuales varían entre los 22 y los 30 grados Celsius

3 Semivariograma

summary(dist(geodatos$coords))
##      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 = variog(geodatos, option = "bin", uvec = seq(0, 9.2e-04, by = 1.8e-05))
## variog: computing omnidirectional variogram
datos.env = variog.mc.env(geodatos, obj=variograma)
## variog.env: generating 99 simulations by permutating data values
## variog.env: computing the empirical variogram for the 99 simulations
## variog.env: computing the envelops
plot(variograma,pch=16, envelope=datos.env)

Se observa que existe una fuerte correlación espacial a distancias cortas, aproximadamente hasta los 3e-04, después de lo cual la correlación comienza a disminuir gradualmente y se va disipando a medida que aumenta la distancia.

4 Ajuste del modelo teorico

ini.vals = expand.grid(seq(2,3,l=10), seq(2e-04,3e-04,l=10))
model_mco_exp = variofit(variograma,ini=ini.vals,cov.model = "exponential", wei="npair", min="optim")
## variofit: covariance model used is exponential 
## variofit: weights used: npairs 
## variofit: minimisation function used: optim 
## variofit: searching for best initial value ... selected values:
##               sigmasq phi   tausq kappa
## initial.value "3"     "0"   "0"   "0.5"
## status        "est"   "est" "est" "fix"
## loss value: 21005.8030161402
model_mco_gaus = variofit(variograma,ini=ini.vals,cov.model = "gaussian", wei="npair", min="optim",nugget = 0)
## variofit: covariance model used is gaussian 
## variofit: weights used: npairs 
## variofit: minimisation function used: optim 
## variofit: searching for best initial value ... selected values:
##               sigmasq phi   tausq kappa
## initial.value "3"     "0"   "0"   "0.5"
## status        "est"   "est" "est" "fix"
## loss value: 19834.1764622519
model_mco_spe = variofit(variograma,ini=ini.vals,cov.model = "spheric",fix.nug=TRUE, wei="npair", min="optim")
## variofit: covariance model used is spherical 
## variofit: weights used: npairs 
## variofit: minimisation function used: optim 
## variofit: searching for best initial value ... selected values:
##               sigmasq phi   tausq kappa
## initial.value "3"     "0"   "0"   "0.5"
## status        "est"   "est" "fix" "fix"
## loss value: 6953.39340609177
plot(variograma)
lines(model_mco_exp,col="blue")
lines(model_mco_gaus,col="red")
lines(model_mco_spe,col="purple")

model_mco_exp
## variofit: model parameters estimated by WLS (weighted least squares):
## covariance model is: exponential
## parameter estimates:
##   tausq sigmasq     phi 
##  0.1744  2.9912  0.0001 
## Practical Range with cor=0.05 for asymptotic range: 0.0004056637
## 
## variofit: minimised weighted sum of squares = 3796.665
model_mco_gaus
## variofit: model parameters estimated by WLS (weighted least squares):
## covariance model is: gaussian
## parameter estimates:
##   tausq sigmasq     phi 
##  0.0550  2.9853  0.0001 
## Practical Range with cor=0.05 for asymptotic range: 0.000232854
## 
## variofit: minimised weighted sum of squares = 8696.766
model_mco_spe
## variofit: model parameters estimated by WLS (weighted least squares):
## covariance model is: spherical
## fixed value for tausq =  0 
## parameter estimates:
## sigmasq     phi 
##  3.0666  0.0002 
## Practical Range with cor=0.05 for asymptotic range: 0.0002444433
## 
## variofit: minimised weighted sum of squares = 6497.1

De acuerdo al grafico y a los resultados numericos obtenidos, el modelo que mas se ajusta con un error de 3796.665 es el exponencial, por ende este sera usado en la prediccion espacial usando Kriging.

5 Predicción espacial - Kriging

geodatos_grid=expand.grid( lon=seq(-76.7118,-76.71022,l=100),lat=seq( 2.392101,2.393634 ,l=100))
plot(geodatos_grid)
points(datos_aguacate_temp[,2:1],col="red")

geodatos_ko=krige.conv(geodatos, loc=geodatos_grid,
      krige= krige.control(nugget=0,trend.d="cte", 
      trend.l="cte",cov.pars=c(sigmasq=2.9912, phi=0.0001 )))
## krige.conv: model with constant mean
## krige.conv: Kriging performed using global neighbourhood
image(geodatos_ko, main="kriging Predict", xlab="East", ylab="North")

image(geodatos_ko, main="kriging StDv Predicted",val=sqrt(geodatos_ko$krige.var), xlab="East", ylab="North")

6 Error de predicción

valida=xvalid(geodata = geodatos,model = model_mco_exp)
## xvalid: number of data locations       = 534
## xvalid: number of validation locations = 534
## xvalid: performing cross-validation at location ... 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 
## xvalid: end of cross-validation
MAE=mean(abs(valida$error))
MAE
## [1] 0.7959005

Usando el metodo de validación cruzada, el modelo presenta un error de prediccion de aproximadamente 0.8 grados.

7 Conclusiones

  • El error de predicción sugiere que, en promedio, las predicciones realizadas por el modelo presentan una desviación aproximada de 0.8 grados. En el contexto del cultivo de aguacate, sería necesario investigar más a fondo si esta variación puede afectar aspectos relacionados con la calidad de la cosecha.

  • El mapa de predicción con Kriging muestra la distribución espacial de las temperaturas en la finca, con zonas claras indicando temperaturas más altas, posiblemente influenciadas por microclimas locales como exposición al sol o flujo de aire, mientras que las zonas oscuras reflejan temperaturas más bajas.

  • El mapa de incertidumbre o “Kriging StDv Predicted”, evidencia mayor confianza en las predicciones cerca de los sensores y mayor incertidumbre en áreas más alejadas, se hace necesario entonces poder recopilar datos adicionales en esas zonas para mejorar la precisión del análisis.