Análisis de Vectores Autorregresivos (VAR)

Variables Macroeconómicas PIB = V1, INFLACIÓN = V2, DESEMPLEO = V3 (2009-2024)”

author: “Ricaurte Vicente Patiño Chaves”

BASE DE DATOS

datos <- read_excel("D:/CARTER/UNIVERSIDAD DE NARIÑO/SEMESTRES ECONOMIA/6 SEXTO SEMESTRE/ECONOMETRIA II/datos.xlsx")
View(datos)

Creación de series de tiempo (2009-2024)

datosV1 <- as.numeric(as.character(datos$V1))
V1ts <- ts(datosV1, start = c(2009, 1), frequency = 4)

datosV2 <- as.numeric(as.character(datos$V2))
V2ts <- ts(datosV2, start = c(2009, 1), frequency = 4)

datosV3 <- as.numeric(as.character(datos$V3))
V3ts <- ts(datosV3, start = c(2009, 1), frequency = 4)

Gráficos de las series originales

par(mfrow=c(3,1), mar=c(4,4,3,2))
plot(V1ts, main="Serie V1 (2009-2024)", ylab="V1", xlab="Tiempo", col="blue", lwd=2)
plot(V2ts, main="Serie V2 (2009-2024)", ylab="V2", xlab="Tiempo", col="red", lwd=2)
plot(V3ts, main="Serie V3 (2009-2024)", ylab="V3", xlab="Tiempo", col="green", lwd=2)

Test de raíz unitaria para V1

df.V1 <- ur.df(V1ts, lags = 0)
summary(df.V1)
## 
## ############################################### 
## # Augmented Dickey-Fuller Test Unit Root Test # 
## ############################################### 
## 
## Test regression none 
## 
## 
## Call:
## lm(formula = z.diff ~ z.lag.1 - 1)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -25189.8   -563.4    -79.9    901.4  10747.5 
## 
## Coefficients:
##         Estimate Std. Error t value Pr(>|t|)    
## z.lag.1  0.01186    0.00195    6.08 9.51e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4248 on 59 degrees of freedom
## Multiple R-squared:  0.3852, Adjusted R-squared:  0.3748 
## F-statistic: 36.97 on 1 and 59 DF,  p-value: 9.507e-08
## 
## 
## Value of test-statistic is: 6.0804 
## 
## Critical values for test statistics: 
##      1pct  5pct 10pct
## tau1 -2.6 -1.95 -1.61

Interpretación: Si el estadístico tau es mayor a -3.43 (valor crítico 5%), V1 tiene raíz unitaria (no es estacionaria).

Primera diferencia de V1

dV1 <- diff(V1ts)
df.dV1 <- ur.df(dV1, lags = 0)
summary(df.dV1)
## 
## ############################################### 
## # Augmented Dickey-Fuller Test Unit Root Test # 
## ############################################### 
## 
## Test regression none 
## 
## 
## Call:
## lm(formula = z.diff ~ z.lag.1 - 1)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -16274   1125   1126   1859  22853 
## 
## Coefficients:
##         Estimate Std. Error t value Pr(>|t|)    
## z.lag.1  -0.4221     0.1084  -3.895 0.000256 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4472 on 58 degrees of freedom
## Multiple R-squared:  0.2074, Adjusted R-squared:  0.1937 
## F-statistic: 15.17 on 1 and 58 DF,  p-value: 0.0002563
## 
## 
## Value of test-statistic is: -3.8954 
## 
## Critical values for test statistics: 
##      1pct  5pct 10pct
## tau1 -2.6 -1.95 -1.61

Gráfico de la primera diferencia

par(mfrow=c(1,1), mar=c(5,4,4,2))
plot(dV1, main="Primera Diferencia de V1", ylab="ΔV1", xlab="Tiempo", col="blue", lwd=2)

Interpretación: La primera diferencia de V1 es estacionaria I(0) y se usará en el modelo VAR.

Test de raíz unitaria para V2

df.V2 <- ur.df(V2ts, lags = 0)
summary(df.V2)
## 
## ############################################### 
## # Augmented Dickey-Fuller Test Unit Root Test # 
## ############################################### 
## 
## Test regression none 
## 
## 
## Call:
## lm(formula = z.diff ~ z.lag.1 - 1)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.39683 -0.19478 -0.09444  0.20536  0.70556 
## 
## Coefficients:
##          Estimate Std. Error t value Pr(>|t|)
## z.lag.1 -0.002645   0.017388  -0.152     0.88
## 
## Residual standard error: 0.2597 on 59 degrees of freedom
## Multiple R-squared:  0.0003921,  Adjusted R-squared:  -0.01655 
## F-statistic: 0.02315 on 1 and 59 DF,  p-value: 0.8796
## 
## 
## Value of test-statistic is: -0.1521 
## 
## Critical values for test statistics: 
##      1pct  5pct 10pct
## tau1 -2.6 -1.95 -1.61

