Modelos VEC

Resumo

Este tutorial oferece uma abordagem prática para a estimação e análise de Modelos de Correção de Erros Vetoriais (VEC), uma extensão dos modelos VAR aplicada a séries temporais cointegradas. Utilizando dados simulados de PIB e Taxa de Juros, abordaremos os Testes de Cointegração de Engle-Granger e Johansen, além de elementos fundamentais para a construção de um modelo VEC, como testes de raiz unitária e interpretação de parâmetros de cointegração.

1 Resumo

O Modelo de Correção de Erros Vetoriais (VEC) é uma forma restrita do modelo VAR que incorpora relações de longo prazo entre variáveis cointegradas. Em séries temporais econômicas, a cointegração permite capturar dependências de longo prazo entre variáveis, enquanto o modelo VEC ajusta variações de curto prazo em torno dessas relações. O VEC é particularmente útil em análise econômica e financeira, onde relações de longo prazo entre variáveis, como PIB e Taxa de Juros, podem ser exploradas.

2 Preparação do Ambiente

# Instalação e carregamento dos pacotes necessários
# install.packages("vars")
# install.packages("urca")
# install.packages("tseries")
# install.packages("ggplot2")

library(vars)
library(urca)     # Para o teste de Johansen
library(tseries)  # Para o teste de Engle-Granger
library(ggplot2)
library(forecast)

3 Gerando e Visualizando os Dados

Simularemos séries de PIB e Taxa de Juros que apresentem uma relação de longo prazo. Em um modelo VEC, as séries precisam ser não estacionárias, mas cointegradas.

set.seed(123)
n <- 100

# Simulando séries cointegradas para PIB e Taxa de Juros
pib <- cumsum(rnorm(n, mean=0.5, sd=1))
taxa_juros <- 0.4 * pib + rnorm(n, mean=0, sd=1)

# Convertendo para séries temporais
pib_ts <- ts(pib, start=c(2000, 1), frequency=4)
taxa_juros_ts <- ts(taxa_juros, start=c(2000, 1), frequency=4)

# Criando um índice de tempo
tempo <- 1:n

# Visualizando as séries
autoplot(pib_ts) + 
  ggtitle("PIB Simulado") + 
  ylab("PIB") + 
  xlab("Ano")

autoplot(taxa_juros_ts) + 
  ggtitle("Taxa de Juros Simulada") + 
  ylab("Taxa de Juros") + 
  xlab("Ano")

4 Teste de Raiz Unitária

Antes de verificar a cointegração, devemos assegurar que ambas as séries são não estacionárias. Utilizaremos o Teste ADF (Augmented Dickey-Fuller) e o KPSS para avaliar a presença de uma raiz unitária em cada série.

# Teste ADF para a série PIB
adf_test_pib <- adf.test(pib_ts)
print(adf_test_pib)

    Augmented Dickey-Fuller Test

data:  pib_ts
Dickey-Fuller = -1.8871, Lag order = 4, p-value = 0.6234
alternative hypothesis: stationary
# Teste KPSS para a série PIB
kpss_test_pib <- kpss.test(pib_ts)
print(kpss_test_pib)

    KPSS Test for Level Stationarity

data:  pib_ts
KPSS Level = 2.087, Truncation lag parameter = 4, p-value = 0.01
# Teste ADF para a série Taxa de Juros
adf_test_taxa_juros <- adf.test(taxa_juros_ts)
print(adf_test_taxa_juros)

    Augmented Dickey-Fuller Test

data:  taxa_juros_ts
Dickey-Fuller = -2.5415, Lag order = 4, p-value = 0.3523
alternative hypothesis: stationary
# Teste KPSS para a série Taxa de Juros
kpss_test_taxa_juros <- kpss.test(taxa_juros_ts)
print(kpss_test_taxa_juros)

    KPSS Test for Level Stationarity

data:  taxa_juros_ts
KPSS Level = 2.084, Truncation lag parameter = 4, p-value = 0.01

Se o p-valor do teste ADF for alto, não rejeitamos a hipótese nula de raiz unitária, indicando que as séries são não estacionárias.

