Estimación del modelo Cigarros

options(scipen = 99999)
load("C:/Users/Molin/Downloads/smoke.RData")
Modelo_smoke<-lm(formula =cigs~cigpric+lcigpric+income+lincome+age+agesq+educ+white+restaurn,data = data)
stargazer::stargazer(Modelo_smoke,title = "Regresión lineal multiple del model de Smoke.",type = "html",digits = 8)
Regresión lineal multiple del model de Smoke.
Dependent variable:
cigs
cigpric 2.00226800
(1.49283100)
lcigpric -115.27350000
(85.42432000)
income -0.00004619
(0.00013349)
lincome 1.40406100
(1.70816600)
age 0.77835900***
(0.16055560)
agesq -0.00915035***
(0.00174929)
educ -0.49478060***
(0.16818020)
white -0.53105160
(1.46072200)
restaurn -2.64424100**
(1.12999900)
Constant 340.80440000
(260.01560000)
Observations 807
R2 0.05515398
Adjusted R2 0.04448445
Residual Std. Error 13.41285000 (df = 797)
F Statistic 5.16929800*** (df = 9; 797)
Note: p<0.1; p<0.05; p<0.01
print(data.frame(desc))
##    variable                         label
## 1      educ            years of schooling
## 2   cigpric  state cig. price, cents/pack
## 3     white                   =1 if white
## 4       age                      in years
## 5    income              annual income, $
## 6      cigs          cigs. smoked per day
## 7  restaurn =1 if rest. smk. restrictions
## 8   lincome                   log(income)
## 9     agesq                         age^2
## 10 lcigpric                 log(cigprice)

Verifique si la matriz de Varianza-Covarianza del modelo es escalar

Heterocedasticidad

library(lmtest)
Prueba_White<-bptest(Modelo_smoke, ~I(cigpric^2)+I(lcigpric^2)+I(income^2)+I(lincome^2)+I(age^2)+I(agesq^2)+I(educ^2)+I(white^2)+I(restaurn^2),data = data)
print(Prueba_White)
## 
##  studentized Breusch-Pagan test
## 
## data:  Modelo_smoke
## BP = 26.323, df = 9, p-value = 0.001809

Teniendo en cuenta las hipotesis y el criterio de evaluación para saber si se rechaza la hipotesis nula, se conluye que se tiene evidencia suficiente para rechazar la hipotesis nula, ya que 0.001809 < 0.05, lo que indica que hay evidencia de que la varianza de los residuos es heterocedastica.

Autocorrelación

library(lmtest)
bgtest(Modelo_smoke,order = 1)
## 
##  Breusch-Godfrey test for serial correlation of order up to 1
## 
## data:  Modelo_smoke
## LM test = 0.069737, df = 1, p-value = 0.7917

Teniendo en cuenta las hipotesis y el criterio de evaluación para saber si se rechaza la hipotesis nula, se conluye que se tiene evidencia suficiente para no rechazar la hipotesis nula, ya que 0.7917 > 0.05, lo que indica que hay evidencia de que no existe autocorrelación entre las variables de primer orden.

library(lmtest)
bgtest(Modelo_smoke,order = 2)
## 
##  Breusch-Godfrey test for serial correlation of order up to 2
## 
## data:  Modelo_smoke
## LM test = 0.26889, df = 2, p-value = 0.8742

Teniendo en cuenta las hipotesis y el criterio de evaluación para saber si se rechaza la hipotesis nula, se conluye que se tiene evidencia suficiente para no rechazar la hipotesis nula, ya que 0.7917 > 0.05, lo que indica que hay evidencia de que no existe autocorrelación entre las variables de segundo orden.

Estimador HAC

Modelo sin corregir

options(scipen = 99999)
library(lmtest)
coeftest(Modelo_smoke)
## 
## t test of coefficients:
## 
##                   Estimate     Std. Error t value     Pr(>|t|)    
## (Intercept)  340.804374604  260.015587269  1.3107     0.190334    
## cigpric        2.002267667    1.492831189  1.3413     0.180220    
## lcigpric    -115.273464445   85.424315195 -1.3494     0.177585    
## income        -0.000046194    0.000133491 -0.3460     0.729402    
## lincome        1.404061178    1.708165841  0.8220     0.411340    
## age            0.778359013    0.160555612  4.8479 0.0000015001 ***
## agesq         -0.009150353    0.001749292 -5.2309 0.0000002158 ***
## educ          -0.494780616    0.168180198 -2.9420     0.003356 ** 
## white         -0.531051635    1.460721806 -0.3636     0.716287    
## restaurn      -2.644241351    1.129998690 -2.3400     0.019528 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Modelo corregido

