U2A5

FernandoA.

16/5/2021

U2A5: Regresión No lineal polinomica.

Importación de paquetes

library(pacman)
# Si esta en linux descarga unas bibliotecas necesarias para correr este código
p_load(readr,DT,rmdformats, xfun,ISLR,ggplot2,boot)

Importacion de datos

names = c("AÑO","ENE","FEB","MAR","ABR","MAY","JUN","JUL","AGO","SEP","OCT","NOV","DIC","ACUMULADO","MEDIA","MESES")
lluvias <- read.table("lluvias.txt")
names(lluvias) <- names


temperaturas = read.table("temperaturas.txt")
names(temperaturas) <- names
 
papas <- read.csv("papasV2.csv")
papas <- papas[-c(seq(26,30)),]
papas$lluvias <- lluvias$MEDIA
papas$temperaturas <- temperaturas$MEDIA

Descarga del código

xfun::embed_file("U2A5.Rmd")
Download U2A5.Rmd

Descarga de los datos

xfun::embed_file("papasV2.csv")
Download papasV2.csv
xfun::embed_file("temperaturas.txt")
Download temperaturas.txt
xfun::embed_file("lluvias.txt")
Download lluvias.txt

Primera visualizacion de los datos

datatable(papas)
papas$Superficie_Cosechada[1:5]
## [1] 3570 3332 4171 4178 3102

Visualización de los datos

poly(papas$Superficie_Cosechada, degree = 4, raw=TRUE,simple=TRUE)[1:5]
## [1] 3570 3332 4171 4178 3102
poly(papas$Superficie_Cosechada, degree = 4, raw=FALSE, simple=TRUE)[1:5]
## [1] -0.2285076 -0.2423422 -0.1935722 -0.1931653 -0.2557118
# CÁLCULO DEL MODELO POLINÓMICO DE GRADO 4
# ----------------------------------------
modelo_poli4 <- lm(Valor_de_la_Produccion ~ poly(Superficie_Cosechada, 4), data = papas)
summary(modelo_poli4)
## 
## Call:
## lm(formula = Valor_de_la_Produccion ~ poly(Superficie_Cosechada, 
##     4), data = papas)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1026361  -273080   -41158   176245  1087165 
## 
## Coefficients:
##                                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                     1109749      95536  11.616 2.41e-10 ***
## poly(Superficie_Cosechada, 4)1  4739165     477681   9.921 3.61e-09 ***
## poly(Superficie_Cosechada, 4)2   346125     477681   0.725    0.477    
## poly(Superficie_Cosechada, 4)3  -868556     477681  -1.818    0.084 .  
## poly(Superficie_Cosechada, 4)4  -196433     477681  -0.411    0.685    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 477700 on 20 degrees of freedom
## Multiple R-squared:  0.8366, Adjusted R-squared:  0.804 
## F-statistic: 25.61 on 4 and 20 DF,  p-value: 1.268e-07
# INTERPOLACIÓN DE PUNTOS DENTRO DEL RANGO DEL PREDICTOR
# -----------------------------------------------------------------------------
limites <- range(papas$Superficie_Cosechada)
nuevos_puntos <- seq(from = limites[1], to = limites[2], by = 1)
nuevos_puntos <- data.frame(Superficie_Cosechada = nuevos_puntos)

# PREDICCIÓN DE LA VARIABLE RESPUESTA Y DEL ERROR ESTÁNDAR
# -----------------------------------------------------------------------------
predicciones <- predict(modelo_poli4, newdata = nuevos_puntos, se.fit = TRUE,
                        level = 0.95)

# CÁLCULO DEL INTERVALO DE CONFIANZA SUPERIOR E INFERIOR 95%
# -----------------------------------------------------------------------------
intervalo_conf <- data.frame(inferior = predicciones$fit -
                                        1.96*predicciones$se.fit,
                             superior = predicciones$fit +
                                        1.96*predicciones$se.fit)

plot(x = papas$Superficie_Cosechada, y = papas$Valor_de_la_Produccion , pch = 20, col = "darkgrey")
title("Polinomio de grado 4: Superficie_Cosechada ~ Valor_de_la_Produccion")
points(x = nuevos_puntos$Superficie_Cosechada, predicciones$fit, col = "red", pch = 10)
points(x = nuevos_puntos$Superficie_Cosechada, intervalo_conf$inferior, col = "blue", pch = 4)
points(x = nuevos_puntos$Superficie_Cosechada, intervalo_conf$superior, col = "blue", pch = 4)