5 Testes de Cointegração

Para verificar a existência de uma relação de longo prazo entre as séries, aplicaremos dois testes de cointegração:

5.1 Teste de Engle-Granger

Este teste examina a cointegração em sistemas de duas variáveis, ajustando uma regressão entre elas e testando a estacionariedade dos resíduos.

# Regressão de cointegração entre PIB e Taxa de Juros e tempo
modelo_engle <- lm(taxa_juros_ts ~ pib_ts + tempo)
summary(modelo_engle)

Call:
lm(formula = taxa_juros_ts ~ pib_ts + tempo)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.9249 -0.6520 -0.0692  0.6005  3.2550 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -0.27187    0.19386  -1.402    0.164    
pib_ts       0.32608    0.05100   6.394 5.68e-09 ***
tempo        0.04383    0.02823   1.553    0.124    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.962 on 97 degrees of freedom
Multiple R-squared:  0.979, Adjusted R-squared:  0.9786 
F-statistic:  2260 on 2 and 97 DF,  p-value: < 2.2e-16
# Regressão de cointegração entre PIB e Taxa de Juros sem o tempo
modelo_engle <- lm(taxa_juros_ts ~ pib_ts)
summary(modelo_engle)

Call:
lm(formula = taxa_juros_ts ~ pib_ts)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.9037 -0.6762 -0.0980  0.5711  3.3168 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -0.238264   0.194035  -1.228    0.222    
pib_ts       0.404715   0.006064  66.741   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.9689 on 98 degrees of freedom
Multiple R-squared:  0.9785,    Adjusted R-squared:  0.9783 
F-statistic:  4454 on 1 and 98 DF,  p-value: < 2.2e-16
# Teste de Engle-Granger sobre os resíduos
residuos <- resid(modelo_engle)
adf_test_residuos <- adf.test(residuos)
print(adf_test_residuos)

    Augmented Dickey-Fuller Test

data:  residuos
Dickey-Fuller = -4.6834, Lag order = 4, p-value = 0.01
alternative hypothesis: stationary

Se o p-valor do teste ADF sobre os resíduos for baixo, rejeitamos a hipótese nula de raiz unitária, sugerindo cointegração.

5.2 Teste de Johansen

O teste de Johansen é uma técnica estatística para testar e determinar a presença de vetores de cointegração em um conjunto de séries temporais não estacionárias. Esse teste é essencial em modelos de correção de erros vetoriais (VEC), pois permite identificar as relações de longo prazo entre as variáveis. Ao contrário do teste de Engle-Granger, que analisa apenas duas variáveis, o teste de Johansen é adequado para sistemas multivariados, sendo capaz de detectar múltiplos vetores de cointegração.

Portanto, para sistemas multivariados, o Teste de Johansen é mais robusto, pois permite detectar múltiplos vetores de cointegração. Utilizaremos o método de traço e o valor próprio máximo para determinar o número de vetores de cointegração.

5.2.1 Principais Conceitos do Teste de Johansen

5.2.1.1 Vetores de Cointegração

Em um sistema de variáveis não estacionárias, um vetor de cointegração representa uma combinação linear entre as variáveis que resulta em uma série estacionária. Isso indica uma relação de longo prazo entre as variáveis, onde desvios dessa relação tendem a ser corrigidos ao longo do tempo.

5.2.1.2 Traço e Autovalores

O teste de Johansen utiliza dois métodos estatísticos principais: o método do traço (trace test) e o método do valor próprio máximo (maximum eigenvalue test). Ambos os métodos são baseados nos autovalores (ou eigenvalues), que representam a força das relações de cointegração. Se os autovalores forem altos, há uma evidência mais forte de cointegração.

5.2.1.3 Método do Traço (Trace Test)

O traço é uma estatística que testa a hipótese de que o número de vetores de cointegração é igual a um valor específico (por exemplo, zero) contra a hipótese alternativa de que o número de vetores é maior. A estatística do traço é calculada somando os logaritmos dos autovalores restantes, começando de uma posição específica.

O valor do traço é comparado com valores críticos: se o valor do traço é maior que o valor crítico, rejeitamos a hipótese nula de que o número de vetores de cointegração é igual a esse valor específico.

