SCRIPT
SCRIPT
library(broom)
library(readxl)
library(dynlm)
library(urca)
library(car)
library(aTSA)
library(forecast)
library(tseries)
library(rlang)
library(stargazer)
library(VAR.etp)
library(gridExtra)
library(ggplot2)
library(vars)
library(ggfortify)
library(dplyr)
library(tidyr)
library(tsDyn)
library(VAR.etp)
Data <- read_excel(file.choose())
attach(Data)
P.Expor <- ts(Expor, start=c(1994,1), frequency=4)
P.USrate <- ts(Usrate,start=c(1994,1), frequency=4)
x11()
autoplot(cbind(P.Expor, P.USrate), facets = F, main="Exportaciones y tasa de cambio
para mexico 1994-2019", xlab="", ylab="", size=2)
adf1 = ur.df(P.Expor, lags=4, type = "trend"); plot(adf1)
summary(adf1)
adf2 = ur.df(P.Expor, lags=4, type = "drift"); plot(adf2)
summary(adf2)
adf3 = ur.df(P.Expor,lags=4, type = "none"); plot(adf3)
summary(adf3)
kp1 = ur.kpss(P.Expor, use.lag = 4, type = "mu") #el mu nos indica que es
una prueba sin términos determinísticos.
summary(kp1)
adf4 = ur.df(P.USrate,lags=1, type = "trend"); plot(adf4)
summary(adf4)
adf5 = ur.df(P.USrate, lags=1, type = "drift"); plot(adf5)
summary(adf5)
adf6 = ur.df(P.USrate, type = "none"); plot(adf6)
summary(adf6)
kp2 = ur.kpss(P.USrate, use.lag = 1, type = "mu") #el mu nos indica que es
una prueba sin términos determinísticos.
summary(kp2)
plot(kp2)
adf8 = ur.df(diff(P.Expor), lag=1, type = "none");plot(adf8); summary(adf8)
#Estacionaria.
adf7 = ur.df(diff(P.USrate), lag=1, type = "none");plot(adf7);
summary(adf7) #Estacionaria
FS_EGADF <- dynlm(P.Expor ~ P.USrate)
summary(FS_EGADF)
tidy_FS_EGADF = tidy(FS_EGADF)
coint_param_MCO = tidy_FS_EGADF$estimate[2]; coint_param_MCO
z_hat <- residuals(FS_EGADF)
x11()
plot.ts(z_hat)
lags = 18
par(mfrow=c(1,2))
acf(z_hat,lag.max=lags,plot=T,lwd=2,xlab='',main='ACF de los residuales')
pacf(z_hat,lag.max=lags,plot=T,lwd=2,xlab='',main='PACF de los residuales')
adf9 = ur.df(z_hat,lags=1,type = "none"); plot(adf9); summary(adf9) #Los
residuales son estacionarios: hay cointegración.
length(P.Expor)
FS_MCOD1 = dynlm(P.Expor ~ P.USrate + L(d(P.USrate),-1:1));
summary(FS_MCOD1)
FS_MCOD2 = dynlm(P.Expor ~ P.USrate + L(d(P.USrate),-2:2));
summary(FS_MCOD2)
FS_MCOD3 = dynlm(P.Expor ~ P.USrate + L(d(P.USrate),-3:3));
summary(FS_MCOD3)
FS_MCOD4 = dynlm(P.Expor ~ P.USrate + L(d(P.USrate),-4:4));
summary(FS_MCOD4)
FS_MCOD5 = dynlm(P.Expor ~ P.USrate + L(d(P.USrate),-5:5));
summary(FS_MCOD5)
FS_MCOD6 = dynlm(P.Expor ~ P.USrate + L(d(P.USrate),-6:6));
summary(FS_MCOD6)
cbind(AIC(FS_MCOD1), AIC(FS_MCOD2), AIC(FS_MCOD3), AIC(FS_MCOD4),
AIC(FS_MCOD5), AIC(FS_MCOD6))
summary(FS_MCOD6)
tidy_FS_MCOD6 = tidy(FS_MCOD6)
coint_param_MCOD = tidy_FS_MCOD6$estimate[2]; coint_param_MCOD
residuals_FS_MCOD6 = residuals(FS_MCOD6)
x11()
autoplot(cbind((P.Expor-P.USrate),residuals_FS_MCOD6), facets = F,
main="Precios spot del petróleo", xlab="", ylab="", size=2)
lags = 18
par(mfrow=c(1,2))
acf(residuals_FS_MCOD6, lag.max=lags, plot=T , lwd=2 , xlab='', main='ACF
de los residuales')
pacf(residuals_FS_MCOD6, lag.max=lags, plot=T, lwd=2, xlab='', main='PACF
de los residuales')
adf10 = ur.df(residuals(FS_MCOD6), lag=1, type = "none"); plot(adf10)
summary(adf10)
parametro_cointegración_MCO = coint_param_MCO
VEC_EQ1 <- dynlm(d(P.Expor) ~ L(P.Expor - parametro_cointegración_MCO *
P.USrate,1) + L(d(P.USrate), 0:3) + L(d(P.Expor),
1:3));summary(VEC_EQ1)
#El parámetro de velocidad de ajuste alpha tiene el signo esperado
VEC_EQ2 <- dynlm(d(P.USrate) ~ L(P.Expor - parametro_cointegración_MCO *
P.USrate,1)+ L(d(P.USrate), 1:3) + L(d(P.Expor),
0:3));summary(VEC_EQ2) #El
parámetro de velocidad de ajuste alpha tiene el signo esperado
residuales_VEC_EQ1 = residuals(VEC_EQ1)
residuales_VEC_EQ2 = residuals(VEC_EQ2)
adf_VEC_EQ1 = ur.df(residuales_VEC_EQ1, lag=1, type = "none");
plot(adf_VEC_EQ1)
summary(adf_VEC_EQ1) # Residuales estacionarios.
adf_VEC_EQ2 = ur.df(residuales_VEC_EQ2, lag=1, type = "none");
plot(adf_VEC_EQ2)
summary(adf_VEC_EQ2) #Residuales estacionarios.
parametro_cointegración_MCOD = coint_param_MCOD
VEC_EQ3 <- dynlm(d(P.Expor) ~ L(P.Expor - parametro_cointegración_MCOD *
P.USrate, 1) + L(d(P.USrate), 0:3) +
L(d(P.Expor), 1:3));summary(VEC_EQ3)
#El parámetro de velocidad de ajuste alpha tiene el signo esperado
VEC_EQ4 <- dynlm(d(P.USrate) ~ L(P.Expor - parametro_cointegración_MCOD *
P.USrate, 1)+ L(d(P.USrate), 1:3) +
L(d(P.Expor), 0:3));summary(VEC_EQ4)
#El parámetro de velocidad de ajuste alpha tiene el signo esperado
residuales_VEC_EQ3 = residuals(VEC_EQ3)
residuales_VEC_EQ4 = residuals(VEC_EQ4)
adf_VEC_EQ3 = ur.df(residuales_VEC_EQ3, lag=1, type = "none");
plot(adf_VEC_EQ3)
summary(adf_VEC_EQ3) # Residuales estacionarios.
adf_VEC_EQ4 = ur.df(residuales_VEC_EQ4, lag=1, type = "none");
plot(adf_VEC_EQ4)
summary(adf_VEC_EQ4) #Residuales estacionarios.
length(residuales_VEC_EQ3)/4 # aproximdamente 25
Box.test(residuales_VEC_EQ3,lag=25, type = c("Box-Pierce")) #No rechazo H0,
se cumple el supuesto.
Box.test(residuales_VEC_EQ3,type='Box-Pierce',lag=10) #No rechazo H0, se
cumple el supuesto.
Box.test(residuales_VEC_EQ3,type='Box-Pierce',lag=30) #No rechazo H0, se
cumple el supuesto.
Box.test(residuales_VEC_EQ4,lag=25, type = c("Ljung-Box")) #NO rechazo H0,
se cumple el supuesto.
Box.test(residuales_VEC_EQ4,type='Ljung-Box',lag=10) #NO rechazo H0, se
cumple el supuesto.
Box.test(residuales_VEC_EQ4,type='Ljung-Box',lag=30) #NO rechazo H0, se
cumple el supuesto.
summary(ur.df(P.Expor, lags=6, selectlags="AIC", type="drift")); #No tiene
drift
summary(ur.df(P.USrate, lags=6, selectlags="AIC", type="none")) #La serie
es no estacionaria
summary(ur.df(P.Expor, lags=6, selectlags="AIC", type="drift")) #No tiene
drift
summary(ur.df(P.USrate, lags=6, selectlags="AIC", type="none")) #La serie
es no estacionaria
summary(ur.df(diff(P.Expor), lags=6, selectlags="AIC", type="none")) #La
serie difereniada es estacionaria
summary(ur.df(diff(P.USrate), lags=6, selectlags="AIC", type="none")) #La
serie diferenciada es estacionaria
Y = cbind(P.Expor, P.USrate)
VARselect(Y, lag.max = 14, type="both", season=NULL) #5 rezagos, elegimos
el más parsimonioso
VARselect(Y, lag.max = 14, type="const", season=NULL) #2 rezagos y 5
rezagos, elegimos el más parsimonioso
VARselect(Y, lag.max = 14, type="none", season=NULL) #2 rezagos y 6
rezagos, elegimos el más parsimonioso
summary(VAR(Y, p=14, type="both", season=NULL)) #La tendencia no es
significativa en ninguna ecuación
summary(VAR(Y, p=14, type="const", season=NULL)) #La constante es
significativa en ambas ecuaciones
VAR14 <- VAR(Y, p=14, type="const", season=NULL)
P.70=serial.test(VAR14, lags.pt = 70, type = "PT.asymptotic");P.30 #No
rechazo, se cumple el supuesto
P.30=serial.test(VAR14, lags.pt = 30, type = "PT.asymptotic");P.30 #No
rechazo, se cumple el supuesto
P.20=serial.test(VAR14, lags.pt = 20, type = "PT.asymptotic");P.20 #No
rechazo, se cumple el supuesto
x11()
plot(P.20, names = "P.Expor") #Bien comportados, salvo por los residuales
al cuadrado
plot(P.20, names = "P.USrate") #Bien comportados, salvo por los residuales
al cuadrado
args("ca.jo")
eigen1 = ca.jo(Y, ecdet = "none", type = "eigen", K = 14, spec =
"transitory", season = NULL)
summary(eigen1) #Al 5% de confianza las series están cointegradas.
trace1= ca.jo(Y, ecdet = "none", type = "trace", K = 14, spec =
"transitory", season = NULL)
summary(trace1) #Al 5% de confianza las series están cointegradas.
eigen2 = ca.jo(Y, ecdet = "const", type = "eigen", K = 14, spec =
"longrun",season = NULL)
summary(eigen2) #Al 5% de confianza las series están cointegradas.
trace2 = ca.jo(Y, ecdet = "const", type = "trace", K = 14, spec =
"longrun",season = NULL)
summary(trace2) #Al 5% de confianza las series están cointegradas.
VEC1 = cajorls(eigen1, r=1)
VEC1
coefB(VEC1)
coefA(VEC1)
tidy_FS_VEC1 = tidy(VAR14)
coint_param_VECM = tidy_FS_VEC1$estimate[2]; coint_param_VECM
parametro_cointegración_VECM = coint_param_VECM
VECM_EQ1 <- dynlm(d(P.Expor) ~ L(P.Expor - parametro_cointegración_VECM *
P.USrate, 1) + L(d(P.USrate), 0:3) +
L(d(P.Expor), 1:3));summary(VECM_EQ1)
#El parámetro de velocidad de ajuste alpha tiene el signo esperado
VEC2 = cajorls(eigen2, r=1)
VEC2
coefB(VEC2)
coefA(VEC2)
lttest(eigen2, r=1) #No rechazo la hipótesis nula, por lo que no se debe
incluir tendencia lineal en el modelo.
coefB(VEC2)
coefA(VEC2)
#identificacion y estimacion del modelo VAR
dP.Expor <- diff(P.Expor)
dP.USrate <- diff(P.USrate)
adf.test(dP.Expor)
adf.test(dP.USrate)
summary(ur.df(dP.Expor, lags=6, selectlags="AIC", type="drift"));
summary(ur.df(dP.Expor, lags=6, selectlags="AIC", type="none"))
summary(ur.df(dP.USrate, lags=6, selectlags="AIC", type="drift"))
summary(ur.df(dP.USrate, lags=6, selectlags="AIC", type="none"))
summary(ur.df(diff(dP.Expor), lags=6, selectlags="AIC", type="none"))
summary(ur.df(diff(dP.USrate), lags=6, selectlags="AIC", type="none"))
Y2 = cbind(dP.Expor, dP.USrate)
VARselect(Y2, lag.max = 6, type="both", season=NULL)
VARselect(Y2, lag.max = 6, type="const", season=NULL)
VARselect(Y2, lag.max = 6, type="none", season=NULL)
summary(VAR(Y2, p=5, type="both", season=NULL))
summary(VAR(Y2, p=1, type="const", season=NULL))
VAR1 <- VAR(Y2, p=1, type="const", season=NULL)
P.30=serial.test(VAR1, lags.pt = 30, type = "PT.asymptotic");P.30
P.20=serial.test(VAR1, lags.pt = 20, type = "PT.asymptotic");P.20
P.10=serial.test(VAR1, lags.pt = 10, type = "PT.asymptotic");P.10
x11()
plot(P.20, names = "dP.Expor")
plot(P.20, names = "dP.USrate")
args("ca.jo")
eigen1_2 = ca.jo(Y2, ecdet = "none", type = "eigen", K = 2, spec =
"transitory", season = NULL)
summary(eigen1)
trace1_2= ca.jo(Y2, ecdet = "none", type = "trace", K = 2, spec =
"transitory", season = NULL)
summary(trace1) #Al 5% de confianza las series están cointegradas.
eigen2_2 = ca.jo(Y2, ecdet = "const", type = "eigen", K = 2, spec =
"longrun",season = NULL)
summary(eigen2) #Al 5% de confianza las series están cointegradas.
trace2_2 = ca.jo(Y2, ecdet = "const", type = "trace", K = 2, spec =
"longrun",season = NULL)
summary(trace2) #Al 5% de confianza las series están cointegradas.
VAR.oil = vec2var(eigen2_2, r = 1) # VAR.oil va a ser la reparametrización
del modelo VEC anterior como VAR en niveles
VAR.oil
class(VAR.oil)
P.30=serial.test(VAR.oil, lags.pt = 30, type = "PT.asymptotic");P.30 #No
rechazo, se cumple el supuesto
P.20=serial.test(VAR.oil, lags.pt = 20, type = "PT.asymptotic");P.20 #No
rechazo, se cumple el supuesto
P.10=serial.test(VAR.oil, lags.pt = 10, type = "PT.asymptotic");P.10
#rechazo, no se cumple el supuesto
x11()
plot(P.20) #Bien comportados, salvo por los residuales al cuadrado
plot(P.20) #Bien comportados, salvo por los residuales al cuadrado
normality.test(VAR.oil) #Rechazo, no se cumple el supuesto.
x11()
predict(VAR.oil, n.ahead=12)
plot(predict(VAR.oil, n.ahead=12))
impulso_respuesta = function(var, impulso, respuesta, pasos_adelantes,
ortog, int_conf, titulo){
# Cáclulo de la función impulso respuesta
total_pasos_futuros = length(pasos_adelantes) - 1
IRF = irf(var, impulse=impulso, response=respuesta, n.ahead =
total_pasos_futuros, ortho=ortog, ci = int_conf)
IRF_data_frame = data.frame(IRF$irf,IRF$Lower,IRF$Upper, pasos_adelantes)
# Gráfica de la función impulso respuesta
graph = IRF_data_frame %>%
ggplot(aes(x=IRF_data_frame[,4], y=IRF_data_frame[,1],
ymin=IRF_data_frame[,2], ymax=IRF_data_frame[,3] )) +
geom_hline(yintercept = 0, color="red") +
geom_ribbon(fill="grey", alpha=0.2) +
geom_line() +
theme_light() +
ggtitle(titulo)+
ylab("")+
xlab("pasos adelante") +
theme(plot.title = element_text(size = 11, hjust=0.5),
axis.title.y = element_text(size=11))
return(graph)
}
lags=c(0:18)
y1.y1 <-
impulso_respuesta(VAR.oil,"dP.Expor","dP.Expor",pasos_adelantes=c(0:18),ortog
= T,int_conf = 0.95,titulo = "Impulso de dP.Expor - respuesta
de dP.Expor")
y1.y2 <- impulso_respuesta(VAR.oil,"dP.Expor","dP.USrate",pasos_adelantes =
c(0:18),ortog = T,int_conf = 0.95,titulo = "Impulso de
dP.Expor - respuesta
de dP.USrate")
y2.y1 <- impulso_respuesta(VAR.oil,"dP.USrate","dP.Expor",pasos_adelantes =
c(0:18),ortog = T,int_conf = 0.95,titulo = "Impulso de
dP.USrate -
respuesta de dP.Expor")
y2.y2 <- impulso_respuesta(VAR.oil,"dP.USrate","dP.USrate",pasos_adelantes
= c(0:18),ortog = T,int_conf = 0.95,titulo = "Impulso de
dP.USrate -
respuesta de dP.USrate")
x11()
grid.arrange(y1.y1,y1.y2,y2.y1,y2.y2,ncol=2)