attach(papas)
## The following objects are masked _by_ .GlobalEnv:
## 
##     lluvias, temperaturas
plot(x = Superficie_Cosechada, y = Valor_de_la_Produccion, pch = 20, col = "darkgrey")
title("Polinomio de grado 4: Superficie_Cosechada ~ Valor_de_la_Produccion")
lines(x = nuevos_puntos$Superficie_Cosechada, predicciones$fit, col = "red", lwd = 2)
lines(x = nuevos_puntos$Superficie_Cosechada, intervalo_conf$inferior, col = "blue", lwd = 2)
lines(x = nuevos_puntos$Superficie_Cosechada, intervalo_conf$superior, col = "blue", lwd = 2)

ggplot(data = papas, aes(x = Superficie_Cosechada, y = Valor_de_la_Produccion)) +
  geom_point(color = "grey30", alpha = 0.3) + 
  geom_smooth(method = "lm", formula = y ~ poly(x, 4), color = "red") +
  labs(title = "Polinomio de grado 4: Valor_de_la_Produccion ~ Superficie_Cosechada") +
  theme_bw() +
  theme(plot.title = element_text(hjust = 0.5))

# Se ajustan modelos polinómicos de grado 1 a 5
# ----------------------------------------------------------------------------
modelo_1 <- lm(Valor_de_la_Produccion ~ Superficie_Cosechada, data = papas)
modelo_2 <- lm(Valor_de_la_Produccion ~ poly(Superficie_Cosechada, 2), data = papas)
modelo_3 <- lm(Valor_de_la_Produccion ~ poly(Superficie_Cosechada, 3), data = papas)
modelo_4 <- lm(Valor_de_la_Produccion ~ poly(Superficie_Cosechada, 4), data = papas)
modelo_5 <- lm(Valor_de_la_Produccion ~ poly(Superficie_Cosechada, 5), data = papas)

anova(modelo_1, modelo_2, modelo_3, modelo_4, modelo_5)
## Analysis of Variance Table
## 
## Model 1: Valor_de_la_Produccion ~ Superficie_Cosechada
## Model 2: Valor_de_la_Produccion ~ poly(Superficie_Cosechada, 2)
## Model 3: Valor_de_la_Produccion ~ poly(Superficie_Cosechada, 3)
## Model 4: Valor_de_la_Produccion ~ poly(Superficie_Cosechada, 4)
## Model 5: Valor_de_la_Produccion ~ poly(Superficie_Cosechada, 5)
##   Res.Df        RSS Df  Sum of Sq      F  Pr(>F)  
## 1     23 5.4764e+12                               
## 2     22 5.3566e+12  1 1.1980e+11 0.5129 0.48262  
## 3     21 4.6022e+12  1 7.5439e+11 3.2294 0.08824 .
## 4     20 4.5636e+12  1 3.8586e+10 0.1652 0.68897  
## 5     19 4.4384e+12  1 1.2519e+11 0.5359 0.47307  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
cv_MSE_k10 <- rep(NA,10)

for (i in 1:10) {
  modelo <- glm(Valor_de_la_Produccion ~ poly(Superficie_Cosechada, i), data = papas)
  set.seed(17)
  cv_MSE_k10[i] <- cv.glm(data = papas, glmfit = modelo, K = 10)$delta[1]
}
p4 <- ggplot(data = data.frame(polinomio = 1:10, cv_MSE = cv_MSE_k10),
             aes(x = polinomio, y = cv_MSE)) +
      geom_point(colour = c("firebrick3")) +
      geom_path()
p4 <- p4 + theme(panel.grid.major = element_line(colour  =  'gray90'))
p4 <- p4 + theme(plot.title = element_text(face  =  'bold'))
p4 <- p4 + theme(panel.background = element_rect(fill  =  'gray98'))
p4 <- p4 + labs(title  =  'Test Error ~ Grado del polinomio')
p4 <- p4 + scale_x_continuous(breaks = 1:10)
p4