Testes de raiz unitária
Os autores deste blog foram confrontados com uma pergunta sobre o uso de testes de raiz unitária. Em linhas gerais, a pessoa já tinha passado o filtro Hodrick Prescott e o teste continuava indicando a presença de raiz unitária. Deveria este economista sentar e chorar? Ou continuar diferenciando a série?
Neste post vamos mostrar que o teste Dickey-Fuller (ADF) - padrão para testar presença de raiz unitária - tem poder baixo se (1) o processo tem uma raiz próxima de unitária e (2) a amostra é pequena. Infelizmente, este caso é frequente em macroeconomia.
Neste exemplo eu usarei um AR(1) (\(y_t = \phi y_{t-1} + u_t\)), onde \(u_t \sim N(0,\sigma)\). Como eu vou querer brincar com processos AR com coeficientes diferentes e tamanhos de amostra diferente, eu vou criar uma função que gera processos AR:
set.seed(2018)
sim_ar <- function(n,phi,sd=1){
y <- rep(0,n+1000)
u <- rnorm(n+1000, sd = sd)
for(i in 2:(n+1000)){
y[i] <- phi*y[i-1]+u[i]
}
y <- y[1000:(1000+n)]
return(y)
}
Eu sempre gero 1000 observações extras para o processo não depender da condição inicial.
Eu usarei o teste ADF que vem no pacote urca (nenhuma relação com o bairro do Rio de Janeiro):
library(urca)
Vamos simular um processo sem raiz unitária usando a função e ver o resultado do teste ADF. Veja que a hipótese nula do teste ADF é de presença de raiz unitária. Eu vou colocar um coeficiente baixo (0.6) e uma amostra grande (mil observações):
y <- sim_ar(1000,0.6)
summary(ur.df(y))
##
## ###############################################
## # Augmented Dickey-Fuller Test Unit Root Test #
## ###############################################
##
## Test regression none
##
##
## Call:
## lm(formula = z.diff ~ z.lag.1 - 1 + z.diff.lag)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.1388 -0.6732 -0.0472 0.6507 3.4355
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## z.lag.1 -0.405838 0.028525 -14.228 <2e-16 ***
## z.diff.lag 0.004896 0.031798 0.154 0.878
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.9987 on 997 degrees of freedom
## Multiple R-squared: 0.2011, Adjusted R-squared: 0.1995
## F-statistic: 125.5 on 2 and 997 DF, p-value: < 2.2e-16
##
##
## Value of test-statistic is: -14.2276
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau1 -2.58 -1.95 -1.62
O teste tem valores críticos diferentes dos usuais, que são apresentados embaixo dos valores da regressão. Vamos usar o usual 5% de nível de significância. Veja que o valor do teste está bem abaixo do valor crítico e portanto, não temos nenhuma indicação de termos raiz unitária.
O que acontece, entretanto, se usarmos um horizonte mais curto e um coeficiente mais alto? Eu vou repetir o exercício com 100 observações e um coeficiente de 0.9:
y <- sim_ar(100,0.9)
summary(ur.df(y))
##
## ###############################################
## # Augmented Dickey-Fuller Test Unit Root Test #
## ###############################################
##
## Test regression none
##
##
## Call:
## lm(formula = z.diff ~ z.lag.1 - 1 + z.diff.lag)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.51636 -0.59022 0.02518 0.68276 2.70909
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## z.lag.1 -0.06383 0.03649 -1.749 0.0834 .
## z.diff.lag 0.21727 0.10107 2.150 0.0341 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.077 on 97 degrees of freedom
## Multiple R-squared: 0.06135, Adjusted R-squared: 0.04199
## F-statistic: 3.17 on 2 and 97 DF, p-value: 0.0464
##
##
## Value of test-statistic is: -1.7493
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau1 -2.58 -1.95 -1.62
Agora, não rejeitamos a hipótese nula de presença de raiz unitária a 5%. Obviamente não podemos fazer inferência com uma única tentativa, então vamos replicar isso 5000 vezes. Mais ainda, eu vou testar diferentes combinações de tamanhos de amostra e coeficientes:
- 100 observações e \(\phi = 0.5\)
- 100 observações e \(\phi = 0.9\)
- 100 observações e \(\phi = 0.95\)
- 200 observações e \(\phi = 0.95\)
- 500 observações e \(\phi = 0.99\)
Em todas elas eu vou avaliar se o valor do teste é menor que o valor crítico a 5% (que é -1.95).
test1 <- rep(0,5000)
test2 <- test1
test3 <- test1
test4 <- test1
test5 <- test1
for(j in 1:5000){
y_1 <- sim_ar(100,0.5)
y_2 <- sim_ar(100,0.9)
y_3 <- sim_ar(200,0.95)
y_4 <- sim_ar(500,0.99)
y_5 <- sim_ar(100,0.95)
test1[j] <- ur.df(y_1)@teststat < -1.95
test2[j] <- ur.df(y_2)@teststat < -1.95
test3[j] <- ur.df(y_3)@teststat < -1.95
test4[j] <- ur.df(y_4)@teststat < -1.95
test5[j] <- ur.df(y_5)@teststat < -1.95
}
tabela <- c(mean(test1),
mean(test2),
mean(test5),
mean(test3),
mean(test4))
phi = '\u03d5' #pro phi ficar bonito
names(tabela) <- c(paste("n = 100,", phi, "= 0.5"),paste("n = 100,", phi, "= 0.9"),paste("n = 100,", phi, "= 0.95"),paste("n = 200,", phi, "= 0.95"),paste("n = 500,", phi, "= 0.99"))
knitr::kable(tabela, col.names = c("Proporção de rejeição de H0, significância 5%"),escape = F)
Proporção de rejeição de H0, significância 5% | |
---|---|
n = 100, ϕ = 0.5 | 1.0000 |
n = 100, ϕ = 0.9 | 0.7582 |
n = 100, ϕ = 0.95 | 0.3532 |
n = 200, ϕ = 0.95 | 0.7708 |
n = 500, ϕ = 0.99 | 0.3558 |
Trocando em miúdos: com uma amostra de 100 observações e um processo muito persistente, em mais de 20% dos casos você vai aceitar a hipótese nula quando não deveria. Se você tem observações mensais, 100 observações correspondem a um pouco mais de 8 anos. Se a sua observação é trimestral, isso corresponde a 25 anos de dados! Estes horizontes podem ser viáveis em alguns casos, mas não em geral - 25 anos atrás não tinhamos o Plano Real, por exemplo.
Apesar de ser importante diagnosticar a presença de raiz unitária - devido ao problema de regressão espúria - deve se ter algum cuidado com os testes de raiz unitária. Nas amostras geralmente disponíveis para problemas macro, o baixo poder do teste pode gerar problemas.