Interpretación: Si el estadístico tau es mayor a -3.43 (valor crítico 5%), V2 tiene raíz unitaria (no es estacionaria).

Primera diferencia de V2

dV2 <- diff(V2ts)
df.dV2 <- ur.df(dV2, lags = 0)
summary(df.dV2)
## 
## ############################################### 
## # Augmented Dickey-Fuller Test Unit Root Test # 
## ############################################### 
## 
## Test regression none 
## 
## 
## Call:
## lm(formula = z.diff ~ z.lag.1 - 1)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.45178 -0.04822 -0.04822  0.05000  0.45178 
## 
## Coefficients:
##         Estimate Std. Error t value Pr(>|t|)   
## z.lag.1 -0.24112    0.08422  -2.863  0.00583 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1672 on 58 degrees of freedom
## Multiple R-squared:  0.1238, Adjusted R-squared:  0.1087 
## F-statistic: 8.196 on 1 and 58 DF,  p-value: 0.005832
## 
## 
## Value of test-statistic is: -2.8629 
## 
## Critical values for test statistics: 
##      1pct  5pct 10pct
## tau1 -2.6 -1.95 -1.61

Gráfico de la primera diferencia

par(mfrow=c(1,1), mar=c(5,4,4,2))
plot(dV2, main="Primera Diferencia de V2", ylab="ΔV2", xlab="Tiempo", col="red", lwd=2)

Interpretación: La primera diferencia de V2 es estacionaria I(0) y pasa al modelo VAR.

Creación de la matriz de datos para el VAR

datos <- ts.intersect(dV1, dV2)
print("Datos para el VAR:")
## [1] "Datos para el VAR:"
head(datos)
##          dV1 dV2
## 2009 Q2 1667 0.3
## 2009 Q3 2778 0.3
## 2009 Q4 2555 0.3
## 2010 Q1 2667 0.2
## 2010 Q2 2667 0.2
## 2010 Q3 3444 0.2

Selección del orden óptimo

var_select <- VARselect(datos, lag.max = 12)
print(var_select)
## $selection
## AIC(n)  HQ(n)  SC(n) FPE(n) 
##      2      2      1      2 
## 
## $criteria
##                   1            2            3            4            5
## AIC(n)     13.36558     13.21868     13.26680     13.25852     13.22659
## HQ(n)      13.45398     13.36600     13.47305     13.52370     13.55069
## SC(n)      13.59949     13.60851     13.81257     13.96022     14.08422
## FPE(n) 637883.71409 551390.21393 580119.22043 578100.36527 564196.82584
##                   6            7            8            9           10
## AIC(n)     13.25488     13.38090     13.47774     13.53798     13.54822
## HQ(n)      13.63791     13.82286     13.97862     14.09779     14.16696
## SC(n)      14.26845     14.55040     14.80317     15.01935     15.18552
## FPE(n) 586894.11842 676141.16105 760605.49178 830215.18071 868705.51701
##                  11           12
## AIC(n) 1.366482e+01 1.373102e+01
## HQ(n)  1.434249e+01 1.446761e+01
## SC(n)  1.545805e+01 1.568019e+01
## FPE(n) 1.020457e+06 1.152700e+06

Interpretación de Criterios de Selección:

AIC: Criterio de Información de Akaike (menor valor es mejor) HQ: Criterio Hannan-Quinn (menor valor es mejor) SC: Criterio de Schwarz/BIC (menor valor es mejor) FPE: Error de predicción final (menor valor es mejor)

Estimación del modelo VAR(1) - Ajustar ‘p’ según resultado de VARselect