options(scipen = 99999)
library(lmtest)
library(sandwich)
vcov_HAC<-vcovHC(Modelo_smoke,type = "HC0")
coeftest(Modelo_smoke,vcov. = vcov_HAC)
## 
## t test of coefficients:
## 
##                   Estimate     Std. Error t value        Pr(>|t|)    
## (Intercept)  340.804374604  278.565072885  1.2234        0.221530    
## cigpric        2.002267667    1.602727983  1.2493        0.211927    
## lcigpric    -115.273464445   91.344424879 -1.2620        0.207331    
## income        -0.000046194    0.000115593 -0.3996        0.689540    
## lincome        1.404061178    1.228970726  1.1425        0.253602    
## age            0.778359013    0.136944678  5.6837 0.0000000184838 ***
## agesq         -0.009150353    0.001451548 -6.3039 0.0000000004804 ***
## educ          -0.494780616    0.162968371 -3.0361        0.002475 ** 
## white         -0.531051635    1.361907703 -0.3899        0.696691    
## restaurn      -2.644241351    1.038254938 -2.5468        0.011058 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
library(sandwich)
Robust_se<-sqrt(diag(vcov_HAC))

Comparación de ambos modelos usando stargazer.

library(stargazer)
stargazer(Modelo_smoke,Modelo_smoke,se=list(NULL,Robust_se),
          column.labels = c("Orginial","Corregido"),type = "html",title = "Comparación del modelo inicial con el corregido.",align = TRUE)
Comparación del modelo inicial con el corregido.
Dependent variable:
cigs
Orginial Corregido
(1) (2)
cigpric 2.002 2.002
(1.493) (1.603)
lcigpric -115.273 -115.273
(85.424) (91.344)
income -0.00005 -0.00005
(0.0001) (0.0001)
lincome 1.404 1.404
(1.708) (1.229)
age 0.778*** 0.778***
(0.161) (0.137)
agesq -0.009*** -0.009***
(0.002) (0.001)
educ -0.495*** -0.495***
(0.168) (0.163)
white -0.531 -0.531
(1.461) (1.362)
restaurn -2.644** -2.644**
(1.130) (1.038)
Constant 340.804 340.804
(260.016) (278.565)
Observations 807 807
R2 0.055 0.055
Adjusted R2 0.044 0.044
Residual Std. Error (df = 797) 13.413 13.413
F Statistic (df = 9; 797) 5.169*** 5.169***
Note: p<0.1; p<0.05; p<0.01

Estimación

library(forecast)
library(kableExtra)
X_n<-data.frame(cigpric=60.506,lcigpric=4.102743,income=20000,lincome=9.903487,age=46,agesq=2116,educ=16.0,white=1,restaurn=0)
confidense<-c(0.95,0.99)
pronosticos<-forecast(object = Modelo_smoke,
                      level=confidense,
                      newdata = X_n,
                      ts=FALSE)
kable(pronosticos,
      caption = "Pronósticos e intervalos de confianza",
      digits = 2,format = "html")
Pronósticos e intervalos de confianza
Point Forecast Lo 95 Hi 95 Lo 99 Hi 99
9.99 -16.41 36.39 -24.74 44.72
Um<-function(pronosticado,observado){
  library(DescTools)
  ((mean(pronosticado)-mean(observado))^2)/MSE(pronosticado,observado) 
}
Us<-function(pronosticado,observado){
  library(DescTools)
  ((sd(pronosticado)-sd(observado))^2)/MSE(pronosticado,observado)
}
Uc<-function(pronosticado,observado){
  library(DescTools)
  (2*(1-cor(pronosticado,observado))*sd(pronosticado)*sd(observado))/MSE(pronosticado,observado)}
THEIL_U<-function(pronosticado,observado){
   library(DescTools)
  RMSE(pronosticado,observado)/(sqrt(mean(pronosticado^2))+sqrt(mean(observado^2)))
}
options(scipen = 999999) 
library(dplyr) 
library(caret)
library(DescTools) 
library(stargazer) 
set.seed(50) 
numero_de_muestras<-500
muestras<- data$cigs %>%
  createDataPartition(p = 0.75,
                      times = numero_de_muestras,
                      list = TRUE)
Modelos_Entrenamiento<-vector(mode = "list",
                              length = numero_de_muestras)
Pronostico_Prueba<-vector(mode = "list",
                              length = numero_de_muestras)
Resultados_Performance_data_entrenamiento<-vector(mode = "list",
                              length = numero_de_muestras)
Resultados_Performance<-vector(mode = "list",
                              length = numero_de_muestras)
