CIDE
Maestría en Economía
Series de tiempo
Profesor: Edwin Salim Tapia
Maestría en Economía
Series de tiempo
Profesor: Edwin Salim Tapia
Pronóstico de la actividad industrial de México mediante técnica ARMAX
Segunda entrega
por:
Karla Isayuvi Amaro Estrada-1912032
Nevid Antonio Torres Lezama-1912046
Jose Miguel Manrique Velasco-1912040
Daniel Alfonso Hernández Gutiérrez-1912039
Pronostico actividad industrial México
ANALSIS DEL SECTOR INDUSTRIAL
En México, durante el periodo comprendido de 2010 a 2020, la actividad industrial ha representado en promedio un 32% de la actividad económica total. Teniendo su participación más baja en el segundo trimestre del 2020 {ver gráfico 1}. La actividad industrial por si sola logra la absorción del 13% de la población ocupada, lo que representa, en términos absolutos, cerca de 12.5 millones de personas.
Fuente: Elaboración propia con base en BIE, INEGI.
La actividad industrial toatal puede dividirs en cuatro sub sectores: Minería; Generación, Transmisión y Distribución de Energía Eléctrica; Suministro de Agua y de Gas por Ductos al Consumidor Final; Construcción e Industrias Manufactureras. Esta última subdivisión, de Industrias Manufactureras, concentra el mayor dinamismo dentro de las actividades secundarias, por si sola, representa en promedio, el 52% de la actividad industrial total, siendo el 57% del valor de la actividad industrial total durante el 4to trimestre de 2020.
Fuente: Elaboración propia con base en BIE, INEGI.
Es por ello que variaciones que afecten la actividad manufacturera tendrán fuertes implicaciones en el comportamiento total de la actividad industrial. En este sentido, es relevante señalar la importancia del sector de los semiconductores dentro de la actividad manufacturera; las constantes innovaciones tecnológicas han tenido un fuerte impacto en la necesidad de las empresas, pues mientras hace unos años la principal necesidad de insumos recaía en metales brutos, hoy día el 80% de los costos de producción recae en desarrollos tecnológicos como los semiconductores, de tal suerte que la producción de los mismos podrá promover o afectar las cadenas de producción internacionales que emplean este importante insumo.
La industria automotriz mexicana es un claro ejemplo de la dinámica descrita anteriormente, pues la necesidad de insumos tecnológicos es esencial para su desarrollo. Además, una gran parte de la actividad económica de México se sostiene del crecimiento de la industria automotriz, por lo que, de manera indirecta, la actividad industrial depende de lo que suceda en el sector de los semiconductores, el cual ha sido afectado de manera importante por la pandemia.
En los primeros meses de la pandemia, la demanda de semiconductores cambio drásticamente; la industria automotriz dejó de ser el principal demandante de estos insumos, debido a la caída en las ventas de automóviles particulares y de transporte. Sin embargo, los proveedores de estos insumos lograron colocar su oferta en las industrias de televisores y computadoras, que aumentaron sus ventas dadas las nuevas dinámicas generadas por la pandemia. No obstante, a esto debemos sumar el contexto internacional, donde los principales proveedores han visto afectado su proceso de producción; por ejemplo, en EE.UU. las heladas sufridas durante la época invernal obligaron el cierre de empresas productoras de semiconductores, mientras que, en China, la producción se destinó principalmente al sector interno dadas las sanciones impuestas por EE.UU. en la guerra comercial promovida por el expresidente Donald Trump.
Fuente: Elaboración propia con base en datos de Edwin Tapia.
Así, una caída en la oferta de semiconductores a nivel mundial y la escaza oferta nacional de los mismos, combinado con una recuperación de las ventas del sector automotriz generará escasez de semiconductores para la industria automotriz, lo cual impactará negativamente la actividad industrial nacional. Esto lo podemos ver reflejado no solo en nuestro pronóstico de la actividad industrial: 98.22606, si no también en las noticias relacionadas al paro de actividades en diferentes plantas del sector automotriz.
| Fecha | Prónostico Actividad Industrial |
|---|---|
| Febrero 2021 | 98.22606 |
REPORTE ESTADÍSTICO
Ventana de datos (Muestra): La ventana de tiempo utilizada para la estimación de nuestro modelo y posterior pronostico comprende de Ene-1993 a Feb-2021. Nuestra información es reportada de forma mensual.
Nuestras variables son: Actividad Industrial (AI), Producción de Vehículos Automóviles (PVA), Producción de Vehículos Camiones (PVC) e Indicador IMEG del Sector Manufacturero (IMEG). Es importante señalar que las bases de datos proporcionadas PVA y PVC están ajustados por estacionalidad.
ESTRUCTURA DE LOS DATOS
Modelo ARMAX Definición: El modelo ARMAX es un Proceso Autoregresivo de Media Móvil con Variables Exógenas. Esta forma de modelar es una variante del ARMA, donde estamos considerando que nuestro termino de error tiene su propia estructura de rezagos. En este caso tenemos que el modelo es multivariado,
Para la adecuada modelación se debe considerar que no hay estacionalidad en las series que utilizamos.
• Serie desestacionalizada de la PVA de México; periodicidad mensual, 1993-01 : 2021-02
• Serie desestacionalizada de la PVC de México; periodicidad mensual, 1993-01 : 2021-02
• Serie desestacionalizada de la AI de México; periodicidad mensual, 1993-01 : 2021-02
• Serie desestacionalizada de la AI de México; periodicidad mensual, 1993-01 : 2021-01
• Serie desestacionalizada IMEG; periodicidad mensual, 2005-01 : 2021-02
Modelo ARMAX
Cargamos nuestros datos
# Cargamos los datos
data <- read_excel("act_ind.xlsx", range = "A2:E340")
names(data)[1] <- "fecha"
indactplot<- xts(x = data$act_ind[-338], order.by = data$fecha[-338])
plot.xts(indactplot)# Nuestra variable dependiente será la tasa mensual de actividad industrial de México
lact_ind <-log(indactplot)
Y <- (as.numeric(lact_ind) - as.numeric(lag.xts(lact_ind)))*100
Y <- as.matrix(Y[-1])
plot(Y, type = "l")# Nuestra variable explicativa 1 será la Producción de vehículos automóviles
X1c <- (log(data$prod_autos) - lag(log(data$prod_autos)))*100
X1 <- X1c[-c(1,338)]
plot(X1, type = "l")# Nuestra variable explicativa 2 será la Producción de vehículos camiones
X2c <- (log(data$prod_camio) - lag(log(data$prod_camio)))*100
X2 <- X2c[-c(1,338)]
plot(X2, type = "l")# Nuestra base de datos estara entonces dado por:
dataMOM <- data.frame(act_ind = Y, prod_auto = X1, prod_camio = X2)Paso 1: Elegimos la variable independiente que mejor explique el crecimiento de la actividad industrial de México (Y)
i<- NULL
lag_Xs <- c()
for(i in 1:12){
if (i==1){
lag_Xs<-cbind(X1,lag.xts(X1,k=i))
} else {
lag_Xs <-cbind(lag_Xs,lag.xts(X1,k=i))
}
}
for(i in 1:12){
if (i==1){
lag_Xs<-cbind(lag_Xs,X2,lag.xts(X2,k=i))
} else {
lag_Xs <-cbind(lag_Xs,lag.xts(X2,k=i))
}
}
colnames(lag_Xs)[1:13]<- paste("prod_auto", 0:12, sep = "")
colnames(lag_Xs)[14:26]<- paste("prod_camio", 0:12, sep = "")
act_ind_Xs<-data.frame(Y,lag_Xs)
ggcorrplot(cor(act_ind_Xs[13:NROW(act_ind_Xs),]),lab=T, lab_size = 2 , type = "upper")Para este primer análisis se empleó la base de producción de automóviles y camiones en México, pues como mencionamos en el análisis de la industria, es el sector más dinámico dentro de la actividad económica industrial. Podemos ver en nuestro mapa de correlación que las variables explicativas son contemporáneas, es decir emplearemos dentro de nuestras variables explicativas (X) la actividad en el periodo 0 (sin rezagos).
Por ello tenemos que nuestro modelo tendrá la forma:
\(Y_t=ϕ(L) X_t+θ(L) ε_t\)
.
Paso 2: Estimamos la regresión entre X & Y
xreg <- lag_Xs[, c(1,14)] # Tomamos la variables contemporáneasdummy <- ifelse( mean(Y)-2*sd(Y) < Y & Y < mean(Y)-sd(Y), 0.8,
ifelse(Y <= (mean(Y)-2*sd(Y)), 1,0))
dum_date <- data.frame(Y, dummy ,
dates = seq(as.Date("1993-02-01"),
as.Date("2021-01-01"),
by = "month"))
xreg1 <- cbind(xreg,dummy )
m1 <- lm(Y ~ xreg1)
summary(m1)
Call:
lm(formula = Y ~ xreg1)
Residuals:
Min 1Q Median 3Q Max
-11.9275 -0.7061 -0.0891 0.6035 7.6156
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.222867 0.079617 2.799 0.00542 **
xreg1prod_auto0 0.011635 0.002888 4.029 0.0000696 ***
xreg1prod_camio0 0.045090 0.004183 10.780 < 0.0000000000000002 ***
xreg1 -5.987405 0.553487 -10.818 < 0.0000000000000002 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.433 on 332 degrees of freedom
Multiple R-squared: 0.6159, Adjusted R-squared: 0.6124
F-statistic: 177.4 on 3 and 332 DF, p-value: < 0.00000000000000022
fit<-as.matrix(fitted(m1))
plot.ts(coredata(Y),col="red")
lines(fit,col="blue")Realizamos la prueba de raíz unitaria DFuller
library(urca)
residuales_m1=m1$residuals
residualPlot(m1)DF_m1 =ur.df(residuales_m1)
DF_m1@teststat tau1
statistic -13.19334
Se corrobora que los datos son estacionarios, pues nuestro T estadístico en la prueba de DFuller es mayor en valor absoluto a 10.
Paso 3: Revisamos la función de autocorrelación de los residuos para encontrar un modelo ARMA que explique los residuos
acf2(residuals(m1)) [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
ACF -0.14 0.06 -0.04 0.03 0.05 -0.08 -0.03 0.02 -0.03 0.02 0.04 -0.07 0.09
PACF -0.14 0.04 -0.03 0.01 0.06 -0.07 -0.06 0.02 -0.03 0.00 0.06 -0.07 0.07
[,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25]
ACF -0.07 0.07 0.01 0.00 0.04 0.04 0.04 0.01 -0.05 0.03 -0.07 0.06
PACF -0.03 0.03 0.04 0.01 0.03 0.06 0.05 0.02 -0.04 0.02 -0.07 0.06
[,26] [,27] [,28] [,29]
ACF -0.01 0.02 -0.05 0.02
PACF 0.00 0.03 -0.06 0.01
Con nuestro plot de residuos podemos considerar un MA(24)
Paso 4: Estimamos nuestro modelo ARMAX
y_am1 <- sarima(Y,1,0,0,
fixed = c(NA,
NA,
rep(NA,3))
,xreg=xreg1)initial value 0.353749
iter 2 value 0.343527
iter 3 value 0.341720
iter 4 value 0.338104
iter 5 value 0.338081
iter 6 value 0.338060
iter 7 value 0.338059
iter 8 value 0.338059
iter 9 value 0.338059
iter 9 value 0.338059
iter 9 value 0.338059
final value 0.338059
converged
initial value 0.337896
iter 2 value 0.337894
iter 3 value 0.337893
iter 4 value 0.337893
iter 5 value 0.337893
iter 5 value 0.337893
iter 5 value 0.337893
final value 0.337893
converged
# y_am11 <- sarima(Y,1,0,1,
# fixed = c(NA,
# NA,
# NA,
# rep(NA,3))
# ,xreg=xreg1)
# y_am1 # 3.574219 sin media / 3.549376 con media
# y_am11 # 3.574115 sin media / 3.551223 con media # MA no significativo
acf2(y_am1[["fit"]][["residuals"]]) [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
ACF 0.01 0.07 -0.01 0.02 0.05 -0.07 -0.05 -0.01 -0.04 0.02 0.04 -0.05 0.07
PACF 0.01 0.07 -0.01 0.02 0.05 -0.08 -0.05 0.01 -0.04 0.02 0.05 -0.06 0.06
[,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25]
ACF -0.05 0.07 0.03 0 0.04 0.06 0.06 0.01 -0.04 0.01 -0.06 0.04
PACF -0.04 0.05 0.03 0 0.02 0.07 0.05 0.00 -0.03 0.01 -0.06 0.06
[,26] [,27] [,28] [,29]
ACF 0 0.01 -0.05 0.01
PACF 0 0.02 -0.05 0.02
mean(y_am1[["fit"]][["residuals"]])[1] 0.000787159
Paso 5: Forecast. Pronosticamos para cada una de nuestras variables
Variables explicativas
Para las variables explicativas (tasa mensual de producción de autos y camiones) estimamos un periodo, que corresponde al mes de febrero del 2021. Para ello empleamos el comando sarima.for.
xpred1 <- cbind(X1c[338], X2c[338], 0 )Con nuestro pronostico anterior procedemos a calcular el índice de la actividad industrial para el mes de febrero de 2021.
Variable Dependiente
Y1_Pred <- sarima.for(Y,1,0,0,
fixed = c(NA,
NA,
rep(NA,3)),
xreg=xreg1,
newxreg = xpred1,
n.ahead = 1)ARMAX_Feb21 <- as.numeric(Y1_Pred$pred)
data$act_ind[337]*exp(ARMAX_Feb21/100)[1] 96.98933
Nuestro valor pronosticado es :
| Fecha | Prónostico Actividad Industrial |
|---|---|
| Febrero 2021 | 98.22606 |
La tasa mensual prevista muestra que el índice de actividad industrial disminuye 1.37%, ubicando al índice en 98.22606. Este resultado está relacionado con la distorsión global en la cadena de suministro y, por lo tanto, es consistente.
La principal razón de este descenso es la escasez mundial de semiconductores y su impacto en la industria, especialmente en los sectores de automotriz y de componentes electrónicos.
A partir de lo señalado en las instrucciones de trabajo procedimos a investigar variables potencialmente explicativas de la actividad industrial
Modelo ARMAX + Variable 1 [Confianza en la manufactura]
Elegimos primero la confianza en la manufactura pues en las cadenas productivas internacionales, México se inserta como un maquilador, teniendo entonces que la confianza en este sector podría ser clave para incentivar el crecimiento de la actividad industrial
Cargamos nuestros datos
# Cargamos los datos
data2 <- read_excel("act_ind.xlsx", range = "A146:J340")
names(data2) <- c("fecha","act_ind", "prod_autos", "prod_camio","pmi",
"exp_emp", "conf_man", "ind_pedman", "igae", "imp")
indactplot2<- xts(x = data2$act_ind[-194], order.by = data2$fecha[-194])
plot.xts(indactplot2)# Nuestra variable dependiente será la tasa mensual de actividad industrial de México
lact_ind <-log(indactplot2)
Y <- (as.numeric(lact_ind) - as.numeric(lag.xts(lact_ind)))*100
Y <- as.matrix(Y[-1])
colnames(Y) <- "act_ind"
plot(Y, type = "l")# Nuestra variable explicativa 1 será el indicador IMEF
Z1c <- (log(data2$pmi) - lag(log(data2$pmi)))*100
Z1 <- Z1c[-c(1,194)]
plot(Z1, type = "l")# Nuestra variable explicativa 2 será la Confianza de industrias manufactureras
Z2c <- (log(data2$conf_man) - lag(log(data2$conf_man)))*100
Z2 <- Z2c[-c(1,194)]
plot(Z2, type = "l")# Nuestra base de datos estara entonces dado por:
data2MOM <- data.frame(act_ind = Y, pmi = Z1, conf_man = Z2)Paso 1: Elegimos la variable independiente que mejor explique el crecimienmto de la actividad industrial de México (Y)
i<- NULL
lag_2Xs <- c()
for(i in 1:12){
if (i==1){
lag_2Xs<-cbind(Z1,lag.xts(Z1,k=i))
} else {
lag_2Xs <-cbind(lag_2Xs,lag.xts(Z1,k=i))
}
}
for(i in 1:12){
if (i==1){
lag_2Xs<-cbind(lag_2Xs,Z2,lag.xts(Z2,k=i))
} else {
lag_2Xs <-cbind(lag_2Xs,lag.xts(Z2,k=i))
}
}
colnames(lag_2Xs)[1:13]<- paste("pmi", 0:12, sep = "")
colnames(lag_2Xs)[14:26]<- paste("conf_man", 0:12, sep = "")
act_ind_2Xs<-data.frame(Y,lag_2Xs)
ggcorrplot(cor(act_ind_2Xs[13:NROW(act_ind_2Xs),]),lab=T, lab_size = 2 , type = "upper")Se observa que las variables explicativas son contemporáneas
Paso 2: Estimamos la regresion entre X & Y
zreg <- lag_2Xs[, c(1,14)] # Tomamos la variables contemporáneasdummy2 <- ifelse( mean(Y)-2*sd(Y) < Y & Y < mean(Y)-sd(Y), 0.8,
ifelse(Y <= (mean(Y)-2*sd(Y)), 1,0))
sum(dummy2 != 0)/NROW(dummy2)*100[1] 1.5625
dum2_date <- data.frame(Y, dummy2 ,
dates = seq(as.Date("2005-02-01"),
as.Date("2021-01-01"),
by = "month"))
zreg1 <- cbind(zreg,dummy2 )
m2 <- lm(Y ~ zreg1)
summary(m2)
Call:
lm(formula = Y ~ zreg1)
Residuals:
Min 1Q Median 3Q Max
-12.9009 -0.7245 -0.1369 0.5204 12.9664
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.23132 0.14234 1.625 0.105814
zreg1pmi0 0.16182 0.04502 3.595 0.000415 ***
zreg1conf_man0 0.19330 0.05567 3.472 0.000640 ***
zreg1act_ind -13.10040 1.40991 -9.292 < 0.0000000000000002 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.957 on 188 degrees of freedom
Multiple R-squared: 0.4955, Adjusted R-squared: 0.4875
F-statistic: 61.56 on 3 and 188 DF, p-value: < 0.00000000000000022
fit<-as.matrix(fitted(m2))
plot.ts(Y,col="red")
lines(fit,col="blue") #Realizamos la prueba de raíz unitaria DFuller
residuales_m2=m2$residuals
residualPlot(m2)# Con la gráfica podemos intuir que los datos no son estacionarios
DF_m2 =ur.df(residuales_m2)
summary(DF_m2)
###############################################
# Augmented Dickey-Fuller Test Unit Root Test #
###############################################
Test regression none
Call:
lm(formula = z.diff ~ z.lag.1 - 1 + z.diff.lag)
Residuals:
Min 1Q Median 3Q Max
-11.4558 -0.8291 -0.1885 0.5912 10.7222
Coefficients:
Estimate Std. Error t value Pr(>|t|)
z.lag.1 -1.33073 0.10737 -12.393 <0.0000000000000002 ***
z.diff.lag 0.18566 0.07165 2.591 0.0103 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.908 on 188 degrees of freedom
Multiple R-squared: 0.5763, Adjusted R-squared: 0.5718
F-statistic: 127.8 on 2 and 188 DF, p-value: < 0.00000000000000022
Value of test-statistic is: -12.3935
Critical values for test statistics:
1pct 5pct 10pct
tau1 -2.58 -1.95 -1.62
DF_m2@teststat tau1
statistic -12.39346
Se corrobora que los datos son estacionarios, pues nuestro T estadistico en la prueba de DFuller es mayor en valor absoluto a 10
Paso 3: Revisamos la función de utocorrelación de los residuos para encontrar un modelo ARMA que explique los residuos
acf2(residuals(m2)) [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
ACF -0.12 -0.17 0.09 0.05 0.00 -0.01 0.01 -0.01 0.01 -0.08 0.05 0.00 0.04
PACF -0.12 -0.19 0.04 0.04 0.04 0.01 0.01 -0.02 0.00 -0.09 0.03 -0.02 0.06
[,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24]
ACF -0.01 -0.05 0.00 -0.01 -0.01 0 -0.02 0.01 -0.02 0.01 -0.09
PACF 0.00 -0.03 -0.03 -0.04 -0.03 0 -0.03 0.02 -0.03 0.02 -0.11
Con nuestro plot de residuos podemos considerar un MA(2)
Paso 4: Estimamos nuestro modelo ARMAX
y2_am2 <- sarima(Y,0,0,2,
xreg=zreg1)initial value 0.660806
iter 2 value 0.640730
iter 3 value 0.635339
iter 4 value 0.633199
iter 5 value 0.633097
iter 6 value 0.633084
iter 7 value 0.633084
iter 8 value 0.633084
iter 8 value 0.633084
iter 8 value 0.633084
final value 0.633084
converged
initial value 0.633390
iter 2 value 0.633388
iter 3 value 0.633386
iter 4 value 0.633386
iter 5 value 0.633386
iter 5 value 0.633386
iter 5 value 0.633386
final value 0.633386
converged
acf2(y_am1[["fit"]][["residuals"]]) [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
ACF 0.01 0.07 -0.01 0.02 0.05 -0.07 -0.05 -0.01 -0.04 0.02 0.04 -0.05 0.07
PACF 0.01 0.07 -0.01 0.02 0.05 -0.08 -0.05 0.01 -0.04 0.02 0.05 -0.06 0.06
[,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25]
ACF -0.05 0.07 0.03 0 0.04 0.06 0.06 0.01 -0.04 0.01 -0.06 0.04
PACF -0.04 0.05 0.03 0 0.02 0.07 0.05 0.00 -0.03 0.01 -0.06 0.06
[,26] [,27] [,28] [,29]
ACF 0 0.01 -0.05 0.01
PACF 0 0.02 -0.05 0.02
mean(y_am1[["fit"]][["residuals"]])[1] 0.000787159
Paso 5: Forecast. Pronosticamos para cada una de nuetras variables
Variables explicativas
zpred1 <- cbind(Z1c[194], Z2c[194], 0 )Variable Dependiente
Y2_Pred <- sarima.for(Y,0,0,2,
xreg= zreg1,
newxreg = zpred1,
n.ahead = 1)ARMAX2_Feb21 <- as.numeric(Y2_Pred$pred)
data2$act_ind[193]*exp(ARMAX2_Feb21/100)[1] 98.22606
Segunda propuesta
Modelo ARMAX + Variable 2 [IND_PED_MAN]
Para este modelo elegimos el índice de pedidos manufactureros, al ser una de las partes más dinámicas de la actividad industrial, consideramos que una disminución en los pedidos implica problemas en las cadenas de suministros lo cual puede estar relacionado a problemas en la oferta, o bien podría responder a una disminución de bienes finales lo cual implicaría una caída en la demanda de bienes industriales.
Cargamos nuestros datos
# Cargamos los datos
# data2 <- read_excel("act_ind.xlsx", range = "A146:G340")
# names(data2) <- c("fecha","act_ind", "prod_autos", "prod_camio","pmi", "igae", "igae_sec")
#
# indactplot2<- xts(x = data2$act_ind[-194], order.by = data2$fecha[-194])
# plot.xts(indactplot2)
#
# # Nuestra variable dependiente será la tasa mensual de actividad industrial de México
#
# lact_ind <-log(indactplot2)
# Y <- (as.numeric(lact_ind) - as.numeric(lag.xts(lact_ind)))*100
# Y <- as.matrix(Y[-1])
#
# plot(Y, type = "l")
# Nuestra variable explicativa 1 será el indicador IMEF
B1c <- (log(data2$pmi) - lag(log(data2$pmi)))*100
B1 <- B1c[-c(1,194)]
plot(B1, type = "l")# Nuestra variable explicativa 2 será el igae del sector secundario
B2c <- (log(data2$ind_pedman) - lag(log(data2$ind_pedman)))*100
B2 <- B2c[-c(1,194)]
plot(B2, type = "l")# Nuestra base de datos estara entonces dado por:
data3MOM <- data.frame(act_ind = Y, pmi = B1, ind_pedman = B2)Paso 1: Elegimos la variable independiente que mejor explique el crecimienmto de la actividad industrial de México (Y)
i<- NULL
lag_3Xs <- c()
for(i in 1:12){
if (i==1){
lag_3Xs<-cbind(B1,lag.xts(B1,k=i))
} else {
lag_3Xs <-cbind(lag_3Xs,lag.xts(B1,k=i))
}
}
for(i in 1:12){
if (i==1){
lag_3Xs<-cbind(lag_3Xs,B2,lag.xts(B2,k=i))
} else {
lag_3Xs <-cbind(lag_3Xs,lag.xts(B2,k=i))
}
}
colnames(lag_3Xs)[1:13]<- paste("pmi", 0:12, sep = "")
colnames(lag_3Xs)[14:26]<- paste("ind_pedman", 0:12, sep = "")
act_ind_3Xs<-data.frame(Y,lag_3Xs)
ggcorrplot(cor(act_ind_3Xs[13:NROW(act_ind_3Xs),]),lab=T, lab_size = 2 , type = "upper")Se observa que las variables explicativas son contemporáneas
Paso 2: Estimamos la regresion entre X & Y
breg <- lag_3Xs[, c(1,14)] # Tomamos la variables contemporáneas# dummy2 <- ifelse( mean(Y)-2*sd(Y) < Y & Y < mean(Y)-sd(Y), 0.8,
# ifelse(Y <= (mean(Y)-2*sd(Y)), 1,0))
# sum(dummy2 != 0)/NROW(dummy2)
# dum2_date <- data.frame(Y, dummy2 ,
# dates = seq(as.Date("2005-02-01"),
# as.Date("2021-01-01"),
# by = "month"))
breg1 <- cbind(breg,dummy2)
m3 <- lm(Y ~ breg1)
summary(m3)
Call:
lm(formula = Y ~ breg1)
Residuals:
Min 1Q Median 3Q Max
-12.5168 -0.8303 -0.1240 0.5430 9.0658
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.20160 0.13344 1.511 0.13251
breg1pmi0 0.11909 0.04278 2.784 0.00592 **
breg1ind_pedman0 0.33009 0.05223 6.320 0.00000000185 ***
breg1act_ind -12.74464 1.28979 -9.881 < 0.0000000000000002 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.833 on 188 degrees of freedom
Multiple R-squared: 0.5572, Adjusted R-squared: 0.5502
F-statistic: 78.87 on 3 and 188 DF, p-value: < 0.00000000000000022
fit<-as.matrix(fitted(m3))
plot.ts(coredata(Y),col="red")
lines(fit,col="blue") #Realizamos la prueba de raíz unitaria DFuller
residuales_m3=m3$residuals
residualPlot(m3)# Con la gráfica podemos intuir que los datos no son estacionarios
DF_m3 =ur.df(residuales_m3)
summary(DF_m3)
###############################################
# Augmented Dickey-Fuller Test Unit Root Test #
###############################################
Test regression none
Call:
lm(formula = z.diff ~ z.lag.1 - 1 + z.diff.lag)
Residuals:
Min 1Q Median 3Q Max
-9.6814 -0.7910 -0.1513 0.5523 8.8485
Coefficients:
Estimate Std. Error t value Pr(>|t|)
z.lag.1 -1.52977 0.11359 -13.467 < 0.0000000000000002 ***
z.diff.lag 0.20612 0.07128 2.892 0.00428 **
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.726 on 188 degrees of freedom
Multiple R-squared: 0.6497, Adjusted R-squared: 0.646
F-statistic: 174.3 on 2 and 188 DF, p-value: < 0.00000000000000022
Value of test-statistic is: -13.4674
Critical values for test statistics:
1pct 5pct 10pct
tau1 -2.58 -1.95 -1.62
DF_m3@teststat tau1
statistic -13.46745
Paso 3: Revisamos la función de autocorrelación de los residuos para encontrar un modelo ARMA que explique los residuos
acf2(residuals(m3)) [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
ACF -0.27 -0.12 0.07 0.06 -0.04 0.04 -0.03 -0.01 0.03 -0.08 0.05 -0.06 0.05
PACF -0.27 -0.21 -0.03 0.06 0.01 0.06 -0.01 -0.01 0.02 -0.08 0.01 -0.08 0.03
[,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24]
ACF 0.01 -0.01 0.00 -0.01 -0.01 0.02 -0.02 -0.05 0.05 0.01 -0.10
PACF 0.03 0.01 0.02 -0.02 -0.02 0.00 -0.03 -0.05 0.00 0.03 -0.08
Con nuestro plot de residuos podemos considerar un MA(1)
Paso 4: Estimamos nuestro modelo ARMAX
y3_am1 <- sarima(Y,0,0,1,
xreg=breg1)initial value 0.595555
iter 2 value 0.547202
iter 3 value 0.536239
iter 4 value 0.531976
iter 5 value 0.531546
iter 6 value 0.531524
iter 7 value 0.531521
iter 8 value 0.531521
iter 9 value 0.531521
iter 9 value 0.531521
iter 9 value 0.531521
final value 0.531521
converged
initial value 0.531694
iter 2 value 0.531693
iter 3 value 0.531693
iter 4 value 0.531693
iter 4 value 0.531693
iter 4 value 0.531693
final value 0.531693
converged
acf2(y_am1[["fit"]][["residuals"]]) [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
ACF 0.01 0.07 -0.01 0.02 0.05 -0.07 -0.05 -0.01 -0.04 0.02 0.04 -0.05 0.07
PACF 0.01 0.07 -0.01 0.02 0.05 -0.08 -0.05 0.01 -0.04 0.02 0.05 -0.06 0.06
[,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25]
ACF -0.05 0.07 0.03 0 0.04 0.06 0.06 0.01 -0.04 0.01 -0.06 0.04
PACF -0.04 0.05 0.03 0 0.02 0.07 0.05 0.00 -0.03 0.01 -0.06 0.06
[,26] [,27] [,28] [,29]
ACF 0 0.01 -0.05 0.01
PACF 0 0.02 -0.05 0.02
mean(y_am1[["fit"]][["residuals"]])[1] 0.000787159
Paso 5: Forecast. Pronosticamos para cada una de nuetras variables
Variables explicativas
bpred1 <- cbind(B1c[194], B2c[194], 0 )Variable Dependiente
Y3_Pred <- sarima.for(Y,0,0,1,
xreg= breg1,
newxreg = bpred1,
n.ahead = 1)ARMAX3_Feb21 <- as.numeric(Y3_Pred$pred)
data2$act_ind[193]*exp(ARMAX3_Feb21/100)[1] 97.2746
Modelo ARMAX + Variable 3 [IMP]
Para este modelo consideramos que las importaciones de bienes intermedios no petroleros sería una buena variable explicativa, pues como lo señalamos en el inciso anterior, este puede ser un indicador adelantado de lo que se espera en el sector productivo y la actividad industrial.
Cargamos nuestros datos
# Cargamos los datos
# data2 <- read_excel("act_ind.xlsx", range = "A146:G340")
# names(data2) <- c("fecha","act_ind", "prod_autos", "prod_camio","pmi", "igae", "igae_sec")
#
# indactplot2<- xts(x = data2$act_ind[-194], order.by = data2$fecha[-194])
# plot.xts(indactplot2)
#
# # Nuestra variable dependiente será la tasa mensual de actividad industrial de México
#
# lact_ind <-log(indactplot2)
# Y <- (as.numeric(lact_ind) - as.numeric(lag.xts(lact_ind)))*100
# Y <- as.matrix(Y[-1])
#
# plot(Y, type = "l")
# Nuestra variable explicativa 1 será el indicador IMEF
D1c <- (log(data2$pmi) - lag(log(data2$pmi)))*100
D1 <- D1c[-c(1,194)]
plot(D1, type = "l")# Nuestra variable explicativa 2 serán las importaciones
D2c <- (log(data2$imp) - lag(log(data2$imp)))*100
D2 <- D2c[-c(1,194)]
plot(D2, type = "l")# Nuestra base de datos estara entonces dado por:
data4MOM <- data.frame(act_ind = Y, pmi = D1, imp = D2)Paso 1: Elegimos la variable independiente que mejor explique el crecimienmto de la actividad industrial de México (Y)
i<- NULL
lag_4Xs <- c()
for(i in 1:12){
if (i==1){
lag_4Xs<-cbind(D1,lag.xts(D1,k=i))
} else {
lag_4Xs <-cbind(lag_4Xs,lag.xts(D1,k=i))
}
}
for(i in 1:12){
if (i==1){
lag_4Xs<-cbind(lag_4Xs,D2,lag.xts(D2,k=i))
} else {
lag_4Xs <-cbind(lag_4Xs,lag.xts(D2,k=i))
}
}
colnames(lag_4Xs)[1:13]<- paste("pmi", 0:12, sep = "")
colnames(lag_4Xs)[14:26]<- paste("imp", 0:12, sep = "")
act_ind_4Xs<-data.frame(Y,lag_4Xs)
ggcorrplot(cor(act_ind_4Xs[13:NROW(act_ind_4Xs),]),lab=T, lab_size = 2 , type = "upper")Se observa que las variables explicativas son contemporáneas
Paso 2: Estimamos la regresion entre X & Y
dreg <- lag_4Xs[, c(1,14)] # Tomamos la variables contemporáneas# dummy2 <- ifelse( mean(Y)-2*sd(Y) < Y & Y < mean(Y)-sd(Y), 0.8,
# ifelse(Y <= (mean(Y)-2*sd(Y)), 1,0))
# sum(dummy2 != 0)/NROW(dummy2)
# dum2_date <- data.frame(Y, dummy2 ,
# dates = seq(as.Date("2005-02-01"),
# as.Date("2021-01-01"),
# by = "month"))
dreg1 <- cbind(dreg,dummy2)
m4 <- lm(Y ~ dreg1)
summary(m4)
Call:
lm(formula = Y ~ dreg1)
Residuals:
Min 1Q Median 3Q Max
-13.5306 -0.8176 -0.0243 0.5129 12.9501
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.20013 0.14350 1.395 0.164766
dreg1pmi0 0.17374 0.04465 3.892 0.000138 ***
dreg1imp0 0.05184 0.01651 3.139 0.001968 **
dreg1act_ind -14.01036 1.36123 -10.292 < 0.0000000000000002 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.968 on 188 degrees of freedom
Multiple R-squared: 0.4899, Adjusted R-squared: 0.4818
F-statistic: 60.19 on 3 and 188 DF, p-value: < 0.00000000000000022
fit<-as.matrix(fitted(m4))
plot.ts(Y,col="red")
lines(fit,col="blue") #Realizamos la prueba de raíz unitaria DFuller
residuales_m4=m4$residuals
residualPlot(m4)# Con la gráfica podemos intuir que los datos no son estacionarios
DF_m4 =ur.df(residuales_m4)
summary(DF_m4)
###############################################
# Augmented Dickey-Fuller Test Unit Root Test #
###############################################
Test regression none
Call:
lm(formula = z.diff ~ z.lag.1 - 1 + z.diff.lag)
Residuals:
Min 1Q Median 3Q Max
-11.5904 -0.7763 -0.0916 0.5182 10.3774
Coefficients:
Estimate Std. Error t value Pr(>|t|)
z.lag.1 -1.42251 0.10918 -13.029 < 0.0000000000000002 ***
z.diff.lag 0.21152 0.07124 2.969 0.00338 **
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.893 on 188 degrees of freedom
Multiple R-squared: 0.6056, Adjusted R-squared: 0.6014
F-statistic: 144.3 on 2 and 188 DF, p-value: < 0.00000000000000022
Value of test-statistic is: -13.0291
Critical values for test statistics:
1pct 5pct 10pct
tau1 -2.58 -1.95 -1.62
DF_m4@teststat tau1
statistic -13.02908
Paso 3: Revisamos la función de autocorrelación de los residuos para encontrar un modelo ARMA que explique los residuos
acf2(residuals(m4)) [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
ACF -0.17 -0.17 0.10 0.00 0.01 0.02 0.00 -0.04 0.03 -0.08 0.04 0.02 0.00
PACF -0.17 -0.21 0.03 -0.01 0.04 0.03 0.03 -0.03 0.02 -0.10 0.02 -0.01 0.03
[,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24]
ACF 0.04 -0.05 -0.02 0.00 0.01 0.02 -0.03 -0.02 -0.03 0.06 -0.06
PACF 0.05 -0.02 -0.02 -0.03 -0.01 0.03 -0.03 -0.02 -0.06 0.04 -0.05
Con nuestro plot de residuos podemos considerar un MA(2)
Paso 4: Estimamos nuestro modelo ARMAX
y4_am2 <- sarima(Y,0,0,2,
xreg=dreg1)initial value 0.666340
iter 2 value 0.634152
iter 3 value 0.629615
iter 4 value 0.628139
iter 5 value 0.628058
iter 6 value 0.628053
iter 7 value 0.628053
iter 8 value 0.628053
iter 8 value 0.628053
iter 8 value 0.628053
final value 0.628053
converged
initial value 0.628397
iter 2 value 0.628395
iter 3 value 0.628393
iter 4 value 0.628392
iter 5 value 0.628392
iter 5 value 0.628392
iter 5 value 0.628392
final value 0.628392
converged
acf2(y_am1[["fit"]][["residuals"]]) [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
ACF 0.01 0.07 -0.01 0.02 0.05 -0.07 -0.05 -0.01 -0.04 0.02 0.04 -0.05 0.07
PACF 0.01 0.07 -0.01 0.02 0.05 -0.08 -0.05 0.01 -0.04 0.02 0.05 -0.06 0.06
[,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25]
ACF -0.05 0.07 0.03 0 0.04 0.06 0.06 0.01 -0.04 0.01 -0.06 0.04
PACF -0.04 0.05 0.03 0 0.02 0.07 0.05 0.00 -0.03 0.01 -0.06 0.06
[,26] [,27] [,28] [,29]
ACF 0 0.01 -0.05 0.01
PACF 0 0.02 -0.05 0.02
mean(y_am1[["fit"]][["residuals"]])[1] 0.000787159
Paso 5: Forecast. Pronosticamos para cada una de nuetras variables
Variables explicativas
dpred1 <- cbind(D1c[194], D2c[194], 0 )Variable Dependiente
Y4_Pred <- sarima.for(Y,0,0,2,
xreg= dreg1,
newxreg = dpred1,
n.ahead = 1)ARMAX4_Feb21 <- as.numeric(Y4_Pred$pred)
data2$act_ind[193]*exp(ARMAX4_Feb21/100)[1] 97.73581
Una vez que contamos con diferentes modelos para pronostico podemos hacer una comparación de su eficacia en la previsión del índice de la actividad industrial y con ello tener el que mejor ajuste tenga.
Prueba de estres
De 2005 hasta 2019 para pronosticar 2020
Como hay series que con datos a partir del 2005-ene y trabajamos con tasas mensuales, el periodo final de análisis ser a partir de 2005-feb
X1 es producción de autos
Z1,B1,D1 es pmi
X2 es producción de camiones
Z2 es confianza en las manufacturas
B2 es Índice de pedidos manufactureros
D2 es importaciones
Y <- xts(Y,
order.by = seq(as.Date("2005-02-01"),
as.Date("2021-01-01"), by = "month"))
X1c <- xts(X1c,
order.by = seq(as.Date("1993-01-01"),
as.Date("2021-02-01"), by = "month"))
X2c <- xts(X2c,
order.by = seq(as.Date("1993-01-01"),
as.Date("2021-02-01"), by = "month"))
Z1c <- xts(Z1c,
order.by = seq(as.Date("2005-01-01"),
as.Date("2021-02-01"), by = "month"))
Z2c <- xts(Z2c,
order.by = seq(as.Date("2005-01-01"),
as.Date("2021-02-01"), by = "month"))
B2c <- xts(B2c,
order.by = seq(as.Date("2005-01-01"),
as.Date("2021-02-01"), by = "month"))
D2c <- xts(D2c,
order.by = seq(as.Date("2005-01-01"),
as.Date("2021-02-01"), by = "month"))
dummy2 <- xts(c(dummy2,0),
order.by = seq(as.Date("2005-02-01"),
as.Date("2021-02-01"), by = "month"))
# MODELO 1
index_x <- paste("200502/",
c("201912",as.character(202001:202012), "202101"),
sep = "")
index_pred <- c(as.character(202001:202012),"202101", "202102")
M1 <- c()
i <- NULL
for (i in 1:14) {
M1[i] <- as.numeric((sarima.for(Y[index_x[i]],1,0,0,
xreg= cbind(coredata(X1c[index_x[i]]),
coredata(X2c[index_x[i]]),
coredata(dummy2[index_x[i]])),
newxreg = cbind(coredata(X1c[index_pred[i]]),
coredata(X2c[index_pred[i]]),
coredata(dummy2[index_pred[i]])),
n.ahead = 1,
plot = FALSE))$pred)
}
# MODELO 2
M2 <- c()
i <- NULL
for (i in 1:14) {
M2[i] <- as.numeric((sarima.for(Y[index_x[i]],0,0,2,
xreg= cbind(coredata(Z1c[index_x[i]]),
coredata(Z2c[index_x[i]]),
coredata(dummy2[index_x[i]])),
newxreg = cbind(coredata(Z1c[index_pred[i]]),
coredata(Z2c[index_pred[i]]),
coredata(dummy2[index_pred[i]])),
n.ahead = 1,
plot = FALSE))$pred)
}
# MODELO 3
M3 <- c()
i <- NULL
for (i in 1:14) {
M3[i] <- as.numeric((sarima.for(Y[index_x[i]],0,0,1,
xreg= cbind(coredata(Z1c[index_x[i]]),
coredata(B2c[index_x[i]]),
coredata(dummy2[index_x[i]])),
newxreg = cbind(coredata(Z1c[index_pred[i]]),
coredata(B2c[index_pred[i]]),
coredata(dummy2[index_pred[i]])),
n.ahead = 1,
plot = FALSE))$pred)
}
# MODELO 4
M4 <- c()
i <- NULL
for (i in 1:14) {
M4[i] <- as.numeric((sarima.for(Y[index_x[i]],0,0,2,
xreg= cbind(coredata(Z1c[index_x[i]]),
coredata(D2c[index_x[i]]),
coredata(dummy2[index_x[i]])),
newxreg = cbind(coredata(Z1c[index_pred[i]]),
coredata(D2c[index_pred[i]]),
coredata(dummy2[index_pred[i]])),
n.ahead = 1,
plot = FALSE))$pred)
}
RS <- coredata(Y["202001/202101"])
M234 <-(M2+M3+M4)/3
mix_M <- (M1+M2+M3+M4)/4
# ERROR PORCENTUAL MEDIO
pronos <- cbind(M1 = M1,M2 = M2,M3 = M3,M4 = M4,M234 = M234,mix_M = mix_M)
test <- pronos[-14,]
i <- NULL
for (i in 1:6) {
if (i == 1) {
epm <- (RS - test[, i])/RS
epm_mean <- mean(epm[, i])
} else {
epm <- cbind(epm, (RS - test[, i])/RS)
epm_mean <- cbind(epm_mean, mean(epm[, i]))
}
epmT <- rbind(epm, epm_mean)
}
colnames(epmT) <- c("M1", "M2", "M3", "M4", "M234", "mix_M")
row.names(epmT) <- c(as.character(1:13), "mean")
kable(epmT)| M1 | M2 | M3 | M4 | M234 | mix_M | |
|---|---|---|---|---|---|---|
| 1 | 0.2028103 | 0.4404268 | 0.2953206 | 0.3657254 | 0.3671576 | 0.3260708 |
| 2 | 0.7409331 | 0.3045960 | 0.4482303 | 0.3154994 | 0.3561086 | 0.4523147 |
| 3 | -0.3642308 | -0.9288516 | -0.9045245 | -0.7928284 | -0.8754015 | -0.7476088 |
| 4 | 0.7009487 | 0.8048345 | 0.8111468 | 0.8034819 | 0.8064877 | 0.7801030 |
| 5 | -22.3399288 | 12.3106083 | 6.6672022 | 12.0306894 | 10.3361666 | 2.1671428 |
| 6 | 0.1576121 | 0.7239602 | 0.4932891 | 0.7024144 | 0.6398879 | 0.5193190 |
| 7 | 0.3842925 | 1.7523216 | 1.3891066 | 1.4716622 | 1.5376968 | 1.2493457 |
| 8 | 2.2243477 | 3.0156903 | 2.8569430 | 2.9386717 | 2.9371017 | 2.7589132 |
| 9 | 3.4693280 | 8.3595190 | 7.8705887 | 7.8590565 | 8.0297214 | 6.8896230 |
| 10 | 0.9737077 | 3.2330848 | 1.0550160 | 3.1667615 | 2.4849541 | 2.1071425 |
| 11 | 1.9527990 | 1.7714193 | 1.7920784 | 2.8804761 | 2.1479913 | 2.0991932 |
| 12 | 6.3325284 | 3.9482873 | 5.2339783 | 8.8409965 | 6.0077541 | 6.0889476 |
| 13 | 2.0587423 | 0.3096053 | -0.9086753 | 2.8768663 | 0.7592654 | 1.0841346 |
| mean | -0.2697008 | 2.7727309 | 2.0845923 | 3.3430364 | 2.7334532 | 1.9826647 |
A partir de los resultados en nuestras pruebas de estrés determinamos que el primer modelo es el que tiene un menor error cuadrático medio, pero es el que tiene un peor ajuste en momentos de crisis. Dado que el sector manufacturero es muy dinámico y las noticias relacionadas al mismo muestran una rápida recuperación postcrisis determinamos que el primer modelo es el adecuado para pronosticar. Resaltamos que el modelo de importaciones es el que presenta un mejor ajuste en periodos de crisis.
Pronostico Final
M1[14] # Tasa Mensual[1] -1.367246
data$act_ind[337]*exp(M1[14]/100) # Indice[1] 96.68883
A partir de los datos empleados y el análisis econométrico desarrollado concluimos que para el mes de febrero se dará una caída de 1.37 % en la actividad industrial, lo cual consideramos es acorde a la dinámica internacional que se presenta en las cadenas globales industriales.
La principal razón de este descenso es la escasez mundial de semiconductores y su impacto en la industria, especialmente en los sectores de automotriz y de componentes electrónicos.
Pronostico Final: Modelo 1, Act. Industrial vs Producción de autos y camiones
| Fecha | Prónostico Actividad Industrial |
|---|---|
| Febrero 2021 | 98.22606 |