Caso de Estudio Modelo para Daño en Frutos

El presente es un compilado de modelos que pueden explicar la distribución de un insecto que genera daños en frutos de cierto cultivo en una finca denominada Fresno, del municipio de Santander de Quilichao, Departamento del Cauca.

load("C:/Users/CRISTIAN/Desktop/ESPECIALIZACION_2_SEMESTRE/MODELACION DINAMICA/CLASE_27_ABRIL/datos_fresno3.RData")
##datos_fresno3

require(ggplot2)
## Loading required package: ggplot2
require(plotly)
## Loading required package: plotly
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
##Explorar la zona de estudio
map1=ggplot(datos_fresno3,aes(x=Longitude,y=Latitude,color=Fruto_Total_Dano,size=Fruto_Total_Dano))+geom_point()+theme_bw()+ggtitle("Daño de Frutos")
ggplotly(map1)
##Comportamiento del Daño
fig1=ggplot(datos_fresno3,aes(x=Fruto_Total_Dano))+geom_bar()+theme_bw()
ggplotly(fig1)
##Relacionar Daño vs Temperatura
fig2=ggplot(datos_fresno3,aes(x=Temperature,y=Fruto_Total_Dano))+geom_smooth(se = FALSE)+theme_bw()
ggplotly(fig2)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
##Relacionar Daño vs Humedad Relativa
fig3=ggplot(datos_fresno3,aes(x=Relative_Humidity,y=Fruto_Total_Dano))+geom_smooth(se = FALSE)+theme_bw()
ggplotly(fig3)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

Lo anterior muestra una correlación en la presencia del insecto en temperaturas cercanas a los 28 - 29 °C, además, también aparece ante cierta humedad. Su distribución espacial es mayor en la parte sur de la finca, también en una pequeña proporción en la parte norte. Los siguientes modelos (GAM, Árbol de Regresión, Red Neuronal y Máquina de soporte vectorial) crearán pronósticos respecto a los árboles con daño en sus frutos y proporcionarán una distribución específica dentro de la finca.

Estimar Modelo GAM

require(mgcv)
## Loading required package: mgcv
## Loading required package: nlme
## This is mgcv 1.8-31. For overview type 'help("mgcv-package")'.
mod1= gam(Fruto_Total_Dano~s(Temperature)+s(Relative_Humidity)+s(Altitude)+s(Wind_Speed)+s(Latitude)+s(Longitude)+s(Barometric_Pressure)+s(Crosswind),data=datos_fresno3,family = "poisson")