var1 <- VAR(datos, p=1)
summary(var1)
## 
## VAR Estimation Results:
## ========================= 
## Endogenous variables: dV1, dV2 
## Deterministic variables: const 
## Sample size: 59 
## Log Likelihood: -548.469 
## Roots of the characteristic polynomial:
## 0.737 0.2904
## Call:
## VAR(y = datos, p = 1)
## 
## 
## Estimation results for equation dV1: 
## ==================================== 
## dV1 = dV1.l1 + dV2.l1 + const 
## 
##         Estimate Std. Error t value Pr(>|t|)   
## dV1.l1    0.3156     0.1315   2.401   0.0197 * 
## dV2.l1 1080.7898  2206.3438   0.490   0.6261   
## const  2225.1855   678.7512   3.278   0.0018 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## 
## Residual standard error: 4168 on 56 degrees of freedom
## Multiple R-Squared: 0.1154,  Adjusted R-squared: 0.08376 
## F-statistic: 3.651 on 2 and 56 DF,  p-value: 0.03232 
## 
## 
## Estimation results for equation dV2: 
## ==================================== 
## dV2 = dV1.l1 + dV2.l1 + const 
## 
##          Estimate Std. Error t value Pr(>|t|)    
## dV1.l1  9.846e-06  5.202e-06   1.893   0.0636 .  
## dV2.l1  7.117e-01  8.731e-02   8.152 4.36e-11 ***
## const  -3.220e-02  2.686e-02  -1.199   0.2357    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## 
## Residual standard error: 0.1649 on 56 degrees of freedom
## Multiple R-Squared: 0.6063,  Adjusted R-squared: 0.5923 
## F-statistic: 43.13 on 2 and 56 DF,  p-value: 4.608e-12 
## 
## 
## 
## Covariance matrix of residuals:
##           dV1      dV2
## dV1 1.737e+07 144.1853
## dV2 1.442e+02   0.0272
## 
## Correlation matrix of residuals:
##        dV1    dV2
## dV1 1.0000 0.2098
## dV2 0.2098 1.0000

Interpretación de Resultados: Ecuación para dV1:

Coeficiente de dV1.l1: efecto de V1 rezagada un período sobre V1 actual Coeficiente de dV2.l1: efecto de V2 rezagada un período sobre V1 actual const: término constante

Ecuación para dV2:

Coeficiente de dV1.l1: efecto de V1 rezagada un período sobre V2 actual Coeficiente de dV2.l1: efecto de V2 rezagada un período sobre V2 actual const: término constante

Estadísticas de Bondad de Ajuste:

R-squared: proporción de varianza explicada por el modelo Adj. R-squared: R-squared ajustado por grados de libertad F-statistic: significancia global del modelo

Pronósticos 8 períodos adelante

f_var1 <- predict(var1, n.ahead = 8, ci=0.95)
print(f_var1)
## $dV1
##          fcst     lower    upper       CI
## [1,] 3692.534 -4476.193 11861.26 8168.727
## [2,] 3258.735 -5336.329 11853.80 8595.064
## [3,] 3164.335 -5493.074 11821.74 8657.410
## [4,] 3160.183 -5512.924 11833.29 8673.107
## [5,] 3176.118 -5503.055 11855.29 8679.173
## [6,] 3193.376 -5488.683 11875.44 8682.060
## [7,] 3207.697 -5475.854 11891.25 8683.551
## [8,] 3218.716 -5465.629 11903.06 8684.345
## 
## $dV2
##             fcst      lower     upper        CI
## [1,] -0.12202196 -0.4452754 0.2012314 0.3232534
## [2,] -0.08268545 -0.4969963 0.3316254 0.4143109
## [3,] -0.05896018 -0.5196386 0.4017183 0.4606785
## [4,] -0.04300401 -0.5280746 0.4420665 0.4850705
## [5,] -0.03168866 -0.5297420 0.4663647 0.4980533
## [6,] -0.02347846 -0.5284940 0.4815371 0.5050155
## [7,] -0.01746522 -0.5262330 0.4913026 0.5087678
## [8,] -0.01304451 -0.5238410 0.4977520 0.5107965

Gráfico de pronósticos con parámetros ajustados

par(mfrow=c(2,1), mar=c(4,4,2,1), oma=c(1,1,2,1))
plot(f_var1, main="Pronósticos VAR - 8 períodos adelante")

Interpretación de Pronósticos:

fcst: valores pronosticados para cada variable lower/upper: límites inferior y superior del intervalo de confianza al 95% Los pronósticos son para las primeras diferencias Para obtener niveles se debe sumar acumulativamente a los últimos valores observados La precisión decrece con el horizonte temporal

Respuesta de V1 ante un choque en V2

