UNIVERSIDAD DE EL SALVADOR
FACULTAD DE CIENCIAS ECONÓMICAS
ESCUELA DE ECONOMÍA
ECONOMETRÍA
TEMA:
“Ejercicio de Pronóstico y Simulación”
DOCENTE:
MSF. Carlos Ademir Pérez Alas.
ESTUDIANTE:
Verónica Nayeli Miranda Mejia
Grupo teórico
GT-03
Ciudad Universitaria, Sábado 15 de junio de 2024
Simulación de la Presentación
Estimación del Modelo
options(scipen = 999999)
library(lmtest)
library(stargazer)
library(equatiomatic)# optativo remotes::install_github("datalorax/equatiomatic")
library(mlbench) #esta librería tiene el data frame BostonHousing
data(BostonHousing)
#Modelo estimado medv~. indica "medv" en función del resto de variables del dataframe
modelo_boston<-lm(formula = medv~.,data=BostonHousing)
extract_eq(modelo_boston,wrap = TRUE) #optativo\[ \begin{aligned} \operatorname{medv} &= \alpha + \beta_{1}(\operatorname{crim}) + \beta_{2}(\operatorname{zn}) + \beta_{3}(\operatorname{indus})\ + \\ &\quad \beta_{4}(\operatorname{chas}_{\operatorname{1}}) + \beta_{5}(\operatorname{nox}) + \beta_{6}(\operatorname{rm}) + \beta_{7}(\operatorname{age})\ + \\ &\quad \beta_{8}(\operatorname{dis}) + \beta_{9}(\operatorname{rad}) + \beta_{10}(\operatorname{tax}) + \beta_{11}(\operatorname{ptratio})\ + \\ &\quad \beta_{12}(\operatorname{b}) + \beta_{13}(\operatorname{lstat}) + \epsilon \end{aligned} \]
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.6459e+01 5.1035e+00 7.1441 3.283e-12 ***
## crim -1.0801e-01 3.2865e-02 -3.2865 0.0010868 **
## zn 4.6420e-02 1.3727e-02 3.3816 0.0007781 ***
## indus 2.0559e-02 6.1496e-02 0.3343 0.7382881
## chas1 2.6867e+00 8.6158e-01 3.1184 0.0019250 **
## nox -1.7767e+01 3.8197e+00 -4.6513 4.246e-06 ***
## rm 3.8099e+00 4.1793e-01 9.1161 < 2.2e-16 ***
## age 6.9222e-04 1.3210e-02 0.0524 0.9582293
## dis -1.4756e+00 1.9945e-01 -7.3980 6.013e-13 ***
## rad 3.0605e-01 6.6346e-02 4.6129 5.071e-06 ***
## tax -1.2335e-02 3.7605e-03 -3.2800 0.0011116 **
## ptratio -9.5275e-01 1.3083e-01 -7.2825 1.309e-12 ***
## b 9.3117e-03 2.6860e-03 3.4668 0.0005729 ***
## lstat -5.2476e-01 5.0715e-02 -10.3471 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Pronóstico en R
Predicción usando “predict” de “R” base
library(stargazer)
#Data para la predicción X'm
X_m<-data.frame(crim=0.05,zn=15,indus=2,chas="0",nox=0.004,
rm=5,age=85,dis=5.56,rad=2,tax=300,ptratio=17,b=0.00005,lstat=5)
# Intervalos de Confianza del 95% y del 99%
confidense<-c(0.95,0.99)
#Predicción usando predict
predict(object = modelo_boston,
newdata = X_m,
interval = "prediction",
level = confidense,
se.fit =TRUE)->predicciones
rownames(predicciones$fit)<-as.character(confidense*100)
colnames(predicciones$fit)<-c("Ym","Li","Ls")
stargazer(predicciones$fit,
title = "Pronosticos e Intervalos de Confianza",
type = "html") #Poner results='asis' en opciones del chunk| Ym | Li | Ls | |
| 95 | 26.116 | 15.558 | 36.673 |
| 99 | 26.116 | 12.221 | 40.010 |
Interpretación
Al utilizar este modelo, en un intervalo de confianza del 95% la valoración de la casa sería de $261,000.00 dólares, asimismo puede tener un valor mínimo de $155,000.00 y un valor máximo de $366,000.00. Mientras que para un intervalo de confianza del 99%, la estimación puntual no cambia, pero si cambia el intervalo de confianza siendo más ancho, donde el valor minimo sería de $122,000.00 y el valor máximo de $40,000.00.
Predicción usando librería “forecast”
library(forecast)
library(kableExtra)
#Data para la predicción X'm
X_m<-data.frame(crim=0.05,zn=15,indus=2,chas="0",nox=0.004,
rm=5,age=85,dis=5.56,rad=2,tax=300,ptratio=17,b=0.00005,lstat=5)
#Nivel de confianza para el intervalo de confianza
confidense<-c(0.95,0.99)
#Realizando el pronóstico con forecast
pronosticos<-forecast(object = modelo_boston,
level = confidense,
newdata = X_m,ts = FALSE)
kable(pronosticos,
caption = "Pronóstico e intervalos de confianza:",
digits = 2,format = "html") #Poner results='asis' en opciones del chunk| Point Forecast | Lo 95 | Hi 95 | Lo 99 | Hi 99 |
|---|---|---|---|---|
| 26.12 | 15.56 | 36.67 | 12.22 | 40.01 |
Interpretación
Al utilizar este modelo, en un intervalo de confianza del 95% la valoración de la casa sería de $261,000.00 dólares, asimismo puede tener un valor mínimo de $155,000.00 y un valor máximo de $366,000.00. Mientras que para un intervalo de confianza del 99%, la estimación puntual no cambia, pero si cambia el intervalo de confianza siendo más ancho, donde el valor minimo sería de $122,000.00 y el valor máximo de $40,000.00.
Ejemplo Simulación en R
Definición de funciones para el cálculo Theil y su descomposición, debe estar instalada la librería DescTools
#Bias Proportion
Um<-function(pronosticado,observado){
library(DescTools)
((mean(pronosticado)-mean(observado))^2)/MSE(pronosticado,observado)
}
#Variance Proportion
Us<-function(pronosticado,observado){
library(DescTools)
((sd(pronosticado)-sd(observado))^2)/MSE(pronosticado,observado)
}
#Covariance Proportion
Uc<-function(pronosticado,observado){
library(DescTools)
(2*(1-cor(pronosticado,observado))*sd(pronosticado)*sd(observado))/MSE(pronosticado,observado)}
#Coeficiente U de Theil (también aparece en la librería "DescTools")
THEIL_U<-function(pronosticado,observado){
library(DescTools)
RMSE(pronosticado,observado)/(sqrt(mean(pronosticado^2))+sqrt(mean(observado^2)))
}Script de Simulación
options(scipen = 999999) #No mostrar notación cientifica.
library(dplyr) # Para manejo de datos y activar el operador "pipe" %>%
library(caret) # Permite Realizar muestreo sobre los data frame
library(DescTools) # Contiene las funciones para calcular las medidas de performance
library(stargazer) # Para dar formato, y obtener resumen estadistico de las simulaciones
set.seed(50) # Permite fijar la semilla aleatoria, para reproducir los resultados obtenidos en esta clase
numero_de_muestras<-1000 # Numero de muestras que se optendran del data frame
# Se crea la lista con las 1000 muestras (indica la posición de la fila en cada data frame)
muestras<- BostonHousing$medv %>%
createDataPartition(p = 0.8,
times = numero_de_muestras,
list = TRUE)
# Listas vacias, que contendran los datos de entrenamiento, los pronosticos para los datos de prueba, y para las estadisticas de cada muestra
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)
#Estimación de los modelos lineales para cada muestra, los pronósticos y cálculo de las estadisticas de performance.
for(j in 1:numero_de_muestras){
Datos_Entrenamiento<- BostonHousing[muestras[[j]], ]
Datos_Prueba<- BostonHousing[-muestras[[j]], ]
Modelos_Entrenamiento[[j]]<-lm(formula = medv~.,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$medv),
RMSE = RMSE(Modelos_Entrenamiento[[j]]$fitted.values,
Datos_Entrenamiento$medv),
MAE = MAE(Modelos_Entrenamiento[[j]]$fitted.values,
Datos_Entrenamiento$medv),
MAPE= MAPE(Modelos_Entrenamiento[[j]]$fitted.values,
Datos_Entrenamiento$medv)*100,
THEIL=TheilU(Modelos_Entrenamiento[[j]]$fitted.values,
Datos_Entrenamiento$medv,type = 1),
Um=Um(Modelos_Entrenamiento[[j]]$fitted.values,
Datos_Entrenamiento$medv),
Us=Us(Modelos_Entrenamiento[[j]]$fitted.values,
Datos_Entrenamiento$medv),
Uc=Uc(Modelos_Entrenamiento[[j]]$fitted.values,
Datos_Entrenamiento$medv)
)
Resultados_Performance[[j]]<-data.frame(
R2 = R2(Pronostico_Prueba[[j]], Datos_Prueba$medv),
RMSE = RMSE(Pronostico_Prueba[[j]], Datos_Prueba$medv),
MAE = MAE(Pronostico_Prueba[[j]], Datos_Prueba$medv),
MAPE= MAPE(Pronostico_Prueba[[j]], Datos_Prueba$medv)*100,
THEIL=TheilU(Pronostico_Prueba[[j]], Datos_Prueba$medv,
type = 1), # También se puede usar la función que creamos: THEIL_U
Um=Um(Pronostico_Prueba[[j]], Datos_Prueba$medv),
Us=Us(Pronostico_Prueba[[j]], Datos_Prueba$medv),
Uc=Uc(Pronostico_Prueba[[j]], Datos_Prueba$medv)
)
} #No olvidar este corchete ;)Resultados de la Simulación
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"))| Statistic | N | Mean | St. Dev. | Min | Pctl(25) | Pctl(75) | Max |
| R2 | 1,000 | 0.743 | 0.013 | 0.713 | 0.734 | 0.751 | 0.794 |
| RMSE | 1,000 | 4.653 | 0.141 | 4.177 | 4.565 | 4.759 | 4.948 |
| MAE | 1,000 | 3.265 | 0.095 | 2.905 | 3.204 | 3.332 | 3.512 |
| MAPE | 1,000 | 16.387 | 0.464 | 14.813 | 16.085 | 16.718 | 17.691 |
| THEIL | 1,000 | 0.096 | 0.003 | 0.087 | 0.095 | 0.099 | 0.102 |
| Um | 1,000 | 0.000 | 0.000 | 0 | 0 | 0 | 0 |
| Us | 1,000 | 0.074 | 0.004 | 0.058 | 0.072 | 0.077 | 0.085 |
| Uc | 1,000 | 0.928 | 0.004 | 0.918 | 0.925 | 0.931 | 0.945 |
Interpretación
Al observar Theil, se muestra que tiene un valor finito menor que uno, es decir que tiene un buen comportamiento.
La proporción de sesgo en datos del modelo estimado presenta ceros.
El 74.3% de la varianza en Y, es explicada por los regresores.
La explicación de la varianza podria estar entre 71.3% y 79.4%.
Según MAE, el modelo se equivoca en $3,200.00 dólares al momento de la evaluación.
Según MAPE el error mínimo esperado es de 14.81 para la data de estrenamiento y el máximo es de 17.70
El pronóstico de varianza esta entre un mínimo de 0.05 y un máximo de 0.08.
El pronóstico de covarianza esta alto, se encuentra entre un mínimo de 0.918 y un máximo de 0.945.
La suma de proporción de sesgo y de varianza da menos de 0.20, lo que significa que es un modelo bastante bueno.
bind_rows(Resultados_Performance) %>%
stargazer(title = "Medidas de Performance Simulacion",
type = "html",
digits = 3,
summary.stat = c("n", "mean", "sd", "min", "p25", "p75", "max"))| Statistic | N | Mean | St. Dev. | Min | Pctl(25) | Pctl(75) | Max |
| R2 | 1,000 | 0.723 | 0.056 | 0.452 | 0.690 | 0.764 | 0.840 |
| RMSE | 1,000 | 4.862 | 0.575 | 3.465 | 4.450 | 5.226 | 6.961 |
| MAE | 1,000 | 3.411 | 0.281 | 2.633 | 3.216 | 3.598 | 4.492 |
| MAPE | 1,000 | 17.197 | 1.618 | 12.875 | 16.066 | 18.262 | 23.137 |
| THEIL | 1,000 | 0.101 | 0.012 | 0.073 | 0.092 | 0.108 | 0.148 |
| Um | 1,000 | 0.011 | 0.016 | 0.000 | 0.001 | 0.015 | 0.205 |
| Us | 1,000 | 0.081 | 0.066 | 0.00000 | 0.027 | 0.122 | 0.333 |
| Uc | 1,000 | 0.918 | 0.066 | 0.667 | 0.875 | 0.971 | 1.010 |
Interpretación
Según MAE, el modelo se equivoca en $3,400.00 dólares al momento de la evaluación.
Según MAPE el error mínimo esperado es de 12.875 para la data de estrenamiento y el máximo es de 23.137
La diferencia de correlación es de 0.01
La distancia promedio entre las medias de los datos observados y proyectados del modelo es de 0.011.
Las distancias en las volatilidades es pequeña, en general la distancia entre sus medias y las volatilidades, es inferior al 0.20 por lo tanto se garantiza que los pronósticos que se hicieron al inicio son bastantes certeros.
Con los datos del ejercicio de estimadores HAC:
Realice una simulación del pronóstico, usando como datos de entrenamiento el 75% de los datos originales, considere 500 replicas y analice los resultados del desempeño del modelo con los datos “desconocidos”. En ambos casos utilice la semilla aleatoria de 50
Estimación del Modelo
options(scipen = 999999)
library(stargazer)
load("C:/Users/User/Desktop/documents_rstudio/periodo_3/Verónica Nayeli Miranda Mejia - smoke.RData")
ata<-data
equation<-as.formula("cigs~cigpric+lcigpric+income+lincome+age+agesq+educ+white+restaurn")
endogena<-data$cigs
Modelo_smoke<-lm(formula =equation,data = data)
stargazer::stargazer(Modelo_smoke,
title = "Modelo Estimado",
type = "text",
digits = 8)##
## Modelo Estimado
## ===============================================
## 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
Simulación en R
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)))
}Script de Simulación
options(scipen = 999999) #No mostrar notación cientifica.
library(dplyr) # Para manejo de datos y activar el operador "pipe" %>%
library(caret) # Permite Realizar muestreo sobre los data frame
library(DescTools)
library(stargazer)
set.seed(50)
numero_de_muestras_2<-500
proporcion_entrenamiento_2<-0.75
# Creación de las muestras, aquí usamos la variable endógena que definimos con anterioridad
muestras_2<- endogena %>%
createDataPartition(p = proporcion_entrenamiento_2,
times = numero_de_muestras_2,
list = TRUE)
#Listas vacias para la simulación
Modelos_Entrenamiento_2<-vector(mode = "list",
length = numero_de_muestras_2)
Pronostico_Prueba_2<-vector(mode = "list",
length = numero_de_muestras_2)
Resultados_Performance_data_entrenamiento_2<-vector(mode = "list",
length = numero_de_muestras_2)
Resultados_Performance_2<-vector(mode = "list",
length = numero_de_muestras_2)
# Estimar los modelos de cada muestra y sus medidas de desempeño predictivo
for(j in 1:numero_de_muestras_2){
Datos_Entrenamiento_2<- data[muestras_2[[j]], ]
Datos_Prueba_2<- data[-muestras_2[[j]], ]
Modelos_Entrenamiento_2[[j]]<-lm(formula = equation,data=Datos_Entrenamiento_2)
Pronostico_Prueba_2[[j]]<-Modelos_Entrenamiento_2[[j]] %>% predict(Datos_Prueba_2)
Fe<-Modelos_Entrenamiento_2[[j]]$fitted.values
Ye<-Datos_Entrenamiento_2$cigs
Resultados_Performance_data_entrenamiento_2[[j]]<-data.frame(
R2_2 = R2(Fe,Ye),
RMSE_2 = RMSE(Fe,Ye),
MAE_2 = MAE(Fe,Ye),
MAPE_2= MAPE(Fe,Ye)*100,
THEIL_2=TheilU(Fe,Ye,type = 1),
Um_2=Um(Fe,Ye),
Us_2=Us(Fe,Ye),
Uc_2=Uc(Fe,Ye)
)
Fp<-Pronostico_Prueba_2[[j]]
Yp<-Datos_Prueba_2$cigs
Resultados_Performance_2[[j]]<-data.frame(
R2_2 = R2(Fp,Yp ),
RMSE_2 = RMSE(Fp, Yp),
MAE_2 = MAE(Fp,Yp),
MAPE_2= MAPE(Fp,Yp)*100,
THEIL_2=TheilU(Fp,Yp,type = 1),
Um_2=Um(Fp,Yp),
Us_2=Us(Fp,Yp),
Uc_2=Uc(Fp,Yp)
)
}Resultados de la Simulación
library(dplyr)
bind_rows(Resultados_Performance_data_entrenamiento_2) %>%
stargazer(title= "Medidas de Performance Datos del Modelo",
type = "html",
digits = 3,
summary.stat = c("n","mean","sd","min","p25","p75","max"))| Statistic | N | Mean | St. Dev. | Min | Pctl(25) | Pctl(75) | Max |
| R2_2 | 500 | 0.058 | 0.007 | 0.040 | 0.054 | 0.063 | 0.083 |
| RMSE_2 | 500 | 13.304 | 0.198 | 12.629 | 13.175 | 13.439 | 13.828 |
| MAE_2 | 500 | 10.562 | 0.133 | 10.068 | 10.474 | 10.654 | 10.969 |
| MAPE_2 | 500 | Inf.000 | Inf | Inf | Inf | Inf | |
| THEIL_2 | 500 | 0.522 | 0.006 | 0.505 | 0.517 | 0.526 | 0.541 |
| Um_2 | 500 | 0.000 | 0.000 | 0 | 0 | 0 | 0 |
| Us_2 | 500 | 0.613 | 0.020 | 0.554 | 0.601 | 0.625 | 0.669 |
| Uc_2 | 500 | 0.389 | 0.020 | 0.332 | 0.376 | 0.401 | 0.448 |
Interpretación
Al observar Theil, se muestra que tiene un valor finito menor que uno, es decir que tiene un buen comportamiento.
La proporción de sesgo en datos del modelo estimado presenta ceros.
El 0.05 de la varianza en Y, es explicada por los regresores.
La explicación de la varianza podria estar entre 4% y 8%.
Según MAE, el modelo se equivoca en $10.56 dólares al momento de la evaluación.
Según MAPE el error mínimo esperado es infinito para la data de estrenamiento y el máximo es también infinito.
El pronóstico de varianza esta entre un mínimo de 0.55 y un máximo de 0.66.
El pronóstico de covarianza esta bajo, se encuentra entre un mínimo de 0.332 y un máximo de 0.44.
La suma de proporción de sesgo y de varianza no da menos de 0.20, lo que significa que no es un modelo bastante bueno.
bind_rows(Resultados_Performance_2) %>%
stargazer(title = "Medidas de Performance Simulación",
type = "html",
digits = 3,
summary.stat = c("n","mean","sd","min","p25","p75","max"))| Statistic | N | Mean | St. Dev. | Min | Pctl(25) | Pctl(75) | Max |
| R2_2 | 500 | 0.039 | 0.018 | 0.002 | 0.027 | 0.051 | 0.099 |
| RMSE_2 | 500 | 13.479 | 0.595 | 11.734 | 13.064 | 13.853 | 15.361 |
| MAE_2 | 500 | 10.728 | 0.290 | 9.834 | 10.528 | 10.904 | 11.626 |
| MAPE_2 | 500 | Inf.000 | Inf | Inf | Inf | Inf | |
| THEIL_2 | 500 | 0.528 | 0.013 | 0.491 | 0.519 | 0.536 | 0.564 |
| Um_2 | 500 | 0.002 | 0.003 | 0.00000 | 0.0003 | 0.003 | 0.021 |
| Us_2 | 500 | 0.597 | 0.051 | 0.476 | 0.563 | 0.636 | 0.751 |
| Uc_2 | 500 | 0.405 | 0.051 | 0.253 | 0.367 | 0.441 | 0.529 |
Interpretación
Según MAE, el modelo se equivoca en $10.73 dólares al momento de la evaluación.
Según MAPE el error mínimo y máximo esta en inf.
La diferencia de correlación es de 0.016
La distancia promedio entre las medias de los datos observados y proyectados del modelo es de 0.002.
Las distancias en las volatilidades no es pequeña, en general la distancia entre sus medias y las volatilidades, es superior al 0.20 por lo tanto se garantiza que los pronósticos que se hicieron al inicio no son bastantes certeros.