summary(mod1)
## 
## Family: poisson 
## Link function: log 
## 
## Formula:
## Fruto_Total_Dano ~ s(Temperature) + s(Relative_Humidity) + s(Altitude) + 
##     s(Wind_Speed) + s(Latitude) + s(Longitude) + s(Barometric_Pressure) + 
##     s(Crosswind)
## 
## Parametric coefficients:
##             Estimate Std. Error z value Pr(>|z|)   
## (Intercept)   -2.904      1.046  -2.776   0.0055 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Approximate significance of smooth terms:
##                          edf Ref.df  Chi.sq  p-value    
## s(Temperature)         8.902  8.995  69.907 1.26e-11 ***
## s(Relative_Humidity)   8.286  8.856  64.898 1.21e-10 ***
## s(Altitude)            6.552  7.365  10.930    0.164    
## s(Wind_Speed)          7.719  7.837  61.222 4.33e-08 ***
## s(Latitude)            8.613  8.957 204.481  < 2e-16 ***
## s(Longitude)           8.565  8.944  87.070 1.01e-14 ***
## s(Barometric_Pressure) 6.572  7.364   8.553    0.347    
## s(Crosswind)           5.400  5.579  31.322 2.38e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## R-sq.(adj) =  0.181   Deviance explained = 37.1%
## UBRE = 1.0986  Scale est. = 1         n = 788
##Poder predictivo del modelo
modelo=round(predict(mod1,newdata = datos_fresno3[,-c(1:2)],type = "response"))
real=datos_fresno3$Fruto_Total_Dano
MAE=round(mean(abs(modelo-real)),1)
RMSE=round(sqrt(mean((modelo-real)^2)),1)
MAE
## [1] 0.8
RMSE
## [1] 2.2
datos_fresno3$Fruto_Total_Dano_modelo=modelo
datos_fresno3
## # A tibble: 788 x 11
##    Monitoreo  Fruto_Total_Dano Temperature Relative_Humidi~ Altitude Wind_Speed
##    <date>                <dbl>       <dbl>            <dbl>    <dbl>      <dbl>
##  1 0021-08-20                0        25.7             33.6     1.90        0.8
##  2 0021-08-20                3        20.8             36.8     1.90        5.1
##  3 0021-08-20                0        23.7             31.5     1.89        0.8
##  4 0021-08-20                0        25               33.2     1.89        0.9
##  5 0021-08-20                1        25               34.3     1.89        0.6
##  6 0021-08-20                0        25               33.8     1.9         0.5
##  7 0021-08-20                0        24.9             34.9     1.9         0.6
##  8 0021-08-20                0        22.9             34.2     1.90        3.7
##  9 0021-08-20                0        26.2             33.6     1.90        0.5
## 10 0021-08-20               21        24.6             34       1.89        1  
## # ... with 778 more rows, and 5 more variables: Latitude <dbl>,
## #   Longitude <dbl>, Barometric_Pressure <dbl>, Crosswind <dbl>,
## #   Fruto_Total_Dano_modelo <dbl>
##Mapa de predicción de Daño en Frutos
map2=ggplot(datos_fresno3,aes(x=Longitude,y=Latitude,color=Fruto_Total_Dano_modelo,size=Fruto_Total_Dano_modelo))+geom_point()+theme_bw()+ggtitle("Modelo GAM")
ggplotly(map2)
require(gridExtra)
## Loading required package: gridExtra
## Warning: package 'gridExtra' was built under R version 4.0.4
gridExtra::grid.arrange(map1, map2, ncol = 1)

Estimar Modelo Arbol de Regresión

require(rpart)
## Loading required package: rpart
mod2= rpart(Fruto_Total_Dano~Temperature+Relative_Humidity+Altitude+Wind_Speed+Latitude+Longitude+Barometric_Pressure+Crosswind,data=datos_fresno3)

plot(mod2)
text(mod2, use.n = TRUE)

modelo2=predict(mod2)

datos_fresno3$Fruto_Total_Dano_modelo2=modelo2
datos_fresno3
## # A tibble: 788 x 12
##    Monitoreo  Fruto_Total_Dano Temperature Relative_Humidi~ Altitude Wind_Speed
##    <date>                <dbl>       <dbl>            <dbl>    <dbl>      <dbl>
##  1 0021-08-20                0        25.7             33.6     1.90        0.8
##  2 0021-08-20                3        20.8             36.8     1.90        5.1
##  3 0021-08-20                0        23.7             31.5     1.89        0.8
##  4 0021-08-20                0        25               33.2     1.89        0.9
##  5 0021-08-20                1        25               34.3     1.89        0.6
##  6 0021-08-20                0        25               33.8     1.9         0.5
##  7 0021-08-20                0        24.9             34.9     1.9         0.6
##  8 0021-08-20                0        22.9             34.2     1.90        3.7
##  9 0021-08-20                0        26.2             33.6     1.90        0.5
## 10 0021-08-20               21        24.6             34       1.89        1  
## # ... with 778 more rows, and 6 more variables: Latitude <dbl>,
## #   Longitude <dbl>, Barometric_Pressure <dbl>, Crosswind <dbl>,
## #   Fruto_Total_Dano_modelo <dbl>, Fruto_Total_Dano_modelo2 <dbl>
##Mapa de predicción de Daño en Frutos
map3=ggplot(datos_fresno3,aes(x=Longitude,y=Latitude,color=Fruto_Total_Dano_modelo2,size=Fruto_Total_Dano_modelo2))+geom_point()+theme_bw()+ggtitle("Arbol de Regresión")
#ggplotly(map3)