IR_dV1 <- irf(var1, impulse = "dV2", response = "dV1", n.ahead = 16)
print(IR_dV1)
## 
## Impulse response coefficients
## $dV2
##              dV1
##  [1,]   0.000000
##  [2,] 174.287201
##  [3,] 179.050911
##  [4,] 146.649347
##  [5,] 112.342786
##  [6,]  84.032106
##  [7,]  62.288837
##  [8,]  46.009434
##  [9,]  33.937885
## [10,]  25.019998
## [11,]  18.441536
## [12,]  13.591595
## [13,]  10.016809
## [14,]   7.382147
## [15,]   5.440436
## [16,]   4.009442
## [17,]   2.954838
## 
## 
## Lower Band, CI= 0.95 
## $dV2
##               dV1
##  [1,]    0.000000
##  [2,] -706.607283
##  [3,] -604.292606
##  [4,] -439.350413
##  [5,] -264.158316
##  [6,] -183.713189
##  [7,] -132.323111
##  [8,]  -82.530344
##  [9,]  -61.323471
## [10,]  -39.711104
## [11,]  -27.627829
## [12,]  -19.440713
## [13,]  -13.678553
## [14,]   -9.568464
## [15,]   -6.423195
## [16,]   -4.298667
## [17,]   -2.870577
## 
## 
## Upper Band, CI= 0.95 
## $dV2
##             dV1
##  [1,]   0.00000
##  [2,] 635.99267
##  [3,] 599.40819
##  [4,] 509.27289
##  [5,] 430.49734
##  [6,] 342.40361
##  [7,] 267.16856
##  [8,] 219.68326
##  [9,] 182.47319
## [10,] 152.63560
## [11,] 129.07465
## [12,] 110.14807
## [13,]  94.23375
## [14,]  80.81599
## [15,]  69.47248
## [16,]  60.64048
## [17,]  53.12627

Gráfico con parámetros ajustados

par(mfrow=c(1,1), mar=c(5,4,4,2))
plot(IR_dV1, main="Respuesta de ΔV1 ante choque en ΔV2")

Respuesta de V2 ante un choque en V1

IR_dV2 <- irf(var1, impulse = "dV1", response = "dV2", n.ahead = 16)
print(IR_dV2)
## 
## Impulse response coefficients
## $dV1
##               dV2
##  [1,] 0.034595114
##  [2,] 0.065657233
##  [3,] 0.060048850
##  [4,] 0.047640236
##  [5,] 0.036092593
##  [6,] 0.026884626
##  [7,] 0.019896047
##  [8,] 0.014686852
##  [9,] 0.010830753
## [10,] 0.007983965
## [11,] 0.005884529
## [12,] 0.004336891
## [13,] 0.003196207
## [14,] 0.002355522
## [15,] 0.001735952
## [16,] 0.001279345
## [17,] 0.000942839
## 
## 
## Lower Band, CI= 0.95 
## $dV1
##                 dV2
##  [1,]  1.526265e-03
##  [2,]  6.632601e-03
##  [3,]  3.086515e-03
##  [4,]  1.635921e-03
##  [5,]  8.952217e-04
##  [6,]  3.843224e-05
##  [7,] -1.905974e-04
##  [8,] -6.532065e-04
##  [9,] -4.549793e-04
## [10,] -4.081683e-04
## [11,] -3.057497e-04
## [12,] -1.998897e-04
## [13,] -1.805444e-04
## [14,] -1.273080e-04
## [15,] -7.819545e-05
## [16,] -4.322766e-05
## [17,] -3.034039e-05
## 
## 
## Upper Band, CI= 0.95 
## $dV1
##               dV2
##  [1,] 0.064438291
##  [2,] 0.111130873
##  [3,] 0.101632560
##  [4,] 0.086549774
##  [5,] 0.066902856
##  [6,] 0.050385739
##  [7,] 0.038178094
##  [8,] 0.030482698
##  [9,] 0.025185861
## [10,] 0.021000643
## [11,] 0.017110139
## [12,] 0.013932366
## [13,] 0.011385329
## [14,] 0.009340091
## [15,] 0.007873598
## [16,] 0.006637586
## [17,] 0.005595803

Gráfico con parámetros ajustados

par(mfrow=c(1,1), mar=c(5,4,4,2))
plot(IR_dV2, main="Respuesta de ΔV2 ante choque en ΔV1")

Interpretación de Funciones Impulso-Respuesta:

