O teste de Causalidade de Granger é aplicado para examinar se uma série tempotal (TIme Series - TS) pode ser utilizada para prever outra (Cenarização). A Hipótese nula é de que o valor de input (X) não é capaz de prever o output (Y). Já a hipótese alternativa afirma que X pode sim implicar em Y.

A causalidade de Grander visa conhecer se o valor de uma TS X com uma dada defasagen (lag) permite conhecer a TS Y.

O teste gera um teste F com seu p-valor associado. Quando P for menor que o nível de significância definido (Ec.: = 0.05) é possível rejeitar H1 e afirmar que X causa Y.

A função em R é dada por grangertest(X, Y, order = 1) sendo X a TS explicativa e Y a TS gerada e order consiste na defasagem aplicada.

Inicialmente realiza-se a carga de dados. Para este exemplo será utilizado o data set EuStockMarkets que apresenta os preços de fechamento diário dos principais indices de ações européias.
* Alemanha DAX (Ibis)
* Suíça SMI
* França CAC
* Reino Unido FTSE

ts = EuStockMarkets[, 1:2]
head(ts)
##          DAX    SMI
## [1,] 1628.75 1678.1
## [2,] 1613.63 1688.5
## [3,] 1606.51 1678.6
## [4,] 1621.04 1684.1
## [5,] 1618.16 1686.6
## [6,] 1610.61 1671.6

Visualização dos dados

library(plotly)
## Loading required package: ggplot2
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
library(tidyr)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
stocks <- as.data.frame(EuStockMarkets) %>%
  gather(index, price) %>%
  mutate(time = rep(time(EuStockMarkets), 4))
plot_ly(stocks, x = ~time, y = ~price, color = ~index, mode = "lines")
## No trace type specified:
##   Based on info supplied, a 'scatter' trace seems appropriate.
##   Read more about this trace type -> https://plotly.com/r/reference/#scatter

O teste pode ser aplicado utilizando a função grangertest do pacote lmtest

library(lmtest)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric

Inicialmente define-se a direção de causalidade e aplica-se o teste. No primeiro exemplo se bisca saber se SMI explica DAX aplicando 3 defasagens diferentes:

res = grangertest(DAX~SMI, order= 3, data = ts)

Granger causality test

Model 1: DAX ~ Lags(DAX, 1:3) + Lags(SMI, 1:3)
Model 2: DAX ~ Lags(DAX, 1:3)
Res.Df Df F Pr(>F)
1 1850
2 1853 -3 8.4968 1.322e-05 ***

Signif. codes: 0 ‘’ 0.001 ‘’ 0.01 ‘’ 0.05 ‘.’ 0.1 ‘ ’ 1

Interpretação

Model 1: Busca verificar os valores de DAX aplicamco a composição de 3 defasagens de DAX e SMI. Model 2: Busca verificar os valores de DAX aplicamco somento as 3 defasagens de DAX. NEste

Por fim inverte-se a ordem de causalidade

res = grangertest(SMI~DAX, order= 3, data = ts)

Granger causality test

Model 1: SMI ~ Lags(SMI, 1:3) + Lags(DAX, 1:3)
Model 2: SMI ~ Lags(SMI, 1:3)
Res.Df Df F Pr(>F)
1 1850
2 1853 -3 2.6576 0.04689 *

Signif. codes: 0 ‘’ 0.001 ‘’ 0.01 ‘’ 0.05 ‘.’ 0.1 ‘ ’ 1

Percebe-se que ambos os testes são significativos, embora SMI explique muito mais sobre DAX.

Analisando dados em que as relações inversar não implicam em causas

Dados relativos ao número de ovos e galinhas nos EUA entre 1930 e 1983.

data(ChickEgg)
head(ChickEgg)
##      chicken  egg
## [1,]  468491 3581
## [2,]  449743 3532
## [3,]  436815 3327
## [4,]  444523 3255
## [5,]  433937 3156
## [6,]  389958 3081

Replicando o mesmo modelo

grangertest(chicken ~ egg, order = 3, data = ChickEgg)

Granger causality test

Model 1: chicken ~ Lags(chicken, 1:3) + Lags(egg, 1:3)
Model 2: chicken ~ Lags(chicken, 1:3)
Res.Df Df F Pr(>F)
1 44
2 47 -3 5.405 0.002966 **

grangertest(egg ~ chicken, order = 3, data = ChickEgg)

Granger causality test

Model 1: egg ~ Lags(egg, 1:3) + Lags(chicken, 1:3)
Model 2: egg ~ Lags(egg, 1:3)
Res.Df Df F Pr(>F)
1 44
2 47 -3 0.5916 0.6238

Parcebam que o modelo chicken ~ egg possui \(p < 0.05\) permitindo rejeitar a hipótese nula, enquanto que o modelo egg ~chicken possui \(p > 0.05\) não permitindo rejeitar a hipótese nula.
Dessa forma é possível assumir que o número de ovos permite prever o número de galinhas, enquanto que o contrário não é verdadeiro.