require(gridExtra)
gridExtra::grid.arrange(map1,map2, map3, ncol = 1)

Entrenar Maquina de Soporte Vectoria

require(e1071)
## Loading required package: e1071
## Warning: package 'e1071' was built under R version 4.0.4
mod3= svm(Fruto_Total_Dano~Temperature+Relative_Humidity+Altitude+Wind_Speed+Latitude+Longitude+Barometric_Pressure+Crosswind,data=datos_fresno3,kernel="polynomial",degree=10)

modelo3=predict(mod3)

datos_fresno3$Fruto_Total_Dano_modelo3=modelo3
datos_fresno3
## # A tibble: 788 x 13
##    Monitoreo  Fruto_Total_Dano Temperature Relative_Humidi~ Altitude Wind_Speed
##    <date>                <dbl>       <dbl>            <dbl>    <dbl>      <dbl>
##  1 0021-08-20                0        25.7             33.6     1.90        0.8
##  2 0021-08-20                3        20.8             36.8     1.90        5.1
##  3 0021-08-20                0        23.7             31.5     1.89        0.8
##  4 0021-08-20                0        25               33.2     1.89        0.9
##  5 0021-08-20                1        25               34.3     1.89        0.6
##  6 0021-08-20                0        25               33.8     1.9         0.5
##  7 0021-08-20                0        24.9             34.9     1.9         0.6
##  8 0021-08-20                0        22.9             34.2     1.90        3.7
##  9 0021-08-20                0        26.2             33.6     1.90        0.5
## 10 0021-08-20               21        24.6             34       1.89        1  
## # ... with 778 more rows, and 7 more variables: Latitude <dbl>,
## #   Longitude <dbl>, Barometric_Pressure <dbl>, Crosswind <dbl>,
## #   Fruto_Total_Dano_modelo <dbl>, Fruto_Total_Dano_modelo2 <dbl>,
## #   Fruto_Total_Dano_modelo3 <dbl>
##Mapa de predicción de Daño en Frutos
map4=ggplot(datos_fresno3,aes(x=Longitude,y=Latitude,color=Fruto_Total_Dano_modelo3,size=Fruto_Total_Dano_modelo3))+geom_point()+theme_bw()+ggtitle("Maquina de Soporte Vectorial")
#ggplotly(map3)

require(gridExtra)
gridExtra::grid.arrange(map1,map2, map3,map4, ncol = 2)

Entrenar Red Neuronal

require(neuralnet)
## Loading required package: neuralnet
## Warning: package 'neuralnet' was built under R version 4.0.5
datos_fresno4=datos_fresno3
datos_fresno4[,3:10]=scale(datos_fresno4[,3:10])
datos_fresno4=data.frame(datos_fresno4)

mod4= neuralnet(Fruto_Total_Dano~Temperature+Relative_Humidity+Altitude+Wind_Speed+Latitude+Longitude+Barometric_Pressure+Crosswind,hidden = c(1),data=datos_fresno4)

plot(mod4)


modelo4=predict(mod4,datos_fresno4)

datos_fresno4$Fruto_Total_Dano_modelo4=modelo4


##Mapa de predicción de Daño en Frutos
map5=ggplot(datos_fresno4,aes(x=Longitude,y=Latitude,color=Fruto_Total_Dano_modelo4,size=Fruto_Total_Dano_modelo4))+geom_point()+theme_bw()+ggtitle("Red Neuronal")
#ggplotly(map3)

require(gridExtra)
gridExtra::grid.arrange(map1,map2, map3,map4,map5, ncol = 2)

Revisando los resultados obtenidos podemos observar que los modelos que más representan los valores de daños en frutos son el GAM y el árbol de regresiones. No obstante, es necesario tener en cuenta las magnitudes representadas en cada uno de los modelos. La distribución espacial se representa de igual forma en cada uno de los modelos, de manera menos precisa lo hace en el modelo de Red Neuronal y de Máquina de soporte vectorial, sin embargo, estos modelos no se ajustaron hacia un valor que fuera más preciso, por lo que existe una espacialización más leve que los modelos GAM y de árbol de regresiones.