5.2.1.4 Método do Valor Próprio Máximo (Maximum Eigenvalue Test)

Esse método compara cada autovalor individualmente e testa a hipótese de que o número de vetores de cointegração é igual a \(𝑟\)contra a hipótese alternativa de que o número é \(𝑟+ 1\).

Assim como no teste do traço, o valor do teste é comparado a valores críticos para determinar se a hipótese nula deve ser rejeitada.

# Teste de Johansen para cointegração
johansen_test <- ca.jo(cbind(pib_ts, taxa_juros_ts), type="trace", K=2, ecdet="const")
summary(johansen_test)

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

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

Eigenvalues (lambda):
[1] 4.133734e-01 2.377816e-01 3.330669e-16

Values of teststatistic and critical values of test:

          test 10pct  5pct  1pct
r <= 1 | 26.61  7.52  9.24 12.97
r = 0  | 78.88 17.85 19.96 24.60

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

                  pib_ts.l2 taxa_juros_ts.l2    constant
pib_ts.l2         1.0000000         1.000000   1.0000000
taxa_juros_ts.l2 -2.4697935        -2.373120  -0.6570318
constant         -0.8235868         8.429479 -20.4201096

Weights W:
(This is the loading matrix)

                 pib_ts.l2 taxa_juros_ts.l2      constant
pib_ts.d        -0.1098384       0.05878889 -4.969137e-19
taxa_juros_ts.d  0.4570465       0.03512298  5.681243e-16

A partir dos resultados, determinamos o número de vetores de cointegração e confirmamos a adequação do modelo VEC.

A função cajorls retorna o modelo VEC estimado, e o resumo (summary(vec_model$rlm)) mostra os coeficientes de curto prazo e o coeficiente de ajuste de longo prazo.

O teste do traço indica a presença de um vetor de cointegração, pois o valor da estatística do traço para \(𝑟= 0 (78.88)\) é maior do que o valor crítico de \(19.96\) no nível de significância de \(5\%\).

Para \(𝑟≤ 1\), o valor do traço é \(26.61\), também maior do que o valor crítico para esse nível de cointegração, o que confirma a presença de um vetor de cointegração.

6 Estimando o Modelo VEC

Após confirmar a cointegração, ajustaremos o modelo VEC. O número de defasagens é selecionado com base nos critérios de informação (AIC, BIC).

# Ajustando o modelo VEC com 1 vetor de cointegração
vec_model <- cajorls(johansen_test, r = 1)  # r é o número de vetores de cointegração
summary(vec_model$rlm)
Response pib_ts.d :

Call:
lm(formula = pib_ts.d ~ ect1 + pib_ts.dl1 + taxa_juros_ts.dl1 - 
    1, data = data.mat)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.8877 -0.2752  0.3432  0.9079  3.0269 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)  
ect1              -0.10984    0.06764  -1.624   0.1077  
pib_ts.dl1         0.23378    0.10726   2.179   0.0318 *
taxa_juros_ts.dl1  0.10475    0.11077   0.946   0.3467  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.049 on 95 degrees of freedom
Multiple R-squared:  0.1079,    Adjusted R-squared:  0.07977 
F-statistic: 3.832 on 3 and 95 DF,  p-value: 0.01224


Response taxa_juros_ts.d :

Call:
lm(formula = taxa_juros_ts.d ~ ect1 + pib_ts.dl1 + taxa_juros_ts.dl1 - 
    1, data = data.mat)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.8779 -0.4798  0.1525  0.9759  3.0326 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
ect1               0.45705    0.06848   6.674 1.65e-09 ***
pib_ts.dl1         0.61800    0.10859   5.691 1.40e-07 ***
taxa_juros_ts.dl1 -1.09469    0.11214  -9.762 5.33e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.062 on 95 degrees of freedom
Multiple R-squared:  0.5117,    Adjusted R-squared:  0.4963 
F-statistic: 33.18 on 3 and 95 DF,  p-value: 9.238e-15

6.1 Análise do Modelo VEC

6.1.1 Parâmetro de Ajuste (Erro de Correção)