for(j in 1:numero_de_muestras){
Datos_Entrenamiento<- data[muestras[[j]], ]
Datos_Prueba<- data[-muestras[[j]], ]
Modelos_Entrenamiento[[j]]<-lm(formula = cigs~cigpric+lcigpric+income+lincome+age+agesq+educ+white+restaurn,data=Datos_Entrenamiento)
Pronostico_Prueba[[j]]<-Modelos_Entrenamiento[[j]] %>% predict(Datos_Prueba)
Resultados_Performance_data_entrenamiento[[j]]<-data.frame( 
            R2 = R2(Modelos_Entrenamiento[[j]]$fitted.values,
                    Datos_Entrenamiento$cigs),
            RMSE = RMSE(Modelos_Entrenamiento[[j]]$fitted.values,
                        Datos_Entrenamiento$cigs),
            MAE = MAE(Modelos_Entrenamiento[[j]]$fitted.values,
                      Datos_Entrenamiento$cigs),
            MAPE= MAPE(Modelos_Entrenamiento[[j]]$fitted.values,
                       Datos_Entrenamiento$cigs)*100,
            THEIL=TheilU(Modelos_Entrenamiento[[j]]$fitted.values,
                         Datos_Entrenamiento$cigs,type = 1),
            Um=Um(Modelos_Entrenamiento[[j]]$fitted.values,
                         Datos_Entrenamiento$cigs),
            Us=Us(Modelos_Entrenamiento[[j]]$fitted.values,
                         Datos_Entrenamiento$cigs),
            Uc=Uc(Modelos_Entrenamiento[[j]]$fitted.values,
                         Datos_Entrenamiento$cigs)
            )
Resultados_Performance[[j]]<-data.frame( 
            R2 = R2(Pronostico_Prueba[[j]], Datos_Prueba$cigs),
            RMSE = RMSE(Pronostico_Prueba[[j]], Datos_Prueba$cigs),
            MAE = MAE(Pronostico_Prueba[[j]], Datos_Prueba$cigs),
            MAPE= MAPE(Pronostico_Prueba[[j]], Datos_Prueba$cigs)*100,
            THEIL=TheilU(Pronostico_Prueba[[j]], Datos_Prueba$cigs,
                         type = 1), 
            Um=Um(Pronostico_Prueba[[j]], Datos_Prueba$cigs),
            Us=Us(Pronostico_Prueba[[j]], Datos_Prueba$cigs),
            Uc=Uc(Pronostico_Prueba[[j]], Datos_Prueba$cigs)
            )
}
bind_rows(Resultados_Performance_data_entrenamiento) %>%
  stargazer(title= "Medidas de Performance Datos del Modelo", type = "html", digits = 3,summary.stat = c("n","mean","sd","min","p25","p75","max"))
Medidas de Performance Datos del Modelo
Statistic N Mean St. Dev. Min Pctl(25) Pctl(75) Max
R2 500 0.058 0.007 0.040 0.054 0.063 0.083
RMSE 500 13.304 0.198 12.629 13.175 13.439 13.828
MAE 500 10.562 0.133 10.068 10.474 10.654 10.969
MAPE 500 Inf.000 Inf Inf Inf Inf
THEIL 500 0.522 0.006 0.505 0.517 0.526 0.541
Um 500 0.000 0.000 0 0 0 0
Us 500 0.613 0.020 0.554 0.601 0.625 0.669
Uc 500 0.389 0.020 0.332 0.376 0.401 0.448
  • En esta ocasion, las medidad del performance del modelo nos dice que en promedio el 5,8% de la varianza en Y es representada por los regresores, obteniendo que en minimo los datos puedes caer en el 4% y el máximo 8,3%.
  • En el modelo original, el indicador MAE dice que en promedio el modelo se equivoca en 10,5 cigarros fumados por día, pero el indicador MAPE dice que el modelo tiene un error hacia el infinito al momento de hacer predicciones, por lo que se concluye que el modelo no funciona en este caso.
  • Y eso se observa en las proporciones, en donde la proporción de covarianza (Uc) es menor del 90%, con 38,9% y la suma de la proporción del sesgo (Um) con la proporción de la varianza (Us) es mayor que el 10%, siendo de 61,3% para el modelo.
bind_rows(Resultados_Performance) %>% 
  stargazer(title = "Medidas de Performance Simulación",
            type = "html",
            digits = 3,
            summary.stat = c("n","mean","sd","min","p25","p75","max"))
Medidas de Performance Simulación
Statistic N Mean St. Dev. Min Pctl(25) Pctl(75) Max
R2 500 0.039 0.018 0.002 0.027 0.051 0.099
RMSE 500 13.479 0.595 11.734 13.064 13.853 15.361
MAE 500 10.728 0.290 9.834 10.528 10.904 11.626
MAPE 500 Inf.000 Inf Inf Inf Inf
THEIL 500 0.528 0.013 0.491 0.519 0.536 0.564
Um 500 0.002 0.003 0.00000 0.0003 0.003 0.021
Us 500 0.597 0.051 0.476 0.563 0.636 0.751
Uc 500 0.405 0.051 0.253 0.367 0.441 0.529
  • En esta ocasion, las medidad del performance de la simulación nos dicen que en promedio el 3,9% de la varianza en Y es representada por los regresores, obteniendo que en minimo los datos puedes caer en el 0,2% y el máximo 9%, se puede observar ahora, que la distancia entre el máximo y percentir 75 es de casi el 5%.
  • En el modelo estimado, el indicador MAE dice que en promedio el modelo se equivoca en 10,7 cigarros fumados por día, pero el indicador MAPE dice que el modelo simulado erra hacia el infinito al momento de realizar predicciones, por lo que se concluye que el modelo simulado tampoco funciona en este caso.
  • Y eso se observa en las proporciones, en donde la proporción de covarianza (Uc) es menor del 90%, con 40,5% y la suma de la proporción del sesgo (Um) con la proporción de la varianza (Us) es mayor que el 10%, siendo de 59,9%% para este modelo simulado.