0% found this document useful (0 votes)
32 views6 pages

SCRIPT

This document performs statistical analysis on time series export and exchange rate data from Mexico between 1994 and 2019. It tests for stationarity of the series, examines their cointegration, estimates vector error correction models, and identifies and estimates a VAR model of the first differentiated series.

Uploaded by

Diego Garzón
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
32 views6 pages

SCRIPT

This document performs statistical analysis on time series export and exchange rate data from Mexico between 1994 and 2019. It tests for stationarity of the series, examines their cointegration, estimates vector error correction models, and identifies and estimates a VAR model of the first differentiated series.

Uploaded by

Diego Garzón
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 6

library(tidyverse)

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)

You might also like