O coeficiente de ajuste (também conhecido como parâmetro de erro de correção) indica a velocidade com que as variáveis voltam ao equilíbrio de longo prazo após um choque. Coeficientes significativos sugerem que o desequilíbrio de longo prazo é corrigido ao longo do tempo.

# Coeficientes de erro de correção
vec_model$rlm$coefficients
                    pib_ts.d taxa_juros_ts.d
ect1              -0.1098384       0.4570465
pib_ts.dl1         0.2337798       0.6180029
taxa_juros_ts.dl1  0.1047512      -1.0946935

6.1.2 Funções de Resposta ao Impulso (IRF)

As Funções de Resposta ao Impulso (IRF) mostram o impacto dinâmico de choques nas variáveis dentro do VEC.

# Convertendo o modelo VEC para VAR para calcular as IRFs
var_model_from_vec <- vec2var(johansen_test, r = 1)
irf_vec <- irf(var_model_from_vec, impulse = "pib_ts", response = "taxa_juros_ts", n.ahead = 10, boot = TRUE)

# Plotando IRF
plot(irf_vec)

6.1.3 Decomposição da Variância (FEVD)

A decomposição da variância indica quanto da variância de previsão de uma variável pode ser explicada por choques nas outras variáveis do sistema.

# Decomposição da Variância para o VEC
fevd_vec <- fevd(var_model_from_vec, n.ahead = 10)
plot(fevd_vec)

7 Previsão com o Modelo VEC

O modelo VEC pode ser usado para realizar previsões, incorporando as restrições de cointegração no longo prazo.

# Previsão para os próximos 10 períodos
forecast_vec <- predict(var_model_from_vec, n.ahead = 10)

# Plotando a previsão para o PIB e Taxa de Juros
forecast_data <- data.frame(
  Period = time(forecast_vec$fcst$pib_ts[, "fcst"]),
  PIB_Forecast = forecast_vec$fcst$pib_ts[, "fcst"],
  PIB_Lower = forecast_vec$fcst$pib_ts[, "lower"],
  PIB_Upper = forecast_vec$fcst$pib_ts[, "upper"],
  Juros_Forecast = forecast_vec$fcst$taxa_juros_ts[, "fcst"],
  Juros_Lower = forecast_vec$fcst$taxa_juros_ts[, "lower"],
  Juros_Upper = forecast_vec$fcst$taxa_juros_ts[, "upper"]
)

# Plotando previsões com ggplot2
ggplot(forecast_data, aes(x = Period)) +
  geom_line(aes(y = PIB_Forecast, color = "PIB Previsão"), size = 1) +
  geom_ribbon(aes(ymin = PIB_Lower, ymax = PIB_Upper, fill = "Intervalo de Confiança PIB"), alpha = 0.2) +
  labs(title = "Previsão do PIB para os Próximos 10 Períodos",
       y = "Previsão PIB", x = "Período") +
  theme_minimal()

ggplot(forecast_data, aes(x = Period)) +
  geom_line(aes(y = Juros_Forecast, color = "Taxa de Juros Previsão"), size = 1) +
  geom_ribbon(aes(ymin = Juros_Lower, ymax = Juros_Upper, fill = "Intervalo de Confiança Juros"), alpha = 0.2) +
  labs(title = "Previsão da Taxa de Juros para os Próximos 10 Períodos",
       y = "Previsão Taxa de Juros", x = "Período") +
  theme_minimal()

8 Considerações Finais

Este tutorial apresentou a aplicação de modelos VEC para analisar relações de longo prazo em séries temporais cointegradas, cobrindo testes de cointegração, estimação do modelo, e análise de impulsos e variância. A metodologia é poderosa para capturar tanto as relações de curto quanto de longo prazo entre variáveis econômicas.

A escolha do número de vetores de cointegração e a interpretação dos parâmetros estruturais são pontos fundamentais para garantir a precisão dos modelos VEC em análises econômicas complexas. Ao trabalhar com VEC, é essencial validar a existência de cointegração e verificar os resultados com diferentes métodos, assegurando que as inferências sejam robustas.