Modelos Estructurales

OKONOMETRIC CISE

Autor/a

William X. Ramos Chucuri

Fecha de publicación

24 de octubre de 2025

1 1. Modelos Estructurales

  • Modelos estructurales vs Modelos Estadísticos

  • La estimación estructural tiene múltiples limitaciones.

  • El uso de modelos parsimoniosos tiene un costo, podemos caer el modelos sub-parametrizados, es decir podemos estimar modelos sesgados e inconsistentes. (Condiciones fundamentales en econometría).

  • La exogeneidad estricta es un supuesto muy restrictivo en un modelo multiecuacional.

  • Los modelos VAR son modelos estadísticos.

    • El poner restricciones al modelo (Matrices o condiciones- nos ayudarían a transformarlo en un modelo estructural SVAR.
  • Los modelos de Equilibrio general son modelos estructurales | Estos modelos me permiten modelar situaciones como la pandemia COVID-19.

    • Permiten modelar situaciones sobre las cuales no tenemos historia, es decir una estructura consistente.
  • En el Modelo VAR no nos interesan los coeficientes. Hay que recordar que todas las variables son endógenas, es decir estan conectados

1.1 1.2.Modelo VAR(p)

Un modelo autorregresivo vectorial de orden ( p ), denotado como ( VAR(p) ), se define de la siguiente forma:

\(X_t = c + A_1 X_{t-1} + A_2 X_{t-2} + \dots + A_p X_{t-p} + \varepsilon_t\)

donde:

  • \(X_t\) es un vector de variables endógenas de dimensión \(K \times 1\).
  • \(c\) es un vector de constantes de dimensión \(K \times 1\).
  • \(A_i\) son las matrices de coeficientes de dimensión \(K \times K\) para cada rezago \(i = 1, 2, \dots, p\).
  • \(\varepsilon_t\) son los términos de error o innovaciones, con media cero y matriz de covarianza:

\(\Sigma_u = E[\varepsilon_t \varepsilon_t']\)

donde \(\Sigma_u\) es simétrica y definida positiva.

En forma compacta, el modelo VAR(p) capta la interdependencia dinámica entre las variables endógenas en el tiempo.

1.2 1.3. Propiedades Básicas

  • Endogeneidad total: todas las variables son explicadas por sus propios rezagos y los de las demás.

  • Identificación reducida: los residuos \(εt\) pueden estar correlacionados, lo que impide inferencias estructurales.

  • Necesidad de estacionariedad: Las series deben ser integradas de orden 0 o cointegradas (en cuyo caso se usa VECM).

  • Hay que recordar que al ser integradas I (1) significa que tienen raíz unitaria y son procesos no estacionarios. Si queremos trabajar en modelos multiecuacionales debemos quitar esta raíz unitaria; por eso mencionamos que necesitamos que estas series sean procesos estacionarios.

  • Es decir que su media y varianza esten mas o menos alrededor de cero y constantes en el tiempo.

1.3 1.4. Proceso de estimación

Cada ecuación del VAR se estima por Mínimos Cuadrados Ordinarios (OLS), dado que los regresores son idénticos entre ecuaciones y se espera que el sistema no presente endogeneidad contemporánea.

El VAR describe la dinámica conjunta de las series y permite análisis como:

  • impulso-respuesta (IRF)- Una aproximación estructural

  • descomposición de varianza (FEVD),

  • pronósticos conjuntos.

1.4 1.5. El problema de identificación

Un VAR reducido no permite identificar los efectos contemporáneos ni distinguir causalidad estructural.

1.5 1.6. Identificación en un modelo VAR estructural

Un VAR con ( n ) variables contiene:

\(2n^2\)

parámetros en las matrices ( A ) y ( B ).

La matriz de covarianza de los errores, denotada como \(\Sigma_u\), solo aporta:

\(\frac{n(n + 1)}{2}\)

ecuaciones independientes.

Por lo tanto, para lograr la identificación del modelo, se requieren al menos:

\(\frac{n(n - 1)}{2}\)

restricciones adicionales, que generalmente se imponen sobre las matrices ( A ) o ( B ) (dependiendo del tipo de identificación: contemporánea, de largo plazo, o basada en restricciones de signo).

En un modelo VAR estructural (SVAR), el objetivo es recuperar las relaciones estructurales contemporáneas entre las variables, es decir, cómo los choques estructurales (innovaciones puras) afectan simultáneamente a las variables del sistema.

Sin embargo, el modelo estimado directamente (el VAR reducido) solo nos proporciona información sobre la covarianza observada de los errores, \(\Sigma_u\).
Esta matriz tiene \(n(n + 1)/2\) elementos únicos, ya que es simétrica.

El problema surge porque las matrices ( A ) y ( B ) contienen en total ( 2n^2 ) parámetros desconocidos, mientras que solo contamos con \(n(n + 1)/2\) ecuaciones provenientes de \(Sigma_u\).
Esto implica que el sistema está subidentificado: hay más parámetros desconocidos que ecuaciones disponibles.

Para resolver este problema, se deben imponer restricciones adicionales que permitan identificar cada parámetro estructural.
En concreto, se necesitan al menos:

\(\frac{n(n - 1)}{2}\)

restricciones adicionales para que el número de ecuaciones iguale al número de parámetros y el sistema quede justamente identificado.


1.5.1 🧩 Tipos de restricciones comunes

  1. Restricciones contemporáneas (modelo tipo AB o recursivo - Cholesky):
    Se impone una estructura triangular en ( A ) o ( B ) asumiendo que ciertas variables no responden contemporáneamente a otras.

  2. Restricciones de largo plazo (modelo tipo Blanchard-Quah):
    Se imponen condiciones sobre la respuesta acumulada a los choques, por ejemplo, que ciertos choques no afectan permanentemente algunas variables.

  3. Restricciones de signo (modelo de Uhlig):
    En lugar de ceros, se imponen signos (+/–) sobre las respuestas o sobre los impactos contemporáneos.


1.5.2 🧠 Ejemplo ilustrativo

Para un VAR de 2 variables (n = 2):

  • Parámetros totales: \(2n^2 = 8\)
  • Ecuaciones de la covarianza: \(n(n + 1)/2 = 3\)
  • Restricciones necesarias: \(n(n - 1)/2 = 1\)

Por tanto, se necesita al menos una restricción adicional (por ejemplo, asumir que una variable no reacciona contemporáneamente a otra) para lograr la identificación.


💡 Conclusión:

  • La identificación en los modelos VAR estructurales es esencial para poder interpretar los choques estimados como “causales” o “estructurales”.

  • Sin restricciones suficientes, solo observamos correlaciones reducidas, no relaciones estructurales.

1.6 Funciones impulso respuesta

En síntesis queremos analizar como un shock exogeno afecta a un shock contemporaneo en el momento

Eigen valores

Necesitamos que los eigen valores esten dentro del circulo unitario.

Tratamos de modelar relaciones aditivas, es decir que conforme me alejo en el tiempo del shock idiosincrático este se va perdiendo en el tiempo.

1.7 Modelos parsimoniosos

En modelos de series temporales es fundamental estimar modelos parsimoniosos, es decir que sean modelos sencillos, el estimar modelos multiecuaciones requiere tener un poder computacional grande.

  • El número de rezagos es determinante

  • El número de coeficientes de la estimación de un modelo VAR en este sistema se incrementa considerablemente por rezagos a incluir.

  • Es fundamental guiarnos en los criterios de información: AIC | BIC | Hannan-Quinn para estimar una especificación óptima.

  • min (AIC, BIC)

1.8 Ejemplo aplicado: Modelo VAR con tres variables macroeconómicas

1.8.1 🔹 1. Variables del sistema

Supón que queremos estudiar la relación dinámica entre:

  • ( Y_t ): PIB real trimestral (crecimiento económico)
  • ( X_t ): Inflación trimestral (IPC)
  • ( Z_t ): Tasa de interés de política monetaria

Nuestro interés es analizar cómo los choques en la tasa de interés afectan la inflación y el crecimiento, y viceversa.


1.8.2 🔹 2. Especificación del modelo VAR(1)

El modelo VAR(1) se escribe como:

\[ \begin{bmatrix} Y_t \\ X_t \\ Z_t \end{bmatrix} = \begin{bmatrix} \psi_Y \\ \psi_X \\ \psi_Z \end{bmatrix} + \begin{bmatrix} \alpha_{11} & \alpha_{12} & \alpha_{13} \\ \alpha_{21} & \alpha_{22} & \alpha_{23} \\ \alpha_{31} & \alpha_{32} & \alpha_{33} \end{bmatrix} \begin{bmatrix} Y_{t-1} \\ X_{t-1} \\ Z_{t-1} \end{bmatrix} + \begin{bmatrix} \mu_{Yt} \\ \mu_{Xt} \\ \mu_{Zt} \end{bmatrix} \]


1.8.3 🔹 3. Interpretación económica

Cada ecuación representa una variable endógena en función de los rezagos de todas las variables:

\[ \begin{aligned} Y_t &= \psi_Y + \alpha_{11}Y_{t-1} + \alpha_{12}X_{t-1} + \alpha_{13}Z_{t-1} + \mu_{Yt} \\ X_t &= \psi_X + \alpha_{21}Y_{t-1} + \alpha_{22}X_{t-1} + \alpha_{23}Z_{t-1} + \mu_{Xt} \\ Z_t &= \psi_Z + \alpha_{31}Y_{t-1} + \alpha_{32}X_{t-1} + \alpha_{33}Z_{t-1} + \mu_{Zt} \end{aligned} \]

Ejemplos de interpretación:

  • \(\alpha_{12}\): mide cómo la inflación del trimestre anterior afecta el PIB actual.
  • \(\alpha_{33}\): mide la persistencia de la tasa de interés.
  • \(\alpha_{23}\): mide cómo la tasa de interés pasada influye en la inflación presente.

1.8.4 🔹 4. Número de parámetros a estimar

La matriz ( A_1 ) tiene:

\[ 3 \times 3 = 9 \text{ coeficientes.} \]

Los interceptos suman 3 parámetros \((\psi_Y, \psi_X, \psi_Z )\).

Total en las ecuaciones:

\[ 9 + 3 = 12 \text{ parámetros.} \]

La matriz de varianza-covarianza del error es:

\[ \Sigma_{\mu} = \begin{bmatrix} \sigma^2_{YY} & \sigma_{YX} & \sigma_{YZ} \\ \sigma_{XY} & \sigma^2_{XX} & \sigma_{XZ} \\ \sigma_{ZY} & \sigma_{ZX} & \sigma^2_{ZZ} \end{bmatrix} \]

Esta matriz es simétrica, por lo que aporta 6 parámetros adicionales.

Total general:

\[ 12 + 6 = 18 \text{ parámetros a estimar.} \]


1.8.5 🔹 5. Aumentando la complejidad: VAR(2)

Si añadimos un segundo rezago para capturar efectos más lentos:

\[ Y_t = \psi + A_1Y_{t-1} + A_2Y_{t-2} + \mu_t \]

La nueva matriz ( A_2 ) también tiene 9 coeficientes.

Por tanto, el modelo tiene:

\[ 3 \text{ (interceptos)} + 9 (A_1) + 9 (A_2) = 21 \text{ parámetros.} \]

Si añadimos un tercer rezago (VAR(3)):

\[ 3 + 9 \times 3 = 30 \text{ parámetros} \]

(sin contar los de la matriz de covarianza).


1.8.6 🔹 6. Problema de parsimonia

Mientras más rezagos añadimos:

  • Se incrementa el número de parámetros a estimar.
  • Se reducen los grados de libertad si la muestra es corta.
  • Crece el riesgo de sobreajuste (el modelo se adapta a los datos históricos pero pierde capacidad predictiva).
  • Aumenta la complejidad analítica (impulso-respuesta, descomposición de varianza, estabilidad, etc.).

1.8.7 ✅ Conclusión

El modelo VAR permite capturar la interdependencia dinámica entre variables macroeconómicas, pero su uso requiere un equilibrio entre complejidad y parsimonia, especialmente cuando la muestra es limitada o el número de variables es grande.

1.9 Test importantes.

Test de Engel y Granger

  • Estima una regresión; estima los residuos de la regresión; especifica que esos residuos son estacionarios, esto mediante los test de Dickey- Fuller.

Test de Johansen (1988)

  • Versión generalizada de los test de Engel y Granger, pero de forma Vectorial Multivariada.

  • Evalua raíz unitaria en vectores ( Sistema de vectores autoregresivos)

Consideraciones de aplicarlo en un modelo multivariado

Es posible que tenamos varios vectores de cointegración y exista más de un vector de cointegración.

Qué es cointegración

Puede que un sistema de ecuaciones de series de tiempo por separado sean no estacionarias, puede existir una combinación lineal de ellas que sí sea estacionaria.

Es relevante?

Si tenemos dos variables \(Y\) y \(X\) , llamese el PIB real y el Consumo Privado , en la práctica, tienden a crecer juntos .

Por lo general, estos son \(I(1)\) pero su diferencia puede ser estacionaria

\(Consumo - PIB\) pueden ser \(I(0)\)

Es decir indicar una relación estable en el largo plazo.

1.10 Implicaciones del Modelo VAR

Cuando las variables estan cointegradas:

  • No se debe estimar un VAR en diferencias, porque se pierde la información del equilibrio de largo plazo.

  • Tampoco un VAR sin restricciones.

  • Solución: Estimar un modelo VECM (Modelo de corrección de Errores) - Es decir;

    • Dinámica de corto plazo

    • Relación a largo plazo ( Cointegración)

👉 Si las series son I(0) → usamos VAR en niveles.

👉 Si las series son I(1) y no cointegradas → usamos VAR en diferencias.

👉 Si las series son I(1) y cointegradas → usamos VECM.

  • Ejemplo empíco

Series a modelar

Identificación económica que usaré (ajústala si quieres):

  • Petróleo (L_PP) es “exógeno contemporáneo”: no recibe shocks contemporáneos de otras variables (solo su propio shock).

  • PIB (L_PIB) puede reaccionar contemporáneamente a petróleo.

  • Gasto total (L_GG) reacciona contemporáneamente al PIB (reglas/prociclicidad).

  • Gasto corriente / de capital (L_GC, L_GK) reaccionan a G_G.

  • Ingresos (L_IF) reaccionan a petróleo (vía actividad/sector petrolero) y a impuestos indirectos (L_IVA, L_IR, L_ICE).

  • Para el resto, dejamos parámetros “libres” (NA) solo donde tiene sentido; el resto se fijan en 0.

Código
Y_ts <- ts(t(Y), start = c(2007,1), frequency = fq); colnames(Y_ts) <- vars
base_wide <- data.frame(
  fecha_q = fechas,
  year    = as.integer(format(fechas, "%Y")),
  quarter = as.integer(cycle(Y_ts)),
  as.data.frame(Y_ts),
  check.names = FALSE
)

base_long <- base_wide |>
  pivot_longer(cols = all_of(vars), names_to = "variable", values_to = "valor")

ggplot(base_long, aes(x = fecha_q, y = valor)) +
  geom_line() + facet_wrap(~ variable, scales = "free_y", ncol = 3) +
  labs(title = "Series simuladas (log)", x = NULL, y = "log") +
  theme_minimal()

Estacionariedad en niveles y en diferencias


ADF p-valores en niveles:
  L_PP  L_PIB   L_GG   L_GC   L_GK   L_IF  L_IVA  L_ICE   L_IR 
0.5077 0.4831 0.1429 0.2622 0.8133 0.3314 0.1580 0.6756 0.1775 

ADF p-valores en diferencias:
  L_PP  L_PIB   L_GG   L_GC   L_GK   L_IF  L_IVA  L_ICE   L_IR 
0.0302 0.0100 0.0100 0.0162 0.1010 0.1381 0.1824 0.0965 0.0104 

1.11 📘 1️⃣ Hipótesis del test ADF

  • H₀ (nula): La serie tiene una raíz unitaria → no estacionaria.

  • H₁ (alternativa): La serie es estacionaria.

1.12 📊 2️⃣ Resultados por niveles

Variable p-valor Interpretación
L_PP 0.5077 No se rechaza H₀ → no estacionaria
L_PIB 0.4831 No estacionaria
L_GG 0.1429 No estacionaria
L_GC 0.2622 No estacionaria
L_GK 0.8133 No estacionaria
L_IF 0.3314 No estacionaria
L_IVA 0.1580 No estacionaria
L_ICE 0.6756 No estacionaria
L_IR 0.1775 No estacionaria

🔹 Conclusión en niveles:
Todas las variables tienen p-valores > 0.05 → no se rechaza la hipótesis nula de raíz unitaria.
➡️ Ninguna serie es estacionaria en niveles.

1.13 📈 3️⃣ Resultados en primeras diferencias

Variable p-valor Interpretación
L_PP 0.0302 Estacionaria
L_PIB 0.0100 Estacionaria
L_GG 0.0100 Estacionaria
L_GC 0.0162 Estacionaria
L_GK 0.1010 No estacionaria al 5% (pero casi)
L_IF 0.1381 No estacionaria
L_IVA 0.1824 No estacionaria
L_ICE 0.0965 No estacionaria (marginal al 10%)
L_IR 0.0104 Estacionaria

🔹 Conclusión en diferencias:
La mayoría de las series

(L_PP, L_PIB, L_GG, L_GC, L_IR)

Son estacionarias en primeras diferencias (p < 0.05).
Algunas (L_GK, L_IF, L_IVA, L_ICE) presentan p-valores entre 0.09–0.18, lo que podría considerarse estacionarias al 10% o requerir una segunda diferencia o un ajuste de rezagos.

1.14 4️⃣ Implicación para el modelo VAR

  • Dado que las series no son estacionarias en niveles pero sí lo son en diferencias, se clasifican como I(1) (integradas de orden uno).

  • Esto sugiere que podría existir cointegración entre ellas, por lo cual el paso siguiente sería aplicar el test de Johansen:

Seleccionamos los rezagos en niveles (para el Test de Johansen)


Criterios de información (niveles):
                   1             2             3             4
AIC(n) -1.864410e+01 -1.800915e+01 -1.739430e+01 -1.776323e+01
HQ(n)  -1.748014e+01 -1.579762e+01 -1.413521e+01 -1.345658e+01
SC(n)  -1.570651e+01 -1.242774e+01 -9.169070e+00 -6.894172e+00
FPE(n)  8.153935e-09  1.731364e-08  4.454123e-08  6.316023e-08

Usando K = 2 para Johansen.

El estándar en econometría aplicada (ver Johansen, 1991; Lütkepohl, 2005) es:

✅ “Usar al menos un rezago en diferencias (p−1 ≥ 1) para capturar la dinámica de corto plazo.”

  • Si p_opt = 1 (por AIC o HQ), se eleva a K = 2

  • Si p_opt = 3, se usa K = 3 (sin cambio)

  • Esto garantiza que el VECM tendrá al menos un rezago en diferencias (ΔXₜ₋₁).

  • \(p\) es el número de rezagos de un VAR, para eso utilizamos los criterios de información; recordar, el modelo más parsimonioso.

  • \(K\) que utiliza el test de Johansen

  • Ojo: En una diferenciación podemos omitir este error.

Código
j_tr  <- ca.jo(Y_ts, type = "trace", K = Kj, ecdet = "const", spec = "transitory")
j_eig <- ca.jo(Y_ts, type = "eigen", K = Kj, ecdet = "const", spec = "transitory")
cat("\n--- Johansen TRACE ---\n"); print(summary(j_tr))

--- Johansen TRACE ---

###################### 
# Johansen-Procedure # 
###################### 

Test type: trace statistic , without linear trend and constant in cointegration 

Eigenvalues (lambda):
 [1]  5.909955e-01  4.423184e-01  3.813286e-01  3.171301e-01  2.314686e-01
 [6]  2.030888e-01  1.567262e-01  9.683625e-02  4.903297e-02 -8.006596e-17

Values of teststatistic and critical values of test:

           test  10pct   5pct   1pct
r <= 8 |   3.52   7.52   9.24  12.97
r <= 7 |  10.65  17.85  19.96  24.60
r <= 6 |  22.58  32.00  34.91  41.07
r <= 5 |  38.47  49.65  53.12  60.16
r <= 4 |  56.90  71.86  76.07  84.45
r <= 3 |  83.60  97.18 102.14 111.01
r <= 2 | 117.22 126.58 131.70 143.09
r <= 1 | 158.09 159.48 165.58 177.20
r = 0  | 220.68 196.37 202.92 215.74

Eigenvectors, normalised to first column:
(These are the cointegration relations)

             L_PP.l1    L_PIB.l1     L_GG.l1    L_GC.l1     L_GK.l1
L_PP.l1    1.0000000  1.00000000  1.00000000  1.0000000   1.0000000
L_PIB.l1   0.7324992 -2.08073054  0.06556848 -0.8190391   0.7237758
L_GG.l1   -0.2778916  3.36639420 -1.31418394 -0.2134218  -0.8948099
L_GC.l1   -0.1847404 -1.88785850 -0.48758497  1.3354645  -1.3605263
L_GK.l1   -0.2480989 -1.37287595  0.01989781 -1.0902060   0.4782761
L_IF.l1   -0.1274489  0.06782783  0.80838209 -0.3852260  -1.6148731
L_IVA.l1   0.5791197  1.20062298  1.23863346  1.4955178   1.5141218
L_ICE.l1   0.7588437 -1.09644442  0.41950093 -1.0926320   2.1507986
L_IR.l1    1.3174608 -0.32179846 -0.11028251  0.4897667   0.6610095
constant -21.3593180  7.20167336 -9.16030864 -4.6071778 -14.4253446
              L_IF.l1   L_IVA.l1   L_ICE.l1    L_IR.l1     constant
L_PP.l1    1.00000000  1.0000000  1.0000000  1.0000000  1.000000000
L_PIB.l1   2.31180164  2.1965497  0.8382612 -0.4410457  0.441582292
L_GG.l1   -0.55387332  0.1661096 -0.1437685  0.1185211 -0.563672905
L_GC.l1   -0.54347756 -0.4730255  1.6080807 -0.8404113 -0.240905965
L_GK.l1   -0.11323347  1.0887838 -1.1336760  0.9718469 -1.549307168
L_IF.l1   -0.96615237  1.3870214 -0.8986143 -1.3342308 -0.491574728
L_IVA.l1   0.97208201 -4.9683112 -0.3383076  1.9828351 -0.690720871
L_ICE.l1   0.53517813  1.8773423  1.0909467 -0.1795450  0.840946996
L_IR.l1   -0.01142896 -0.8260108 -3.7907235  0.2523096  0.009541541
constant -18.09336666 -5.5963588 18.1598105 -9.0688320 12.989079589

Weights W:
(This is the loading matrix)

             L_PP.l1     L_PIB.l1       L_GG.l1      L_GC.l1      L_GK.l1
L_PP.d  -0.170837587 -0.003662898  0.0575157278 -0.131035864  0.013545373
L_PIB.d -0.005989066 -0.017212711  0.0395195792  0.093970593 -0.008844093
L_GG.d  -0.014904228 -0.131448226  0.0984319174  0.031597461  0.065662423
L_GC.d  -0.202032138  0.037061936  0.0239556762 -0.053822660  0.023277256
L_GK.d   0.107879149  0.040323523  0.0399504908  0.097749889  0.035514573
L_IF.d  -0.130986197  0.022476659 -0.0809102756 -0.027650974  0.078040213
L_IVA.d  0.034755025 -0.021334929 -0.1195008720 -0.006213521  0.037895083
L_ICE.d -0.086456592 -0.026877165 -0.0523795313  0.110418160 -0.018931774
L_IR.d  -0.244164374 -0.033087565 -0.0007176711  0.055140201 -0.006378733
             L_IF.l1     L_IVA.l1     L_ICE.l1       L_IR.l1      constant
L_PP.d  -0.065563423 -0.012443347 -0.015033901 -0.0218652619  7.964410e-16
L_PIB.d -0.057023595  0.001508587 -0.029896084  0.0119994823 -2.777417e-17
L_GG.d   0.024103879 -0.007603056 -0.010517381  0.0042684620  2.576200e-15
L_GC.d   0.025564965  0.013161977 -0.008089357  0.0011980029  5.434942e-16
L_GK.d  -0.033141892  0.009359561  0.011561300 -0.0161955978  5.953449e-16
L_IF.d  -0.050478050 -0.015256264 -0.014706610  0.0046688332 -2.897984e-16
L_IVA.d -0.023889710  0.023095483 -0.008423701 -0.0001829324 -2.094494e-16
L_ICE.d  0.069818273 -0.004381045 -0.008119242 -0.0154794202 -1.182713e-15
L_IR.d  -0.007205277  0.003809481  0.018052746  0.0066262475 -6.074391e-16
Código
cat("\n--- Johansen EIGEN ---\n"); print(summary(j_eig))

--- Johansen EIGEN ---

###################### 
# Johansen-Procedure # 
###################### 

Test type: maximal eigenvalue statistic (lambda max) , without linear trend and constant in cointegration 

Eigenvalues (lambda):
 [1]  5.909955e-01  4.423184e-01  3.813286e-01  3.171301e-01  2.314686e-01
 [6]  2.030888e-01  1.567262e-01  9.683625e-02  4.903297e-02 -8.006596e-17

Values of teststatistic and critical values of test:

          test 10pct  5pct  1pct
r <= 8 |  3.52  7.52  9.24 12.97
r <= 7 |  7.13 13.75 15.67 20.20
r <= 6 | 11.93 19.77 22.00 26.81
r <= 5 | 15.89 25.56 28.14 33.24
r <= 4 | 18.43 31.66 34.40 39.79
r <= 3 | 26.70 37.45 40.30 46.82
r <= 2 | 33.61 43.25 46.45 51.91
r <= 1 | 40.88 48.91 52.00 57.95
r = 0  | 62.58 54.35 57.42 63.71

Eigenvectors, normalised to first column:
(These are the cointegration relations)

             L_PP.l1    L_PIB.l1     L_GG.l1    L_GC.l1     L_GK.l1
L_PP.l1    1.0000000  1.00000000  1.00000000  1.0000000   1.0000000
L_PIB.l1   0.7324992 -2.08073054  0.06556848 -0.8190391   0.7237758
L_GG.l1   -0.2778916  3.36639420 -1.31418394 -0.2134218  -0.8948099
L_GC.l1   -0.1847404 -1.88785850 -0.48758497  1.3354645  -1.3605263
L_GK.l1   -0.2480989 -1.37287595  0.01989781 -1.0902060   0.4782761
L_IF.l1   -0.1274489  0.06782783  0.80838209 -0.3852260  -1.6148731
L_IVA.l1   0.5791197  1.20062298  1.23863346  1.4955178   1.5141218
L_ICE.l1   0.7588437 -1.09644442  0.41950093 -1.0926320   2.1507986
L_IR.l1    1.3174608 -0.32179846 -0.11028251  0.4897667   0.6610095
constant -21.3593180  7.20167336 -9.16030864 -4.6071778 -14.4253446
              L_IF.l1   L_IVA.l1   L_ICE.l1    L_IR.l1     constant
L_PP.l1    1.00000000  1.0000000  1.0000000  1.0000000  1.000000000
L_PIB.l1   2.31180164  2.1965497  0.8382612 -0.4410457  0.441582292
L_GG.l1   -0.55387332  0.1661096 -0.1437685  0.1185211 -0.563672905
L_GC.l1   -0.54347756 -0.4730255  1.6080807 -0.8404113 -0.240905965
L_GK.l1   -0.11323347  1.0887838 -1.1336760  0.9718469 -1.549307168
L_IF.l1   -0.96615237  1.3870214 -0.8986143 -1.3342308 -0.491574728
L_IVA.l1   0.97208201 -4.9683112 -0.3383076  1.9828351 -0.690720871
L_ICE.l1   0.53517813  1.8773423  1.0909467 -0.1795450  0.840946996
L_IR.l1   -0.01142896 -0.8260108 -3.7907235  0.2523096  0.009541541
constant -18.09336666 -5.5963588 18.1598105 -9.0688320 12.989079589

Weights W:
(This is the loading matrix)

             L_PP.l1     L_PIB.l1       L_GG.l1      L_GC.l1      L_GK.l1
L_PP.d  -0.170837587 -0.003662898  0.0575157278 -0.131035864  0.013545373
L_PIB.d -0.005989066 -0.017212711  0.0395195792  0.093970593 -0.008844093
L_GG.d  -0.014904228 -0.131448226  0.0984319174  0.031597461  0.065662423
L_GC.d  -0.202032138  0.037061936  0.0239556762 -0.053822660  0.023277256
L_GK.d   0.107879149  0.040323523  0.0399504908  0.097749889  0.035514573
L_IF.d  -0.130986197  0.022476659 -0.0809102756 -0.027650974  0.078040213
L_IVA.d  0.034755025 -0.021334929 -0.1195008720 -0.006213521  0.037895083
L_ICE.d -0.086456592 -0.026877165 -0.0523795313  0.110418160 -0.018931774
L_IR.d  -0.244164374 -0.033087565 -0.0007176711  0.055140201 -0.006378733
             L_IF.l1     L_IVA.l1     L_ICE.l1       L_IR.l1      constant
L_PP.d  -0.065563423 -0.012443347 -0.015033901 -0.0218652619  7.964410e-16
L_PIB.d -0.057023595  0.001508587 -0.029896084  0.0119994823 -2.777417e-17
L_GG.d   0.024103879 -0.007603056 -0.010517381  0.0042684620  2.576200e-15
L_GC.d   0.025564965  0.013161977 -0.008089357  0.0011980029  5.434942e-16
L_GK.d  -0.033141892  0.009359561  0.011561300 -0.0161955978  5.953449e-16
L_IF.d  -0.050478050 -0.015256264 -0.014706610  0.0046688332 -2.897984e-16
L_IVA.d -0.023889710  0.023095483 -0.008423701 -0.0001829324 -2.094494e-16
L_ICE.d  0.069818273 -0.004381045 -0.008119242 -0.0154794202 -1.182713e-15
L_IR.d  -0.007205277  0.003809481  0.018052746  0.0066262475 -6.074391e-16
Código
choose_r_trace <- function(jobj, alpha = 0.05) {
  ts <- jobj@teststat
  cv <- jobj@cval[,"5pct"]
  sum(ts > cv)
}
r <- max(1, choose_r_trace(j_tr, 0.05))   # asegura r≥1 para poder estimar VECM
cat("\nRango de cointegración estimado (trace, 5%): r =", r, "\n")

Rango de cointegración estimado (trace, 5%): r = 1 

La salida proviene de la selección del número óptimo de rezagos \((p)\) en un modelo VAR.

Los criterios de información (AIC, HQ, SC, FPE) comparan la bondad de ajuste y la penalización por complejidad del modelo (número de rezagos).

El objetivo es elegir el valor de \((p)\) que minimiza el criterio seleccionado.

-Normalmente AIC (Akaike Information Criterion) o BIC/SC (Schwarz Criterion).


--- Johansen TRACE ---

###################### 
# Johansen-Procedure # 
###################### 

Test type: trace statistic , without linear trend and constant in cointegration 

Eigenvalues (lambda):
 [1]  5.909955e-01  4.423184e-01  3.813286e-01  3.171301e-01  2.314686e-01
 [6]  2.030888e-01  1.567262e-01  9.683625e-02  4.903297e-02 -8.006596e-17

Values of teststatistic and critical values of test:

           test  10pct   5pct   1pct
r <= 8 |   3.52   7.52   9.24  12.97
r <= 7 |  10.65  17.85  19.96  24.60
r <= 6 |  22.58  32.00  34.91  41.07
r <= 5 |  38.47  49.65  53.12  60.16
r <= 4 |  56.90  71.86  76.07  84.45
r <= 3 |  83.60  97.18 102.14 111.01
r <= 2 | 117.22 126.58 131.70 143.09
r <= 1 | 158.09 159.48 165.58 177.20
r = 0  | 220.68 196.37 202.92 215.74

Eigenvectors, normalised to first column:
(These are the cointegration relations)

             L_PP.l1    L_PIB.l1     L_GG.l1    L_GC.l1     L_GK.l1
L_PP.l1    1.0000000  1.00000000  1.00000000  1.0000000   1.0000000
L_PIB.l1   0.7324992 -2.08073054  0.06556848 -0.8190391   0.7237758
L_GG.l1   -0.2778916  3.36639420 -1.31418394 -0.2134218  -0.8948099
L_GC.l1   -0.1847404 -1.88785850 -0.48758497  1.3354645  -1.3605263
L_GK.l1   -0.2480989 -1.37287595  0.01989781 -1.0902060   0.4782761
L_IF.l1   -0.1274489  0.06782783  0.80838209 -0.3852260  -1.6148731
L_IVA.l1   0.5791197  1.20062298  1.23863346  1.4955178   1.5141218
L_ICE.l1   0.7588437 -1.09644442  0.41950093 -1.0926320   2.1507986
L_IR.l1    1.3174608 -0.32179846 -0.11028251  0.4897667   0.6610095
constant -21.3593180  7.20167336 -9.16030864 -4.6071778 -14.4253446
              L_IF.l1   L_IVA.l1   L_ICE.l1    L_IR.l1     constant
L_PP.l1    1.00000000  1.0000000  1.0000000  1.0000000  1.000000000
L_PIB.l1   2.31180164  2.1965497  0.8382612 -0.4410457  0.441582292
L_GG.l1   -0.55387332  0.1661096 -0.1437685  0.1185211 -0.563672905
L_GC.l1   -0.54347756 -0.4730255  1.6080807 -0.8404113 -0.240905965
L_GK.l1   -0.11323347  1.0887838 -1.1336760  0.9718469 -1.549307168
L_IF.l1   -0.96615237  1.3870214 -0.8986143 -1.3342308 -0.491574728
L_IVA.l1   0.97208201 -4.9683112 -0.3383076  1.9828351 -0.690720871
L_ICE.l1   0.53517813  1.8773423  1.0909467 -0.1795450  0.840946996
L_IR.l1   -0.01142896 -0.8260108 -3.7907235  0.2523096  0.009541541
constant -18.09336666 -5.5963588 18.1598105 -9.0688320 12.989079589

Weights W:
(This is the loading matrix)

             L_PP.l1     L_PIB.l1       L_GG.l1      L_GC.l1      L_GK.l1
L_PP.d  -0.170837587 -0.003662898  0.0575157278 -0.131035864  0.013545373
L_PIB.d -0.005989066 -0.017212711  0.0395195792  0.093970593 -0.008844093
L_GG.d  -0.014904228 -0.131448226  0.0984319174  0.031597461  0.065662423
L_GC.d  -0.202032138  0.037061936  0.0239556762 -0.053822660  0.023277256
L_GK.d   0.107879149  0.040323523  0.0399504908  0.097749889  0.035514573
L_IF.d  -0.130986197  0.022476659 -0.0809102756 -0.027650974  0.078040213
L_IVA.d  0.034755025 -0.021334929 -0.1195008720 -0.006213521  0.037895083
L_ICE.d -0.086456592 -0.026877165 -0.0523795313  0.110418160 -0.018931774
L_IR.d  -0.244164374 -0.033087565 -0.0007176711  0.055140201 -0.006378733
             L_IF.l1     L_IVA.l1     L_ICE.l1       L_IR.l1      constant
L_PP.d  -0.065563423 -0.012443347 -0.015033901 -0.0218652619  7.964410e-16
L_PIB.d -0.057023595  0.001508587 -0.029896084  0.0119994823 -2.777417e-17
L_GG.d   0.024103879 -0.007603056 -0.010517381  0.0042684620  2.576200e-15
L_GC.d   0.025564965  0.013161977 -0.008089357  0.0011980029  5.434942e-16
L_GK.d  -0.033141892  0.009359561  0.011561300 -0.0161955978  5.953449e-16
L_IF.d  -0.050478050 -0.015256264 -0.014706610  0.0046688332 -2.897984e-16
L_IVA.d -0.023889710  0.023095483 -0.008423701 -0.0001829324 -2.094494e-16
L_ICE.d  0.069818273 -0.004381045 -0.008119242 -0.0154794202 -1.182713e-15
L_IR.d  -0.007205277  0.003809481  0.018052746  0.0066262475 -6.074391e-16

--- Johansen EIGEN ---

###################### 
# Johansen-Procedure # 
###################### 

Test type: maximal eigenvalue statistic (lambda max) , without linear trend and constant in cointegration 

Eigenvalues (lambda):
 [1]  5.909955e-01  4.423184e-01  3.813286e-01  3.171301e-01  2.314686e-01
 [6]  2.030888e-01  1.567262e-01  9.683625e-02  4.903297e-02 -8.006596e-17

Values of teststatistic and critical values of test:

          test 10pct  5pct  1pct
r <= 8 |  3.52  7.52  9.24 12.97
r <= 7 |  7.13 13.75 15.67 20.20
r <= 6 | 11.93 19.77 22.00 26.81
r <= 5 | 15.89 25.56 28.14 33.24
r <= 4 | 18.43 31.66 34.40 39.79
r <= 3 | 26.70 37.45 40.30 46.82
r <= 2 | 33.61 43.25 46.45 51.91
r <= 1 | 40.88 48.91 52.00 57.95
r = 0  | 62.58 54.35 57.42 63.71

Eigenvectors, normalised to first column:
(These are the cointegration relations)

             L_PP.l1    L_PIB.l1     L_GG.l1    L_GC.l1     L_GK.l1
L_PP.l1    1.0000000  1.00000000  1.00000000  1.0000000   1.0000000
L_PIB.l1   0.7324992 -2.08073054  0.06556848 -0.8190391   0.7237758
L_GG.l1   -0.2778916  3.36639420 -1.31418394 -0.2134218  -0.8948099
L_GC.l1   -0.1847404 -1.88785850 -0.48758497  1.3354645  -1.3605263
L_GK.l1   -0.2480989 -1.37287595  0.01989781 -1.0902060   0.4782761
L_IF.l1   -0.1274489  0.06782783  0.80838209 -0.3852260  -1.6148731
L_IVA.l1   0.5791197  1.20062298  1.23863346  1.4955178   1.5141218
L_ICE.l1   0.7588437 -1.09644442  0.41950093 -1.0926320   2.1507986
L_IR.l1    1.3174608 -0.32179846 -0.11028251  0.4897667   0.6610095
constant -21.3593180  7.20167336 -9.16030864 -4.6071778 -14.4253446
              L_IF.l1   L_IVA.l1   L_ICE.l1    L_IR.l1     constant
L_PP.l1    1.00000000  1.0000000  1.0000000  1.0000000  1.000000000
L_PIB.l1   2.31180164  2.1965497  0.8382612 -0.4410457  0.441582292
L_GG.l1   -0.55387332  0.1661096 -0.1437685  0.1185211 -0.563672905
L_GC.l1   -0.54347756 -0.4730255  1.6080807 -0.8404113 -0.240905965
L_GK.l1   -0.11323347  1.0887838 -1.1336760  0.9718469 -1.549307168
L_IF.l1   -0.96615237  1.3870214 -0.8986143 -1.3342308 -0.491574728
L_IVA.l1   0.97208201 -4.9683112 -0.3383076  1.9828351 -0.690720871
L_ICE.l1   0.53517813  1.8773423  1.0909467 -0.1795450  0.840946996
L_IR.l1   -0.01142896 -0.8260108 -3.7907235  0.2523096  0.009541541
constant -18.09336666 -5.5963588 18.1598105 -9.0688320 12.989079589

Weights W:
(This is the loading matrix)

             L_PP.l1     L_PIB.l1       L_GG.l1      L_GC.l1      L_GK.l1
L_PP.d  -0.170837587 -0.003662898  0.0575157278 -0.131035864  0.013545373
L_PIB.d -0.005989066 -0.017212711  0.0395195792  0.093970593 -0.008844093
L_GG.d  -0.014904228 -0.131448226  0.0984319174  0.031597461  0.065662423
L_GC.d  -0.202032138  0.037061936  0.0239556762 -0.053822660  0.023277256
L_GK.d   0.107879149  0.040323523  0.0399504908  0.097749889  0.035514573
L_IF.d  -0.130986197  0.022476659 -0.0809102756 -0.027650974  0.078040213
L_IVA.d  0.034755025 -0.021334929 -0.1195008720 -0.006213521  0.037895083
L_ICE.d -0.086456592 -0.026877165 -0.0523795313  0.110418160 -0.018931774
L_IR.d  -0.244164374 -0.033087565 -0.0007176711  0.055140201 -0.006378733
             L_IF.l1     L_IVA.l1     L_ICE.l1       L_IR.l1      constant
L_PP.d  -0.065563423 -0.012443347 -0.015033901 -0.0218652619  7.964410e-16
L_PIB.d -0.057023595  0.001508587 -0.029896084  0.0119994823 -2.777417e-17
L_GG.d   0.024103879 -0.007603056 -0.010517381  0.0042684620  2.576200e-15
L_GC.d   0.025564965  0.013161977 -0.008089357  0.0011980029  5.434942e-16
L_GK.d  -0.033141892  0.009359561  0.011561300 -0.0161955978  5.953449e-16
L_IF.d  -0.050478050 -0.015256264 -0.014706610  0.0046688332 -2.897984e-16
L_IVA.d -0.023889710  0.023095483 -0.008423701 -0.0001829324 -2.094494e-16
L_ICE.d  0.069818273 -0.004381045 -0.008119242 -0.0154794202 -1.182713e-15
L_IR.d  -0.007205277  0.003809481  0.018052746  0.0066262475 -6.074391e-16

1.15 Interpretación del Test de Johansen

1.15.1 1️⃣ Prueba de la traza (Trace Test)

El test trace contrasta la hipótesis nula de que existen como máximo r vectores de cointegración frente a la alternativa de que hay más.
El resultado fue:

Hipótesis nula Estadístico Valor crítico (5%) Decisión
r = 0 220.68 202.92 Rechazar H₀ → existe al menos 1 relación de cointegración
r ≤ 1 158.09 165.58 No se rechaza H₀
r ≤ 2 117.22 131.70 No se rechaza H₀

Conclusión: se identifica una relación de cointegración entre las variables analizadas (L_PP, L_PIB, L_GG, L_GC, L_GK, L_IF, L_IVA, L_ICE, L_IR).
Esto implica que las series son integradas de orden uno (I(1)) y mantienen una relación de equilibrio a largo plazo.


1.15.2 2️⃣ Prueba del máximo eigenvalor (Eigenvalue Test)

El test maximum eigenvalue (λmax) contrasta r vectores frente a la alternativa de r+1.
El resultado fue:

Hipótesis nula Estadístico Valor crítico (5%) Decisión
r = 0 62.58 57.42 Rechazar H₀
r ≤ 1 40.88 52.00 No se rechaza H₀

Conclusión: también indica una sola relación de cointegración, coherente con el test trace.


1.15.3 3️⃣ Interpretación de los eigenvectores (β)

Los eigenvectores representan las relaciones de cointegración, es decir, las combinaciones lineales estacionarias entre las variables en niveles.


Por ejemplo, el primer vector (normalizado respecto a L_PP.l1) puede escribirse como:

[ L_PP = 0.73 L_PIB - 0.28 L_GG - 0.18 L_GC - 0.25 L_GK - 0.12 L_IF + 0.58 L_IVA + 0.76 L_ICE + 1.32 L_IR - 21.36 ]

🧩 Interpretación económica: - Un aumento del PIB (+0.73) está asociado con un incremento de los precios públicos (L_PP) en el largo plazo.
- Gasto de gobierno (L_GG) y consumo público (L_GC) tienen relación negativa, sugiriendo efectos de equilibrio fiscal o restricciones presupuestarias.
- El impuesto al valor agregado (L_IVA) y el impuesto a consumos especiales (L_ICE) tienen signo positivo, reflejando que mayores recaudaciones se asocian con mayores ingresos totales.
- La constante negativa (-21.36) representa el término de equilibrio de largo plazo.


1.15.4 4️⃣ Interpretación de los weights (α)

Los weights (o matriz de carga α) indican la velocidad de ajuste al equilibrio ante desviaciones de largo plazo.
Valores altos (en valor absoluto) implican una rápida corrección.

Por ejemplo: - L_PP.d tiene una carga de -0.17, indicando que los precios públicos se ajustan moderadamente hacia el equilibrio.
- L_GC.d con -0.20 sugiere que el gasto corriente responde más rápido a los desequilibrios.
- L_PIB.d y L_IVA.d presentan coeficientes pequeños, indicando menor sensibilidad o ajuste lento.


1.15.5 5️⃣ Conclusión general

El sistema presenta una relación de cointegración, lo que implica que las variables fiscales y macroeconómicas (PIB, gasto, impuestos) comparten un equilibrio de largo plazo.
Las desviaciones de corto plazo se corrigen gradualmente, especialmente a través de los ajustes en precios públicos y gasto corriente.


Resumen interpretativo

Elemento Descripción Conclusión
Test Trace Evalúa número de relaciones de cointegración 1 vector cointegrante
Test Eigenvalue Evalúa significancia marginal de cada raíz característica 1 vector cointegrante
Eigenvectors (β) Relación de equilibrio entre las variables Existe relación estable entre ingresos, gasto y PIB
Weights (α) Velocidad de ajuste Ajuste moderado en L_PP y L_GC
Conclusión económica Equilibrio fiscal de largo plazo con desajustes transitorios Evidencia de cointegración macrofiscal

Código
choose_r_trace <- function(jobj, alpha = 0.05) {
  ts <- jobj@teststat
  cv <- jobj@cval[,"5pct"]
  sum(ts > cv)
}
r <- max(1, choose_r_trace(j_tr, 0.05))   # asegura r≥1
cat("\nRango de cointegración estimado (trace, 5%): r =", r, "\n")

Rango de cointegración estimado (trace, 5%): r = 1 

Esto significa que el test Johansen de traza encontró una sola relación de cointegración entre las variables (r = 1), al nivel de significancia del 5%.

Dado que el modelo tiene cointegración

Procedemos a estimar un modelo de Vectores cointegrados

Código
vecm_fit <- cajorls(j_tr, r = r)
cat("\n--- Beta (vectores cointegrados estimados) ---\n")

--- Beta (vectores cointegrados estimados) ---
Código
print(vecm_fit$beta)
                ect1
L_PP.l1    1.0000000
L_PIB.l1   0.7324992
L_GG.l1   -0.2778916
L_GC.l1   -0.1847404
L_GK.l1   -0.2480989
L_IF.l1   -0.1274489
L_IVA.l1   0.5791197
L_ICE.l1   0.7588437
L_IR.l1    1.3174608
constant -21.3593180
Código
var_from_vecm <- vec2var(j_tr, r = r)  

1.16 ¿Qué es ese β (“ect1”)?

Con ( r = 1 ), hay una relación de largo plazo entre las 9 variables:

\[ X_t = (L_{PP}, \; L_{PIB}, \; L_{GG}, \; L_{GC}, \; L_{GK}, \; L_{IF}, \; L_{IVA}, \; L_{ICE}, \; L_{IR})' \]

El objeto vecm_fit$beta entrega el vector \(\beta\) tal que el término de corrección de error (ECT) se define como:

\[ ECT_t = \beta' X_{t-1} \]

En nuestro ejemplo empírico:

\[ \begin{aligned} ECT_t &= 1 \cdot L_{PP,t-1} + 0.7325 \cdot L_{PIB,t-1} - 0.2779 \cdot L_{GG,t-1} - 0.1847 \cdot L_{GC,t-1} - 0.2481 \cdot L_{GK,t-1} \\ &\quad - 0.1274 \cdot L_{IF,t-1} + 0.5791 \cdot L_{IVA,t-1} + 0.7588 \cdot L_{ICE,t-1} + 1.3175 \cdot L_{IR,t-1} - 21.3593 \end{aligned} \]


1.16.1 🔹 Interpretación del ECT

En equilibrio de largo plazo, se cumple que:

\[ ECT_t = 0 \]

Cuando \(ECT_t \neq 0\), significa que existe un desvío del equilibrio.

La fila constant = -21.3593 corresponde al intercepto de la relación de largo plazo, una constante restringida al espacio cointegrante, debido a la opción ecdet = "const" en la estimación del modelo.

El hecho de que $L_{PP,t-1} = 1 $ indica que β está normalizado sobre ( L_{PP} ), aunque podrías normalizar sobre otra variable si deseas interpretar las elasticidades de manera más conveniente.


1.16.2 🔹 ¿Cómo se usa el ECT en el VECM?

El modelo de corrección de errores (VECM) para cada variable en diferencias incluye el término:

\[ \alpha \cdot ECT_{t-1} \]

donde \(\alpha\) representa los loadings o coeficientes de ajuste.

Estos coeficientes \(\alpha\) miden qué tan fuerte y en qué dirección cada variable corrige los desvíos del equilibrio de largo plazo.

Por ejemplo, en la ecuación de:

\[ \Delta L_{PP} \]

si el coeficiente asociado a \(ECT_{t-1}\) es decir, su \(\alpha\) es negativo y estadísticamente significativo, implica que:

  • Cuando ( ECT_{t-1} > 0 ) (es decir, el precio está por encima del equilibrio),
  • entonces \(\Delta L_{PP}\) tenderá a ser negativo,
  • lo cual corrige el desvío y restablece el equilibrio.

1.16.3 ✅ En resumen

  • \(\beta\): define la relación de cointegración (equilibrio de largo plazo).
  • \(ECT_t\): mide el grado de desviación respecto a ese equilibrio.
  • \(\alpha\): indica la velocidad de ajuste de cada variable hacia el equilibrio.

1.17 Diagnosticos

Código
cat("\n--- Portmanteau ---\n"); print(serial.test(var_from_vecm, lags.pt = 12, type = "PT.asymptotic"))

--- Portmanteau ---

    Portmanteau Test (asymptotic)

data:  Residuals of VAR object var_from_vecm
Chi-squared = 854.21, df = 819, p-value = 0.191
$serial

    Portmanteau Test (asymptotic)

data:  Residuals of VAR object var_from_vecm
Chi-squared = 854.21, df = 819, p-value = 0.191
Código
cat("\n--- ARCH ---\n"); print(arch.test(var_from_vecm, lags.multi = 5))

--- ARCH ---

    ARCH (multivariate)

data:  Residuals of VAR object var_from_vecm
Chi-squared = 2925, df = 10125, p-value = 1
$arch.mul

    ARCH (multivariate)

data:  Residuals of VAR object var_from_vecm
Chi-squared = 2925, df = 10125, p-value = 1
Código
cat("\n--- Normalidad ---\n"); print(normality.test(var_from_vecm))

--- Normalidad ---
$JB

    JB-Test (multivariate)

data:  Residuals of VAR object var_from_vecm
Chi-squared = 12.03, df = 18, p-value = 0.8457


$Skewness

    Skewness only (multivariate)

data:  Residuals of VAR object var_from_vecm
Chi-squared = 7.3634, df = 9, p-value = 0.5993


$Kurtosis

    Kurtosis only (multivariate)

data:  Residuals of VAR object var_from_vecm
Chi-squared = 4.6671, df = 9, p-value = 0.8623
$jb.mul
$jb.mul$JB

    JB-Test (multivariate)

data:  Residuals of VAR object var_from_vecm
Chi-squared = 12.03, df = 18, p-value = 0.8457


$jb.mul$Skewness

    Skewness only (multivariate)

data:  Residuals of VAR object var_from_vecm
Chi-squared = 7.3634, df = 9, p-value = 0.5993


$jb.mul$Kurtosis

    Kurtosis only (multivariate)

data:  Residuals of VAR object var_from_vecm
Chi-squared = 4.6671, df = 9, p-value = 0.8623

1.18 🔹 Diagnósticos del modelo VAR / VECM


1.18.1 1️⃣. Portmanteau test → Autocorrelación serial

Hipótesis:

\[ \begin{aligned} H_0 &: \text{No hay autocorrelación serial en los residuos.} \\ H_1 &: \text{Existe autocorrelación (dependencia entre errores rezagados).} \end{aligned} \]

Resultado:

\[ \chi^2 = 854.21, \quad df = 819, \quad p\text{-value} = 0.191 \]

Interpretación:

  • \(p\text{-value} = 0.191 > 0.05 \Rightarrow\) No se rechaza ( H_0 ).
  • Los residuos no presentan autocorrelación significativa.

✅ Esto indica que el modelo captura adecuadamente la dinámica temporal, es decir, los rezagos elegidos son suficientes.

Comentario para clase:

“El test Portmanteau verifica que los residuos del VAR no tengan correlación serial.
Si el p-valor es alto, el modelo está bien especificado en términos de dinámica temporal.”


1.18.2 2️⃣. ARCH test → Heterocedasticidad condicional

Hipótesis:

\[ \begin{aligned} H_0 &: \text{No hay efectos ARCH (varianza constante en el tiempo).} \\ H_1 &: \text{Existe heterocedasticidad condicional (la varianza de los errores cambia con el tiempo).} \end{aligned} \]

Resultado:

\[ \chi^2 = 2925, \quad df = 10125, \quad p\text{-value} = 1.000 \]

Interpretación:

  • \(p\text{-value} = 1.000 > 0.05 \Rightarrow\) No se rechaza ( H_0 ).
  • No hay evidencia de efectos ARCH → la varianza de los residuos parece estable.

Comentario:

“El test ARCH comprueba si existe heterocedasticidad en los errores.
En este caso, los resultados muestran homocedasticidad, es decir, el modelo no presenta volatilidad cambiante.”


1.18.3 3️⃣. Normalidad multivariada (Jarque–Bera test)

Hipótesis:

\[ \begin{aligned} H_0 &: \text{Los residuos son normales multivariados.} \\ H_1 &: \text{Los residuos no siguen una distribución normal.} \end{aligned} \]

Resultados:

\[ \chi^2 = 12.03, \quad df = 18, \quad p\text{-value} = 0.8457 \]

Desglose:

  • Skewness: ( p = 0.5993 )
  • Kurtosis: ( p = 0.8623 )

Interpretación:

  • Los p-valores son muy altos, por lo tanto no se rechaza ( H_0 ).
  • Los residuos cumplen el supuesto de normalidad, tanto en simetría como en curtosis.

Comentario:

“La normalidad de los residuos es importante para la validez de los intervalos de confianza
y las pruebas de hipótesis en el VAR. En este caso, los residuos se distribuyen normalmente.”


1.18.4 🔹 ✅ Conclusión general

Test Hipótesis nula p-value Decisión Conclusión
Portmanteau No autocorrelación 0.191 No se rechaza Residuos no autocorrelados
ARCH Homocedasticidad 1.000 No se rechaza Varianza constante
Normalidad (JB) Normalidad multivariada 0.8457 No se rechaza Residuos normales

Conclusión:

Los resultados de las pruebas indican que el modelo VAR/VECM está bien especificado:

  • No hay autocorrelación serial.
  • Los errores son homocedásticos.
  • Los residuos siguen una distribución aproximadamente normal.

✅ Esto valida la consistencia de las inferencias, como los análisis de impulso–respuesta, descomposición de varianza y efectos de transmisión.

Estimación Estabilidad

Código
var_levels <- VAR(Y_ts, p = Kj, type = "const")
mod_roots <- roots(var_levels, modulus = TRUE)
cat("\nMódulos de autovalores (VAR en niveles, p=Kj):\n"); print(round(sort(mod_roots, decreasing = TRUE), 4))

Módulos de autovalores (VAR en niveles, p=Kj):
 [1] 0.9700 0.9390 0.9390 0.9112 0.9112 0.7489 0.7489 0.6939 0.6939 0.5709
[11] 0.5709 0.4576 0.4576 0.3993 0.2880 0.1840 0.1840 0.0639
Código
plot(roots(var_levels))   # puntos dentro del círculo => estable

Son los autovalores (roots) de un modelo VAR en niveles, y su verificación de estabilidad, que es un paso fundamental antes de interpretar los resultados o generar funciones impulso–respuesta (IRF).

  • Calculas los autovalores del polinomio característico del VAR.

  • Los modos (módulos) de esos autovalores determinan la estabilidad del sistema dinámico

  • Un modelo VAR es estable (o estacionario en niveles) si todos los autovalores tienen módulo menor que 1.

  • Esto equivale a decir que las raíces del polinomio característico están fuera del círculo unitario (en el plano complejo).

  • Todos los valores son menores que 1, lo que implica:

    El VAR es estable
    El sistema es estacionario en niveles (no explosivo)
    ✅ Se pueden calcular funciones impulso–respuesta (IRF) y descomposición de varianza sin problemas.

1.19 VAR equivalente del VECM (para IRF/FEVD/forecast)

Código
dY_ts <- na.omit(diff(Y_ts))
sel_d <- VARselect(dY_ts, lag.max = 4, type = "const")
p_d <- ifelse(is.na(as.integer(sel_d$selection["AIC(n)"])), 2L, as.integer(sel_d$selection["AIC(n)"]))
cat("\nVAR(Δ) seleccionado (AIC): p_d =", p_d, "\n")

VAR(Δ) seleccionado (AIC): p_d = 1 
Código
var_d <- VAR(dY_ts, p = p_d, type = "const")
stb_diff <- stability(var_d, type = "OLS-CUSUM")
  • Estima el modelo VAR con las diferencias y el lag p=1.

  • Incluye una constante (type = "const") para capturar el promedio de crecimiento.

🔹 Ahora var_d contiene el modelo listo para IRF, FEVD, forecast y pruebas de estabilidad.

  • Aplica el test OLS-CUSUM (Brown, Durbin y Evans, 1975) a los residuos recursivos.

    Evalúa si los coeficientes del VAR son estables en el tiempo.

    Si las líneas del gráfico CUSUM se mantienen dentro de las bandas críticas (95%), el modelo es estable.

Código
png("stability_VAR_diff_CUSUM.png", width = 1400, height = 900, res = 150)
par(mar = c(4, 4, 2, 1))
plot(stb_diff)
dev.off()
png 
  2 
Código
cat("Gráfico guardado en: stability_VAR_diff_CUSUM.png\n")
Gráfico guardado en: stability_VAR_diff_CUSUM.png

Esto es el VAR equivalente del VECM, ya que si tus series son I(1) y cointegradas (r=1), el VECM y el VAR(Δ) contienen la misma dinámica de corto plazo.

  • Calcula las diferencias primeras de cada serie

  • na.omit() elimina los valores perdidos de la primera observación.

🔹 Resultado: dy_ts contiene la versión estacionaria (en diferencias) de tu sistema multivariado.

IRF

Código
irf_pp_pib <- irf(var_from_vecm, impulse = "L_PP", response = "L_PIB",
                  n.ahead = 12, boot = TRUE, ci = 0.95)
plot(irf_pp_pib)

Código
fevd_v <- fevd(var_from_vecm, n.ahead = 12)


# Cierra cualquier gráfico abierto
while (!is.null(dev.list())) dev.off()

# Exporta el FEVD a un PNG
png("FEVD_VECM.png", width = 1400, height = 900, res = 150)
par(mar = c(4,4,2,1))  # Márgenes reducidas
plot(fevd_v)
dev.off()
pdf 
  2 
Código
cat("✅ Gráfico FEVD guardado como 'FEVD_VECM.png' en tu directorio de trabajo.\n")
✅ Gráfico FEVD guardado como 'FEVD_VECM.png' en tu directorio de trabajo.

1.20 🔹 Función irf() — Respuestas Impulso–Respuesta (IRF)

1.20.1 ¿Qué hace?

La función irf() genera las respuestas impulso–respuesta (Impulse Response Functions) del modelo var_from_vecm, que proviene del VECM cointegrado.

Estas funciones permiten analizar cómo una perturbación (shock) en una variable afecta a las demás en el tiempo.


1.20.2 🔹 Parámetros principales

Argumento Descripción
impulse = "L_PP" Variable que recibe el shock exógeno (perturbación).
response = "L_PIB" Variable cuya respuesta se observa.
n.ahead = 12 Horizonte temporal de 12 períodos (por ejemplo, trimestres o meses).
boot = TRUE Activa el método bootstrap para obtener intervalos de confianza.
ci = 0.95 Establece un intervalo de confianza del 95%.

1.20.3 🔹 Resultado e interpretación

El gráfico que produce irf() muestra cómo un shock inesperado en ( L_{PP} ) (por ejemplo, precios o política pública) afecta al PIB (( L_{PIB} )) a lo largo de 12 períodos.

  • Eje X: Horizonte temporal (número de períodos).
  • Eje Y: Magnitud y signo de la respuesta de la variable dependiente.

Las bandas grises o líneas discontinuas representan los intervalos de confianza al 95%:

\[ \text{Si la banda incluye el cero} \Rightarrow \text{la respuesta no es estadísticamente significativa.} \]

\[ \text{Si la banda se mantiene por encima o por debajo del cero} \Rightarrow \text{la respuesta sí es significativa.} \]


1.20.4 🔹 📈 Ejemplo de interpretación

“Un aumento inesperado en ( L_{PP} ) genera un incremento transitorio en ( L_{PIB} ) durante los primeros 3 períodos, que luego se disipa gradualmente.”


Código
# IRF: L_PP → L_PIB
png("IRF_L_PP_to_L_PIB.png", width = 1400, height = 900, res = 150)
par(mar = c(4,4,2,1))
plot(irf_pp_pib)
dev.off()
png 
  2 
Código
cat("✅ Gráfico IRF guardado como 'IRF_L_PP_to_L_PIB.png'\n")
✅ Gráfico IRF guardado como 'IRF_L_PP_to_L_PIB.png'

1.21 Modelo SVAR

Código
# =========================================================
# 0) Paquetes y setup
# =========================================================
# install.packages(c("zoo","ggplot2","tseries","vars","urca","forecast","dplyr","tidyr"))
library(zoo)
library(ggplot2)
library(tseries)
library(vars)
library(urca)
library(forecast)
library(dplyr)
library(tidyr)

set.seed(42)

# =========================================================
# 1) Calendario y variables (72 trimestres 2007Q1–2024Q4)
# =========================================================
T  <- 72
fq <- 4
fechas <- as.yearqtr(seq(from = as.Date("2007-01-01"),
                         by = "quarter", length.out = T))
vars <- c("L_PP","L_PIB","L_GG","L_GC","L_GK","L_IF","L_IVA","L_ICE","L_IR")
k <- length(vars)

# =========================================================
# 2) DGP: I(1) con 2 cointegraciones plausibles (para simular)
# =========================================================
beta <- matrix(0, nrow = k, ncol = 2, dimnames = list(vars, c("CI_gasto","CI_tributos")))
beta["L_GG","CI_gasto"] <- 1;   beta["L_GC","CI_gasto"] <- -0.7; beta["L_GK","CI_gasto"] <- -0.3
beta["L_IF","CI_tributos"] <- 1; beta["L_IVA","CI_tributos"] <- -0.5; beta["L_IR","CI_tributos"] <- -0.3; beta["L_ICE","CI_tributos"] <- -0.2

alpha <- matrix(0, nrow = k, ncol = 2, dimnames = list(vars, c("CI_gasto","CI_tributos")))
alpha["L_GG","CI_gasto"]  <- -0.25
alpha["L_GC","CI_gasto"]  <- -0.10
alpha["L_GK","CI_gasto"]  <- -0.05
alpha["L_IF","CI_tributos"]  <- -0.20
alpha["L_IVA","CI_tributos"] <- -0.10
alpha["L_IR","CI_tributos"]  <- -0.08
alpha["L_ICE","CI_tributos"] <- -0.05
alpha["L_PIB","CI_gasto"]    <- -0.02
alpha["L_PIB","CI_tributos"] <- -0.01
alpha["L_PP",] <- c(0,0)  # petróleo no corrige directamente

Gamma1 <- matrix(0, nrow = k, ncol = k, dimnames = list(vars, vars))
Gamma1["L_PIB","L_PP"] <- 0.10
Gamma1["L_IF","L_PP"]  <- 0.08
Gamma1["L_IF","L_IVA"] <- 0.10; Gamma1["L_IF","L_IR"] <- 0.07; Gamma1["L_IF","L_ICE"] <- 0.05
Gamma1["L_GG","L_PIB"] <- 0.06
Gamma1["L_GC","L_GG"]  <- 0.10
Gamma1["L_GK","L_GG"]  <- 0.06

Sigma <- diag(c(0.20, 0.18, 0.15, 0.12, 0.12, 0.18, 0.15, 0.12, 0.12))
dimnames(Sigma) <- list(vars, vars)
Sigma["L_PIB","L_PP"] <- Sigma["L_PP","L_PIB"] <- 0.05
Sigma["L_IF","L_PP"]  <- Sigma["L_PP","L_IF"]  <- 0.04
Sigma["L_IF","L_IVA"] <- Sigma["L_IVA","L_IF"] <- 0.06
Sigma["L_GG","L_PIB"] <- Sigma["L_PIB","L_GG"] <- 0.04
Sigma <- (Sigma + t(Sigma))/2
C <- t(chol(Sigma))

# =========================================================
# 3) Simulación VECM (ΔY_t = Γ1 ΔY_{t-1} + α β' Y_{t-1} + ε_t)
# =========================================================
Y  <- matrix(0, nrow = k, ncol = T, dimnames = list(vars, NULL))
dY <- matrix(0, nrow = k, ncol = T, dimnames = list(vars, NULL))
Y[,1] <- c(4.6, 8.5, 9.2, 8.9, 7.8, 8.6, 7.9, 6.5, 7.6)

for (t in 2:T) {
  eps_t  <- C %*% rnorm(k)
  EC_lag <- t(beta) %*% Y[, t-1]           # (2x9)*(9x1) = (2x1)
  dY[,t] <- Gamma1 %*% dY[,t-1] + alpha %*% EC_lag + eps_t
  Y[,t]  <- Y[,t-1] + dY[,t]
}

Y_ts <- ts(t(Y), start = c(2007,1), frequency = fq); colnames(Y_ts) <- vars
Código
dY_ts <- na.omit(diff(Y_ts))
sel_d <- VARselect(dY_ts, lag.max = 4, type = "const")
p_d <- ifelse(is.na(as.integer(sel_d$selection["AIC(n)"])), 2L, as.integer(sel_d$selection["AIC(n)"]))
cat("Rezagos VAR(Δ) (AIC): p_d =", p_d, "\n")
Rezagos VAR(Δ) (AIC): p_d = 1 
Código
var_d <- VAR(dY_ts, p = p_d, type = "const")   # <- 'varest'
cat("\nResumen VAR(Δ):\n"); print(summary(var_d))

Resumen VAR(Δ):

VAR Estimation Results:
========================= 
Endogenous variables: L_PP, L_PIB, L_GG, L_GC, L_GK, L_IF, L_IVA, L_ICE, L_IR 
Deterministic variables: const 
Sample size: 70 
Log Likelihood: -196.861 
Roots of the characteristic polynomial:
0.3844 0.3699 0.3699 0.2873 0.2873 0.2268 0.1286 0.1286 0.1173
Call:
VAR(y = dY_ts, p = p_d, type = "const")


Estimation results for equation L_PP: 
===================================== 
L_PP = L_PP.l1 + L_PIB.l1 + L_GG.l1 + L_GC.l1 + L_GK.l1 + L_IF.l1 + L_IVA.l1 + L_ICE.l1 + L_IR.l1 + const 

          Estimate Std. Error t value Pr(>|t|)  
L_PP.l1   0.006144   0.139235   0.044   0.9649  
L_PIB.l1 -0.270701   0.160059  -1.691   0.0960 .
L_GG.l1   0.050977   0.124205   0.410   0.6830  
L_GC.l1  -0.262953   0.220490  -1.193   0.2377  
L_GK.l1  -0.160439   0.177812  -0.902   0.3705  
L_IF.l1   0.190770   0.162370   1.175   0.2447  
L_IVA.l1 -0.229206   0.182196  -1.258   0.2133  
L_ICE.l1 -0.145232   0.156537  -0.928   0.3572  
L_IR.l1   0.318083   0.179151   1.775   0.0809 .
const    -0.021665   0.060722  -0.357   0.7225  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1


Residual standard error: 0.4629 on 60 degrees of freedom
Multiple R-Squared: 0.1471, Adjusted R-squared: 0.01921 
F-statistic:  1.15 on 9 and 60 DF,  p-value: 0.3431 


Estimation results for equation L_PIB: 
====================================== 
L_PIB = L_PP.l1 + L_PIB.l1 + L_GG.l1 + L_GC.l1 + L_GK.l1 + L_IF.l1 + L_IVA.l1 + L_ICE.l1 + L_IR.l1 + const 

          Estimate Std. Error t value Pr(>|t|)  
L_PP.l1   0.013107   0.117795   0.111   0.9118  
L_PIB.l1 -0.108425   0.135413  -0.801   0.4265  
L_GG.l1   0.139025   0.105079   1.323   0.1908  
L_GC.l1  -0.115211   0.186538  -0.618   0.5392  
L_GK.l1   0.016799   0.150431   0.112   0.9115  
L_IF.l1   0.081897   0.137368   0.596   0.5533  
L_IVA.l1  0.174036   0.154141   1.129   0.2634  
L_ICE.l1 -0.233048   0.132433  -1.760   0.0835 .
L_IR.l1   0.246361   0.151565   1.625   0.1093  
const    -0.009392   0.051372  -0.183   0.8556  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1


Residual standard error: 0.3916 on 60 degrees of freedom
Multiple R-Squared: 0.1263, Adjusted R-squared: -0.004795 
F-statistic: 0.9634 on 9 and 60 DF,  p-value: 0.4789 


Estimation results for equation L_GG: 
===================================== 
L_GG = L_PP.l1 + L_PIB.l1 + L_GG.l1 + L_GC.l1 + L_GK.l1 + L_IF.l1 + L_IVA.l1 + L_ICE.l1 + L_IR.l1 + const 

          Estimate Std. Error t value Pr(>|t|)  
L_PP.l1   0.129842   0.147409   0.881   0.3819  
L_PIB.l1  0.037703   0.169457   0.222   0.8247  
L_GG.l1   0.147612   0.131497   1.123   0.2661  
L_GC.l1   0.106570   0.233435   0.457   0.6497  
L_GK.l1   0.107221   0.188251   0.570   0.5711  
L_IF.l1  -0.006656   0.171903  -0.039   0.9692  
L_IVA.l1  0.329128   0.192893   1.706   0.0931 .
L_ICE.l1  0.083153   0.165728   0.502   0.6177  
L_IR.l1   0.304865   0.189670   1.607   0.1132  
const    -0.023708   0.064287  -0.369   0.7136  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1


Residual standard error: 0.4901 on 60 degrees of freedom
Multiple R-Squared: 0.1326, Adjusted R-squared: 0.002536 
F-statistic: 1.019 on 9 and 60 DF,  p-value: 0.4352 


Estimation results for equation L_GC: 
===================================== 
L_GC = L_PP.l1 + L_PIB.l1 + L_GG.l1 + L_GC.l1 + L_GK.l1 + L_IF.l1 + L_IVA.l1 + L_ICE.l1 + L_IR.l1 + const 

          Estimate Std. Error t value Pr(>|t|)  
L_PP.l1  -0.027326   0.086987  -0.314   0.7545  
L_PIB.l1  0.027759   0.099997   0.278   0.7823  
L_GG.l1   0.000186   0.077597   0.002   0.9981  
L_GC.l1  -0.116962   0.137752  -0.849   0.3992  
L_GK.l1   0.030642   0.111088   0.276   0.7836  
L_IF.l1  -0.157829   0.101441  -1.556   0.1250  
L_IVA.l1  0.025977   0.113827   0.228   0.8203  
L_ICE.l1  0.198581   0.097797   2.031   0.0467 *
L_IR.l1   0.039181   0.111925   0.350   0.7275  
const    -0.069440   0.037936  -1.830   0.0722 .
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1


Residual standard error: 0.2892 on 60 degrees of freedom
Multiple R-Squared: 0.1607, Adjusted R-squared: 0.03475 
F-statistic: 1.276 on 9 and 60 DF,  p-value: 0.2687 


Estimation results for equation L_GK: 
===================================== 
L_GK = L_PP.l1 + L_PIB.l1 + L_GG.l1 + L_GC.l1 + L_GK.l1 + L_IF.l1 + L_IVA.l1 + L_ICE.l1 + L_IR.l1 + const 

         Estimate Std. Error t value Pr(>|t|)
L_PP.l1  -0.01966    0.10528  -0.187    0.852
L_PIB.l1  0.06611    0.12103   0.546    0.587
L_GG.l1  -0.04100    0.09392  -0.437    0.664
L_GC.l1   0.10285    0.16673   0.617    0.540
L_GK.l1  -0.11631    0.13445  -0.865    0.390
L_IF.l1   0.19534    0.12278   1.591    0.117
L_IVA.l1 -0.13374    0.13777  -0.971    0.336
L_ICE.l1 -0.16472    0.11837  -1.392    0.169
L_IR.l1   0.12174    0.13547   0.899    0.372
const    -0.04998    0.04592  -1.088    0.281


Residual standard error: 0.35 on 60 degrees of freedom
Multiple R-Squared: 0.1415, Adjusted R-squared: 0.01277 
F-statistic: 1.099 on 9 and 60 DF,  p-value: 0.3773 


Estimation results for equation L_IF: 
===================================== 
L_IF = L_PP.l1 + L_PIB.l1 + L_GG.l1 + L_GC.l1 + L_GK.l1 + L_IF.l1 + L_IVA.l1 + L_ICE.l1 + L_IR.l1 + const 

         Estimate Std. Error t value Pr(>|t|)
L_PP.l1  -0.09814    0.12374  -0.793    0.431
L_PIB.l1 -0.08250    0.14224  -0.580    0.564
L_GG.l1  -0.11260    0.11038  -1.020    0.312
L_GC.l1  -0.14983    0.19595  -0.765    0.447
L_GK.l1  -0.25196    0.15802  -1.594    0.116
L_IF.l1   0.22234    0.14430   1.541    0.129
L_IVA.l1  0.24038    0.16192   1.485    0.143
L_ICE.l1  0.08121    0.13911   0.584    0.562
L_IR.l1  -0.04844    0.15921  -0.304    0.762
const    -0.04600    0.05396  -0.852    0.397


Residual standard error: 0.4114 on 60 degrees of freedom
Multiple R-Squared: 0.2204, Adjusted R-squared: 0.1035 
F-statistic: 1.885 on 9 and 60 DF,  p-value: 0.07158 


Estimation results for equation L_IVA: 
====================================== 
L_IVA = L_PP.l1 + L_PIB.l1 + L_GG.l1 + L_GC.l1 + L_GK.l1 + L_IF.l1 + L_IVA.l1 + L_ICE.l1 + L_IR.l1 + const 

         Estimate Std. Error t value Pr(>|t|)
L_PP.l1  -0.12070    0.11075  -1.090    0.280
L_PIB.l1  0.19782    0.12732   1.554    0.126
L_GG.l1  -0.02788    0.09880  -0.282    0.779
L_GC.l1   0.15912    0.17539   0.907    0.368
L_GK.l1  -0.11119    0.14144  -0.786    0.435
L_IF.l1   0.03385    0.12916   0.262    0.794
L_IVA.l1  0.18860    0.14493   1.301    0.198
L_ICE.l1  0.03268    0.12452   0.262    0.794
L_IR.l1  -0.14104    0.14251  -0.990    0.326
const    -0.03429    0.04830  -0.710    0.481


Residual standard error: 0.3682 on 60 degrees of freedom
Multiple R-Squared: 0.1624, Adjusted R-squared: 0.03672 
F-statistic: 1.292 on 9 and 60 DF,  p-value: 0.2601 


Estimation results for equation L_ICE: 
====================================== 
L_ICE = L_PP.l1 + L_PIB.l1 + L_GG.l1 + L_GC.l1 + L_GK.l1 + L_IF.l1 + L_IVA.l1 + L_ICE.l1 + L_IR.l1 + const 

         Estimate Std. Error t value Pr(>|t|)  
L_PP.l1   0.11530    0.11148   1.034   0.3052  
L_PIB.l1 -0.07117    0.12816  -0.555   0.5807  
L_GG.l1  -0.08798    0.09945  -0.885   0.3798  
L_GC.l1  -0.07259    0.17654  -0.411   0.6824  
L_GK.l1  -0.20319    0.14237  -1.427   0.1587  
L_IF.l1  -0.11829    0.13001  -0.910   0.3665  
L_IVA.l1  0.31812    0.14588   2.181   0.0331 *
L_ICE.l1 -0.13038    0.12534  -1.040   0.3024  
L_IR.l1   0.06344    0.14344   0.442   0.6599  
const    -0.06346    0.04862  -1.305   0.1968  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1


Residual standard error: 0.3706 on 60 degrees of freedom
Multiple R-Squared: 0.1263, Adjusted R-squared: -0.004702 
F-statistic: 0.9641 on 9 and 60 DF,  p-value: 0.4784 


Estimation results for equation L_IR: 
===================================== 
L_IR = L_PP.l1 + L_PIB.l1 + L_GG.l1 + L_GC.l1 + L_GK.l1 + L_IF.l1 + L_IVA.l1 + L_ICE.l1 + L_IR.l1 + const 

          Estimate Std. Error t value Pr(>|t|)  
L_PP.l1   0.019853   0.097462   0.204   0.8393  
L_PIB.l1 -0.083797   0.112039  -0.748   0.4574  
L_GG.l1  -0.006524   0.086942  -0.075   0.9404  
L_GC.l1  -0.052402   0.154340  -0.340   0.7354  
L_GK.l1   0.012229   0.124466   0.098   0.9221  
L_IF.l1   0.127941   0.113657   1.126   0.2648  
L_IVA.l1 -0.260281   0.127535  -2.041   0.0457 *
L_ICE.l1 -0.006577   0.109574  -0.060   0.9523  
L_IR.l1  -0.022772   0.125403  -0.182   0.8565  
const    -0.034965   0.042504  -0.823   0.4140  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1


Residual standard error: 0.324 on 60 degrees of freedom
Multiple R-Squared: 0.08923,    Adjusted R-squared: -0.04738 
F-statistic: 0.6532 on 9 and 60 DF,  p-value: 0.7471 



Covariance matrix of residuals:
            L_PP     L_PIB      L_GG       L_GC       L_GK      L_IF      L_IVA
L_PP   0.2142737  0.019537  0.024792  0.0385602  0.0003262  0.066916 -0.0272871
L_PIB  0.0195370  0.153364  0.055971 -0.0060646 -0.0080788  0.035731  0.0096208
L_GG   0.0247924  0.055971  0.240173 -0.0075004 -0.0231070 -0.003968 -0.0263040
L_GC   0.0385602 -0.006065 -0.007500  0.0836341 -0.0236269  0.023771  0.0008537
L_GK   0.0003262 -0.008079 -0.023107 -0.0236269  0.1225169 -0.022639 -0.0023202
L_IF   0.0669159  0.035731 -0.003968  0.0237714 -0.0226385  0.169227  0.0631867
L_IVA -0.0272871  0.009621 -0.026304  0.0008537 -0.0023202  0.063187  0.1355797
L_ICE -0.0335923 -0.016986  0.016064 -0.0051152 -0.0121047 -0.024500  0.0048957
L_IR  -0.0173999 -0.011026  0.019756  0.0168764 -0.0151485 -0.003703 -0.0114097
          L_ICE      L_IR
L_PP  -0.033592 -0.017400
L_PIB -0.016986 -0.011026
L_GG   0.016064  0.019756
L_GC  -0.005115  0.016876
L_GK  -0.012105 -0.015149
L_IF  -0.024500 -0.003703
L_IVA  0.004896 -0.011410
L_ICE  0.137370  0.012749
L_IR   0.012749  0.104990

Correlation matrix of residuals:
           L_PP    L_PIB     L_GG      L_GC      L_GK     L_IF     L_IVA
L_PP   1.000000  0.10777  0.10929  0.288047  0.002013  0.35141 -0.160094
L_PIB  0.107773  1.00000  0.29164 -0.053548 -0.058937  0.22180  0.066719
L_GG   0.109288  0.29164  1.00000 -0.052921 -0.134705 -0.01968 -0.145768
L_GC   0.288047 -0.05355 -0.05292  1.000000 -0.233409  0.19982  0.008017
L_GK   0.002013 -0.05894 -0.13470 -0.233409  1.000000 -0.15722 -0.018003
L_IF   0.351407  0.22180 -0.01968  0.199815 -0.157223  1.00000  0.417151
L_IVA -0.160094  0.06672 -0.14577  0.008017 -0.018003  0.41715  1.000000
L_ICE -0.195798 -0.11703  0.08844 -0.047723 -0.093306 -0.16069  0.035873
L_IR  -0.116008 -0.08690  0.12441  0.180101 -0.133567 -0.02778 -0.095632
         L_ICE     L_IR
L_PP  -0.19580 -0.11601
L_PIB -0.11703 -0.08690
L_GG   0.08844  0.12441
L_GC  -0.04772  0.18010
L_GK  -0.09331 -0.13357
L_IF  -0.16069 -0.02778
L_IVA  0.03587 -0.09563
L_ICE  1.00000  0.10616
L_IR   0.10616  1.00000
Código
# Diagnósticos rápidos
cat("\nPortmanteau (autocorrelación):\n"); print(serial.test(var_d, lags.pt = 12, type = "PT.asymptotic"))

Portmanteau (autocorrelación):

    Portmanteau Test (asymptotic)

data:  Residuals of VAR object var_d
Chi-squared = 824.07, df = 891, p-value = 0.9464
$serial

    Portmanteau Test (asymptotic)

data:  Residuals of VAR object var_d
Chi-squared = 824.07, df = 891, p-value = 0.9464
Código
cat("\nARCH (heterocedasticidad):\n");     print(arch.test(var_d, lags.multi = 5))

ARCH (heterocedasticidad):

    ARCH (multivariate)

data:  Residuals of VAR object var_d
Chi-squared = 2925, df = 10125, p-value = 1
$arch.mul

    ARCH (multivariate)

data:  Residuals of VAR object var_d
Chi-squared = 2925, df = 10125, p-value = 1
Código
cat("\nNormalidad (Jarque-Bera multivariante):\n"); print(normality.test(var_d))

Normalidad (Jarque-Bera multivariante):
$JB

    JB-Test (multivariate)

data:  Residuals of VAR object var_d
Chi-squared = 15.505, df = 18, p-value = 0.6271


$Skewness

    Skewness only (multivariate)

data:  Residuals of VAR object var_d
Chi-squared = 6.9774, df = 9, p-value = 0.6395


$Kurtosis

    Kurtosis only (multivariate)

data:  Residuals of VAR object var_d
Chi-squared = 8.5275, df = 9, p-value = 0.482
$jb.mul
$jb.mul$JB

    JB-Test (multivariate)

data:  Residuals of VAR object var_d
Chi-squared = 15.505, df = 18, p-value = 0.6271


$jb.mul$Skewness

    Skewness only (multivariate)

data:  Residuals of VAR object var_d
Chi-squared = 6.9774, df = 9, p-value = 0.6395


$jb.mul$Kurtosis

    Kurtosis only (multivariate)

data:  Residuals of VAR object var_d
Chi-squared = 8.5275, df = 9, p-value = 0.482
Código
# Estabilidad (raíces del VAR(Δ))
mod_roots <- roots(var_d, modulus = TRUE)
cat("\nMódulos de autovalores (VAR(Δ)):\n"); print(round(sort(mod_roots, decreasing = TRUE), 4))

Módulos de autovalores (VAR(Δ)):
[1] 0.3844 0.3699 0.3699 0.2873 0.2873 0.2268 0.1286 0.1286 0.1173
Código
vnames_d <- colnames(var_d$y)
K <- length(vnames_d)

# A: 1 en diagonal; 0 = cero fijo; NA = libre
Amat_d <- diag(1, K); dimnames(Amat_d) <- list(vnames_d, vnames_d)

# ΔL_PP (shock de petróleo) NO recibe contemporáneos del resto:
Amat_d["L_PP", setdiff(vnames_d, "L_PP")] <- 0

# Canales contemporáneos plausibles (libres)
Amat_d["L_PIB","L_PP"] <- NA      # petróleo → PIB
Amat_d["L_GG","L_PIB"] <- NA      # PIB → gasto total
Amat_d["L_GC","L_GG"]  <- NA      # gasto total → gasto corriente
Amat_d["L_GK","L_GG"]  <- NA      # gasto total → gasto capital
Amat_d["L_IF","L_PP"]  <- NA      # petróleo → ingresos fiscales
Amat_d["L_IF","L_IVA"] <- NA      # IVA → ingresos fiscales
Amat_d["L_IF","L_IR"]  <- NA      # IR → ingresos fiscales
Amat_d["L_IF","L_ICE"] <- NA      # ICE → ingresos fiscales
# (todo lo no especificado queda en 0; ajusta NA/0 según tu narrativa)

# B: diagonal (NA para las sd de los shocks), 0 fuera
Bmat_d <- diag(NA, K); dimnames(Bmat_d) <- list(vnames_d, vnames_d)
Bmat_d[row(Bmat_d) != col(Bmat_d)] <- 0

# Estimar SVAR(Δ)
svar_d <- SVAR(var_d, Amat = Amat_d, Bmat = Bmat_d, estmethod = "direct")
cat("\nSVAR(Δ) estimado con éxito.\n")

SVAR(Δ) estimado con éxito.
Código
while (!is.null(dev.list())) dev.off()

# IRF: shock petróleo → PIB
irf_pp_pib_d <- irf(svar_d, impulse = "L_PP", response = "L_PIB",
                    n.ahead = 12, boot = TRUE, ci = 0.95)
png("IRF_SVAR_DIFF_LPP_to_LPIB.png", width = 1400, height = 900, res = 150)
par(mar = c(4,4,2,1)); plot(irf_pp_pib_d); dev.off()
pdf 
  2 
Código
cat("✅ Guardado: IRF_SVAR_DIFF_LPP_to_LPIB.png\n")
✅ Guardado: IRF_SVAR_DIFF_LPP_to_LPIB.png
Código
# IRF: shock petróleo → ingresos fiscales
irf_pp_if_d <- irf(svar_d, impulse = "L_PP", response = "L_IF",
                   n.ahead = 12, boot = TRUE, ci = 0.95)
png("IRF_SVAR_DIFF_LPP_to_LIF.png", width = 1400, height = 900, res = 150)
par(mar = c(4,4,2,1)); plot(irf_pp_if_d); dev.off()
pdf 
  2 
Código
cat("✅ Guardado: IRF_SVAR_DIFF_LPP_to_LIF.png\n")
✅ Guardado: IRF_SVAR_DIFF_LPP_to_LIF.png
Código
# FEVD (12 pasos)
fevd_d <- fevd(svar_d, n.ahead = 12)
png("FEVD_SVAR_DIFF_12.png", width = 1400, height = 900, res = 150)
par(mar = c(4,4,2,1)); plot(fevd_d); dev.off()
pdf 
  2 
Código
cat("✅ Guardado: FEVD_SVAR_DIFF_12.png\n")
✅ Guardado: FEVD_SVAR_DIFF_12.png
Código
# IRFs de petróleo hacia todas las respuestas (lote)
responses <- c("L_PIB","L_GG","L_GC","L_GK","L_IF","L_IVA","L_ICE","L_IR")
for (resp in responses) {
  f <- irf(svar_d, impulse = "L_PP", response = resp, n.ahead = 12, boot = TRUE, ci = 0.95)
  fn <- paste0("IRF_SVAR_DIFF_LPP_to_", resp, ".png")
  png(fn, width = 1400, height = 900, res = 150)
  par(mar = c(4,4,2,1)); plot(f); dev.off()
  cat("✅ Guardado: ", fn, "\n", sep = "")
}
✅ Guardado: IRF_SVAR_DIFF_LPP_to_L_PIB.png
✅ Guardado: IRF_SVAR_DIFF_LPP_to_L_GG.png
✅ Guardado: IRF_SVAR_DIFF_LPP_to_L_GC.png
✅ Guardado: IRF_SVAR_DIFF_LPP_to_L_GK.png
✅ Guardado: IRF_SVAR_DIFF_LPP_to_L_IF.png
✅ Guardado: IRF_SVAR_DIFF_LPP_to_L_IVA.png
✅ Guardado: IRF_SVAR_DIFF_LPP_to_L_ICE.png
✅ Guardado: IRF_SVAR_DIFF_LPP_to_L_IR.png
Código
cat("\n=== FIN: SVAR en diferencias (estacionario) con gráficos exportados ===\n")

=== FIN: SVAR en diferencias (estacionario) con gráficos exportados ===

Forecast

Código
# ===============================
# FORECAST con VAR en diferencias
# ===============================

# Horizonte de pronóstico (trimestres)
h <- 8  # 2 años

# 1) Pronóstico de diferencias (Δlog) con el VAR estacionario
fc_d <- predict(var_d, n.ahead = h, ci = 0.95)

# Extraer medias, límites inferior/superior por variable
vnames_d <- colnames(var_d$y)
dhat_mean <- sapply(vnames_d, function(v) fc_d$fcst[[v]][, "fcst"])
dhat_low  <- sapply(vnames_d, function(v) fc_d$fcst[[v]][, "lower"])
dhat_high <- sapply(vnames_d, function(v) fc_d$fcst[[v]][, "upper"])

# 2) Reconstruir niveles (logs) desde el último dato observado
last_level <- as.numeric(tail(Y_ts, 1))   # vector de 9 niveles (logs) en 2024Q4
names(last_level) <- colnames(Y_ts)

# Función auxiliar: acumula difs para pasar a niveles
rebuild_levels <- function(last_level, diffs_mat) {
  # diffs_mat: h x k (Δlog pronosticadas)
  lev <- matrix(NA_real_, nrow = nrow(diffs_mat), ncol = ncol(diffs_mat))
  colnames(lev) <- colnames(diffs_mat)
  prev <- last_level
  for (t in 1:nrow(diffs_mat)) {
    lev[t, ] <- prev + diffs_mat[t, ]
    prev     <- lev[t, ]
  }
  lev
}

# Niveles pronosticados (punto), y bandas aprox. por acumulación (didáctico)
lev_hat_mean <- rebuild_levels(last_level, dhat_mean)
lev_hat_low  <- rebuild_levels(last_level, dhat_low)
lev_hat_high <- rebuild_levels(last_level, dhat_high)

# 3) Construir fechas futuras (trimestres posteriores a 2024Q4)
#    Reusamos la secuencia "fechas" que ya tienes (2007Q1..2024Q4) y la extendemos
fechas_all <- as.yearqtr(seq(from = as.Date("2007-01-01"), by = "quarter", length.out = T + h))
fechas_fc  <- tail(fechas_all, h)  # fechas pronóstico

# 4) Armar data.frames para exportar a CSV
# a) Pronóstico en diferencias
fc_diff_df <- data.frame(
  fecha_q = fechas_fc,
  as.data.frame(dhat_mean),
  check.names = FALSE
)

# b) Pronóstico en niveles (logs)
fc_level_df <- data.frame(
  fecha_q = fechas_fc,
  as.data.frame(lev_hat_mean),
  check.names = FALSE
)

# 5) Exportar a CSV (carpeta de trabajo actual)
write.csv(fc_diff_df,  "forecast_VARdiff_deltas.csv", row.names = FALSE)
write.csv(fc_level_df, "forecast_VARdiff_levels.csv", row.names = FALSE)
cat("✅ CSV guardados: forecast_VARdiff_deltas.csv, forecast_VARdiff_levels.csv\n")
✅ CSV guardados: forecast_VARdiff_deltas.csv, forecast_VARdiff_levels.csv
Código
# 6) Gráficos exportados (histórico + pronóstico) para 4 variables clave
plot_series_fc <- function(varname, file_png) {
  # Serie histórica (niveles log)
  hist_ts <- Y_ts[, varname]
  # Serie pronosticada (niveles log)
  fc_ts <- ts(lev_hat_mean[, varname],
              start = c(2007 + (T)/4, (T %% 4) + 1),  # arranque inmediatamente después
              frequency = 4)

  # Cierra y abre dispositivo PNG grande para evitar márgenes
  while (!is.null(dev.list())) dev.off()
  png(file_png, width = 1400, height = 900, res = 150)
  par(mar = c(4,4,2,1))
  # Gráfico base del histórico
  plot(hist_ts, type = "l", lwd = 2, xlab = "Trimestre", ylab = "Log(nivel)",
       main = paste("Histórico y Forecast (niveles log) -", varname))
  # Añadir pronóstico
  lines(window(fc_ts, start = tsp(fc_ts)[1]), lwd = 2, lty = 2)
  # Límites (aprox.) de confianza en niveles
  lines(ts(lev_hat_low[, varname],
           start = start(fc_ts), frequency = 4), lty = 3)
  lines(ts(lev_hat_high[, varname],
           start = start(fc_ts), frequency = 4), lty = 3)
  legend("topleft", bty = "n",
         legend = c("Histórico", "Pronóstico (media)", "Banda baja", "Banda alta"),
         lwd = c(2,2,1,1), lty = c(1,2,3,3))
  dev.off()
  cat("✅ Gráfico guardado:", file_png, "\n")
}

# Elige algunas variables representativas para la clase:
for (vn in c("L_PP","L_PIB","L_GG","L_IF")) {
  plot_series_fc(vn, paste0("FC_LEVELS_", vn, ".png"))
}
✅ Gráfico guardado: FC_LEVELS_L_PP.png 
✅ Gráfico guardado: FC_LEVELS_L_PIB.png 
✅ Gráfico guardado: FC_LEVELS_L_GG.png 
✅ Gráfico guardado: FC_LEVELS_L_IF.png 
Código
# 7) (Opcional) Si quieres pronóstico en diferencias (Δlog) también en PNG:
plot_series_fc_diff <- function(varname, file_png) {
  while (!is.null(dev.list())) dev.off()
  png(file_png, width = 1400, height = 900, res = 150)
  par(mar = c(4,4,2,1))
  plot(dY_ts[, varname], type = "l", lwd = 2, xlab = "Trimestre", ylab = "Δ log",
       main = paste("Histórico Δlog y Forecast -", varname))
  lines(ts(dhat_mean[, varname],
           start = c(2007 + (T)/4, (T %% 4) + 1), frequency = 4), lwd = 2, lty = 2)
  lines(ts(dhat_low[, varname],
           start = c(2007 + (T)/4, (T %% 4) + 1), frequency = 4), lty = 3)
  lines(ts(dhat_high[, varname],
           start = c(2007 + (T)/4, (T %% 4) + 1), frequency = 4), lty = 3)
  legend("topleft", bty = "n",
         legend = c("Δlog histórico", "Δlog pronóstico (media)", "Banda baja", "Banda alta"),
         lwd = c(2,2,1,1), lty = c(1,2,3,3))
  dev.off()
  cat("✅ Gráfico guardado:", file_png, "\n")
}

for (vn in c("L_PP","L_PIB","L_GG","L_IF")) {
  plot_series_fc_diff(vn, paste0("FC_DIFF_", vn, ".png"))
}
✅ Gráfico guardado: FC_DIFF_L_PP.png 
✅ Gráfico guardado: FC_DIFF_L_PIB.png 
✅ Gráfico guardado: FC_DIFF_L_GG.png 
✅ Gráfico guardado: FC_DIFF_L_IF.png 
Código
cat("\n=== FORECAST listo: CSV + PNG exportados ===\n")

=== FORECAST listo: CSV + PNG exportados ===