require(readxl)
require(dplyr)
require(ggplot2)
require(leaflet)
require(geoR)
require(sf)
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")
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
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.
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.
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")
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.
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.