Muestra cómo responde cada variable a lo largo del tiempo ante un choque de una desviación estándar en la otra variable irf: función impulso-respuesta puntual Lower/Upper: bandas de confianza al 95% Si la función está por encima de cero: efecto positivo Si la función está por debajo de cero: efecto negativo Si las bandas incluyen el cero: efecto no significativo estadísticamente

Test de autocorrelación serial

serial_test <- serial.test(var1, lags.pt=12, type="PT.asymptotic")
print(serial_test)
## 
##  Portmanteau Test (asymptotic)
## 
## data:  Residuals of VAR object var1
## Chi-squared = 50.961, df = 44, p-value = 0.2188
## $serial
## 
##  Portmanteau Test (asymptotic)
## 
## data:  Residuals of VAR object var1
## Chi-squared = 50.961, df = 44, p-value = 0.2188

Interpretación:

H₀: No hay autocorrelación serial Si p-value > 0.05: No rechazamos H₀ (no hay autocorrelación)

Test de heterocedasticidad

arch_test <- arch.test(var1, lags.multi=5)
print(arch_test)
## 
##  ARCH (multivariate)
## 
## data:  Residuals of VAR object var1
## Chi-squared = 82.812, df = 45, p-value = 0.0005081
## $arch.mul
## 
##  ARCH (multivariate)
## 
## data:  Residuals of VAR object var1
## Chi-squared = 82.812, df = 45, p-value = 0.0005081

Interpretación:

H₀: Homocedasticidad (varianza constante) Si p-value > 0.05: No rechazamos H₀ (varianza constante)

Test de normalidad de residuos

norm_test <- normality.test(var1, multivariate.only=TRUE)  
print(norm_test)
## $JB
## 
##  JB-Test (multivariate)
## 
## data:  Residuals of VAR object var1
## Chi-squared = 508.53, df = 4, p-value < 2.2e-16
## 
## 
## $Skewness
## 
##  Skewness only (multivariate)
## 
## data:  Residuals of VAR object var1
## Chi-squared = 22.921, df = 2, p-value = 1.054e-05
## 
## 
## $Kurtosis
## 
##  Kurtosis only (multivariate)
## 
## data:  Residuals of VAR object var1
## Chi-squared = 485.61, df = 2, p-value < 2.2e-16
## $jb.mul
## $jb.mul$JB
## 
##  JB-Test (multivariate)
## 
## data:  Residuals of VAR object var1
## Chi-squared = 508.53, df = 4, p-value < 2.2e-16
## 
## 
## $jb.mul$Skewness
## 
##  Skewness only (multivariate)
## 
## data:  Residuals of VAR object var1
## Chi-squared = 22.921, df = 2, p-value = 1.054e-05
## 
## 
## $jb.mul$Kurtosis
## 
##  Kurtosis only (multivariate)
## 
## data:  Residuals of VAR object var1
## Chi-squared = 485.61, df = 2, p-value < 2.2e-16

Interpretación:

H₀: Los residuos siguen distribución normal multivariada Si p-value > 0.05: No rechazamos H₀ (normalidad)

Estabilidad del VAR

var_roots <- roots(var1)
print("Raíces características:")
## [1] "Raíces características:"
print(var_roots)
## [1] 0.7369697 0.2903629

Verificación de estabilidad

if(all(var_roots < 1)) {
  print("✓ El sistema VAR es ESTABLE (todas las raíces < 1)")
} else {
  print("✗ El sistema VAR es INESTABLE (alguna raíz ≥ 1)")
}
## [1] "✓ El sistema VAR es ESTABLE (todas las raíces < 1)"

Interpretación: Si todas las raíces características están dentro del círculo unitario (< 1), el sistema VAR es estable.

  1. Análisis de Estacionariedad:

Ambas variables son I(1): integradas de orden 1 Sus primeras diferencias son I(0): estacionarias ,variables macroeconómicas con tendencia

  1. Modelo VAR:

interdependencia dinámica entre V1 y V2 Los coeficientes muestran cómo el pasado de cada variable afecta el presente de ambas R² indica qué tan bien explica el modelo la variabilidad de cada variable

  1. Pronósticos:

planificación y toma de decisiones Intervalos de confianza reflejan la incertidumbre La precisión decrece con el horizonte temporal

  1. Impulso-Respuesta:

transmisión entre variables Importante para entender efectos de políticas o choques externos La significancia se evalúa mediante las bandas de confianza

  1. Diagnósticos:

Verifican los supuestos del modelo VAR Fundamentales para la validez de las inferencias Problemas detectados requieren respecificación del modelo