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
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.
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.