Entendo que devemos usar o ARIMA para modelar uma série temporal não estacionária. Além disso, tudo o que li diz que o ARMA deve ser usado apenas para séries temporais estacionárias.
O que estou tentando entender é: o que acontece na prática ao classificar incorretamente um modelo e assumir d = 0
uma série temporal não estacionária? Por exemplo:
controlData <- arima.sim(list(order = c(1,1,1), ar = .5, ma = .5), n = 44)
os dados de controle são assim:
[1] 0.0000000 0.1240838 -1.4544087 -3.1943094 -5.6205257
[6] -8.5636126 -10.1573548 -9.2822666 -10.0174493 -11.0105225
[11] -11.4726127 -13.8827001 -16.6040541 -19.1966633 -22.0543414
[16] -24.8542959 -25.2883155 -23.6519271 -21.8270981 -21.4351267
[21] -22.6155812 -21.9189036 -20.2064343 -18.2516852 -15.5822178
[26] -13.2248230 -13.4220158 -13.8823855 -14.6122867 -16.4143756
[31] -16.8726071 -15.8499558 -14.0805114 -11.4016515 -9.3330560
[36] -7.5676563 -6.3691600 -6.8471371 -7.5982880 -8.9692152
[41] -10.6733419 -11.6865440 -12.2503202 -13.5314306 -13.4654890
Supondo que não sabia que eram os dados ARIMA(1,1,1)
, talvez eu desse uma olhada pacf(controlData)
.
Então eu uso o Dickey-Fuller para ver se os dados não são estacionários:
require('tseries')
adf.test(controlData)
# Augmented Dickey-Fuller Test
#
# data: controlData
# Dickey-Fuller = -2.4133, Lag order = 3, p-value = 0.4099
# alternative hypothesis: stationary
adf.test(controlData, k = 1)
# Augmented Dickey-Fuller Test
#
#data: controlData
# Dickey-Fuller = -3.1469, Lag order = 1, p-value = 0.1188
# alternative hypothesis: stationary
Então, suponho que os dados sejam ARIMA (2,0, *). Em seguida, use auto.arima(controlData)
para tentar obter o melhor ajuste?
require('forecast')
naiveFit <- auto.arima(controlData)
naiveFit
# Series: controlData
# ARIMA(2,0,1) with non-zero mean
#
# Coefficients:
# ar1 ar2 ma1 intercept
# 1.4985 -0.5637 0.6427 -11.8690
# s.e. 0.1508 0.1546 0.1912 3.2647
#
# sigma^2 estimated as 0.8936: log likelihood=-64.01
# AIC=138.02 AICc=139.56 BIC=147.05
Portanto, mesmo que os dados passados e futuros sejam ARIMA (1,1,1), posso ficar tentado a classificá-los como ARIMA (2,0,1). tsdata(auto.arima(controlData))
parece ser bom também.
Aqui está o que um modelador informado encontraria:
informedFit <- arima(controlData, order = c(1,1,1))
# informedFit
# Series: controlData
# ARIMA(1,1,1)
#
# Coefficients:
# ar1 ma1
# 0.4936 0.6859
# s.e. 0.1564 0.1764
#
# sigma^2 estimated as 0.9571: log likelihood=-62.22
# AIC=130.44 AICc=131.04 BIC=135.79
1) Por que esses critérios de informação são melhores que o modelo selecionado por auto.arima(controlData)
?
Agora, apenas comparo graficamente os dados reais e os 2 modelos:
plot(controlData)
lines(fitted(naiveFit), col = "red")
lines(fitted(informedFit), col = "blue")
2) No papel de advogado do diabo, que tipo de consequências eu pagaria usando um ARIMA (2, 0, 1) como modelo? Quais são os riscos desse erro?
3) Estou mais preocupado com quaisquer implicações para previsões futuras de vários períodos. Eu suponho que eles seriam menos precisos? Só estou procurando alguma prova.
4) Você sugeriria um método alternativo para a seleção de modelos? Há algum problema com o meu raciocínio como modelador "desinformado"?
Estou realmente curioso para saber quais são as outras conseqüências desse tipo de classificação incorreta. Estive procurando por algumas fontes e simplesmente não consegui encontrar nada. Toda a literatura que pude encontrar apenas detalhes sobre esse assunto, apenas afirmando que os dados devem estar estacionários antes de executar o ARMA e, se não estacionários, precisam ser diferenciados d vezes.
Obrigado!
fonte
Respostas:
Minha impressão é que essa pergunta não tem uma resposta única e totalmente geral; portanto, explorarei apenas o caso mais simples e de uma maneira um pouco informal.
e seu MSE será
(o termo do meio da praça desaparece, bem como os produtos cruzados de erros futuros).
prevendo o nível do processo, teremos
que, na realidade, dado o verdadeiro DGP, será
e entao
enquanto repito por conveniência
Portanto, para que o modelo diferenciado tenha melhor desempenho em termos de previsão MSE, queremos
Portanto, sem discutir qualquer método específico de estimativa, acredito que fomos capazes de mostrar informalmente que se espera que o modelo diferenciado tenha melhor desempenho em termos de previsão MSE.
fonte
Essa é uma boa pergunta.
Pelo que sei, você acabou de considerar o pacf, mas isso não é suficiente. ACF e PACF são necessários para selecionar o melhor modelo.
Por outro lado, testes estacionários são fracos e sensíveis e precisam de uma grande quantidade de defasagens para serem testados.
Além disso, é preferível deixar séries temporais estacionárias antes de aplicar qualquer modelo. Grosso modo, os modelos ARIMA consideram apenas um caso especial de não-estacionário (preferencialmente na tendência).
Sobre suas perguntas, não tenho certeza sobre a função auto.arima, mas tenho certeza de que o número de pontos de dados no seu exemplo é pequeno. A simulação do modelo usando um grande número de pontos de dados responderia bem às suas perguntas. Além disso, aconselho a considerar o ACF das séries temporais e o PACF. Sobre a seleção de modelos, a regra geral é escolher o modelo mais simples (observe que o modelo mais simples após tornar a série temporal estacionária).
Refiro-lhe esta referência. Este livro não responde a todas as suas perguntas, mas fornece algumas pistas.
----- seção complementar ------- @nsw considerando uma tendência em seus dados. Se você considerar um modelo estacionário, ele resultará em uma previsão para cima / para baixo, mas, na verdade, os modelos ARMA são projetados para prever dados simples. Alterei seu código para refletir essa diferença:
require ('forecast')
require ('tseries')
controlData <- arima.sim (lista (ordem = c (1,1,1), ar = 0,5, ma = 0,5), n = 1000 )
acf (controlData)
ts.plot (controlData)
naiveFit <- arima (controlData, order = c (2,0,1))
trueFit <- arima (controlData, order = c (1,1,1))
PrnaiveFit <-forecast.Arima (naiveFit, 10)
PrtrueFit <- forecast.Arima (trueFit, 10)
Matplot (cbind (PrnaiveFit $ mean, PrtrueFit $ mean), tipo = 'b', col = c ('vermelho', 'verde'), ylab = c ('previsão'), pch = c ('n', 't'))
fonte