Causalidade de Granger

A causalidade de Granger faz uma pergunta puramente preditiva: o passado de uma série temporal ajuda a prever outra, além do que o próprio passado dessa série já diz? Este post se aprofunda na breve menção do post do modelo VAR, percorrendo manualmente o teste F restrito-vs-irrestrito e mostrando exatamente por que o teste consegue detectar uma relação preditiva real e assimétrica.

Regressão restrita vs irrestrita

Para testar se \(x\) causa no sentido de Granger \(y\) na defasagem \(p\), compare duas regressões encaixadas de \(y\) sobre seu próprio passado:

\[\text{Restrita: } y_t = \alpha + \sum_{i=1}^p \beta_i y_{t-i} + \varepsilon_t\] \[\text{Irrestrita: } y_t = \alpha + \sum_{i=1}^p \beta_i y_{t-i} + \sum_{j=1}^p \gamma_j x_{t-j} + u_t\]

\[H_0: \gamma_1 = \gamma_2 = \cdots = \gamma_p = 0 \quad (x \text{ não causa no sentido de Granger } y)\]

Teste \(H_0\) com um teste F comparando o quanto a soma dos quadrados residual cai quando as defasagens de \(x\) são adicionadas:

\[F = \frac{(SQR_r - SQR_u)/q}{SQR_u/(n-k)}\]

em que \(q\) é o número de restrições (as \(p\) defasagens de \(x\) removidas) e \(k\) é o número de parâmetros no modelo irrestrito.

Exemplo resolvido: x realmente determina y?

Construir a assimetria diretamente na simulação, \(x\) determina \(y\) mas nunca o contrário, permite verificar que testar ambas as direções de fato recupera essa relação unidirecional.

Duas séries simuladas com uma relação assimétrica conhecida

Simule duas séries em que \(x\) de fato determina \(y\) com uma defasagem de um período, e \(y\) NÃO determina \(x\), então o teste deveria detectar corretamente a assimetria:

set.seed(1)
T <- 100
x <- numeric(T); y <- numeric(T)
for (t in 2:T) x[t] <- 0.5 * x[t-1] + rnorm(1)
for (t in 3:T) y[t] <- 0.3 * y[t-1] + 0.5 * x[t-1] + rnorm(1)

Testando a defasagem 1 sobre as observações \(t=3,\ldots,100\) (\(n=98\)):

Modelo restrito: \(\hat y_t = 0{,}094 + 0{,}339\, y_{t-1}\), \(SQR_r = 107{,}80\), \(gl\) residual \(= 96\).

Modelo irrestrito: \(\hat y_t = -0{,}019 + 0{,}303\, y_{t-1} + 0{,}446\, x_{t-1}\), \(SQR_u = 89{,}47\), \(gl\) residual \(= 95\).

\[F = \frac{(107{,}80 - 89{,}47)/1}{89{,}47/95} = \frac{18{,}33}{0{,}9418} = 19{,}46\]

\(gl = (1, 95)\), \(p = 2{,}71 \times 10^{-5}\). Decisão: rejeitamos \(H_0\), \(x\) causa no sentido de Granger \(y\).

Agora testamos a direção REVERSA (\(y\) causa no sentido de Granger \(x\)?), mesmos dados, mesma defasagem: \(F = 1{,}17\), \(gl = (1, 95)\), \(p = 0{,}282\). Decisão: não rejeitamos \(H_0\), nenhuma evidência de que \(y\) causa no sentido de Granger \(x\), correspondendo corretamente ao processo gerador de dados real (apenas \(x\) determinava \(y\), nunca o contrário).

lmtest::grangertest() executado sobre os mesmos dados reproduz isso de forma muito próxima (direção direta: \(F \approx 19{,}67\), \(p \approx 2{,}45 \times 10^{-5}\); direção reversa: \(F = 1{,}17\), \(p = 0{,}282\)); a pequena diferença numérica em relação aos cálculos manuais se deve apenas a como a função auxiliar alinha internamente a amostra defasada, não a um desacordo real.

Example icon

Duas séries temporais simuladas x e y, mostrando y tendendo a seguir x com uma defasagem de um período

Visualmente, picos em \(x\) tendem a ser ecoados em \(y\) um passo depois, exatamente a dependência defasada que o teste F capta.

Estendendo para um framework VAR completo

Na prática, a causalidade de Granger é normalmente testada dentro de um modelo VAR já ajustado com vars::causality(), que já cobre a estimação do VAR, a seleção de defasagem por AIC/BIC, funções impulso-resposta, e a decomposição da variância do erro de previsão. O exemplo de duas séries com uma única defasagem acima é o caso mais simples dessa mesma lógica de teste F subjacente, generalizada em um VAR para qualquer número de variáveis e defasagens de uma vez.

⚠️ A causalidade de Granger testa previsibilidade, não causalidade real

A causalidade de Granger informa que \(x\) contém informação que melhora a previsão de \(y\). Ela NÃO estabelece que mudar \(x\) mudaria \(y\). Contraexemplos clássicos: uma terceira variável confundidora determinando ambas as séries independentemente, ou causalidade reversa por antecipação, os preços de ações podem parecer “causar no sentido de Granger” os anúncios de resultados de uma empresa simplesmente porque os mercados precificam expectativas antes do anúncio, não porque os preços causam os resultados.

Ambas as séries também devem ser estacionárias antes de executar o teste, ou devidamente cointegradas e modeladas via um VECM, caso contrário a distribuição de referência do teste F é inválida. Sempre verifique primeiro com o teste de Dickey-Fuller e o post geral sobre estacionariedade.

Executando o teste em R

O teste F manual acima pode ser reproduzido diretamente, e verificado, com lmtest::grangertest():

set.seed(1)
T <- 100
x <- numeric(T); y <- numeric(T)
for (t in 2:T) x[t] <- 0.5 * x[t-1] + rnorm(1)
for (t in 3:T) y[t] <- 0.3 * y[t-1] + 0.5 * x[t-1] + rnorm(1)

library(lmtest)
grangertest(y ~ x, order = 1)   # does x Granger-cause y?
grangertest(x ~ y, order = 1)   # does y Granger-cause x?

# Inside a fitted VAR model
library(vars)
fit <- VAR(cbind(x, y), p = 1, type = "const")
causality(fit, cause = "x")

💡 Escolha a ordem de defasagem com cuidado, e sempre teste as duas direções

A ordem de defasagem \(p\) para o teste de Granger deve ser escolhida da mesma forma que a seleção de defasagem do VAR: por AIC ou BIC (veja o post do modelo VAR). Sempre teste AMBAS as direções, como feito no exemplo resolvido acima. Sistemas reais são frequentemente assimétricos, \(x\) pode causar no sentido de Granger \(y\) sem que \(y\) cause no sentido de Granger \(x\), exatamente como mostrado aqui, e testar apenas uma direção arrisca perder essa assimetria completamente.