Simular caminhos de amostra de previsão do modelo tbats

8

Usando o excelente pacote de previsões de Rob Hyndman, deparei-me com a necessidade de não apenas ter intervalos de previsão, mas simular vários caminhos futuros, considerando observações passadas de uma série temporal com sazonalidades complexas. Há algo para séries temporais menos complexas com apenas uma ou duas sazonalidades (simulate.ets () no pacote de previsão), mas no meu caso, eu exigiria o equivalente a simulate.ets () para o modelo tbats mais complexo.

Suponho que os dados necessários para criar esses caminhos já estejam presentes no objeto de ajuste, mas a possibilidade de criar caminhos de amostra parece não estar diretamente acessível. Portanto, criei uma solução ingênua e gostaria de saber se esta abordagem está correta.

require(forecast)
fit = bats(test,use.parallel=T,use.damped.trend=F,use.trend=T,seasonal.periods=seasonal.periods)

Ingenuamente, imagino que caminhos de amostra possam ser construídos usando a previsão de pontos de

fit 

> forecast(fit)
         Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
1960.016       24.48576 23.82518 25.14633 23.47550 25.49602
1960.032       24.79870 23.88004 25.71735 23.39374 26.20366
1960.048       25.31743 24.39878 26.23608 23.91247 26.72239
1960.065       25.69254 24.77389 26.61120 24.28759 27.09750 
1960.081       26.06863 25.14998 26.98729 24.66367 27.47359
1960.097       26.43215 25.51350 27.35080 25.02719 27.83711
1960.113       26.77674 25.85809 27.69540 25.37179 28.18170

e simplesmente adicionando valores sorteados aleatoriamente a partir do procedimento de ajuste do modelo.

> fit$errors
Time Series:
Start = c(1959, 2) 
End = c(1960, 1) 
Frequency = 365 
  [1]  0.140656913 -0.455335141 -0.558989185  1.697532911 -0.114406022  0.366182718 -0.377056927  0.396144296

Portanto, com

prediction = forecast(fit)
errors = fit$errors

path = prediction$mean + sample(errors, size = length(prediction$mean))
plot(ts(path))

um caminho de amostra pode ser construído.

insira a descrição da imagem aqui

Essa é uma maneira válida de construir caminhos de amostra? Caso contrário, qual seria a maneira correta?

Muito obrigado por qualquer ajuda!

Peter Lustig
fonte

Respostas:

2

Não, esse método não é válido em geral.

Aqui está um contra-exemplo simples e ilustrativo. Suponha que você tenha uma caminhada aleatória sem desvio:

Yt=Yt1+εt
εtN(0,1)

Esse processo se enquadra na classe TBATS (é apenas um modelo ETS do tipo "ANN" com , sem nenhuma sazonalidade complexa, transformação de Box-Cox ou erros ARMA).α=1

Veja como é se você usar seu método em dados simulados:

insira a descrição da imagem aqui

O "caminho simulado" é plano e apresenta uma pequena variação, enquanto os dados originais se afastam bastante do seu nível médio. Ele não "parece" com os dados originais.

Se repetirmos o procedimento várias vezes e computarmos os quantis empíricos para os 95% médios da distribuição em cada horizonte, você verá que eles estão errados em comparação com os intervalos de previsão relatados por forecast.tbats(se o método funcionou, eles devem corresponder ao externo, intervalos de cinza):

insira a descrição da imagem aqui

Muitos modelos de séries temporais podem ser vistos como uma transformação de uma sequência de variáveis ​​aleatórias não correlacionadas; a transformação exata depende do modelo. Dada uma transformação específica, geralmente é possível pegar os resíduos (chame-os ), reamostrá-los e aplicar essa transformação para simular o mesmo processo.εt^

Por exemplo, a caminhada aleatória transforma uma sequência de variáveis ​​não correlacionadas pela recursão declarada acima (a soma acumulada). Se sua série original terminar em , você poderá experimentar , de e aplicar a mesma recursão a obtenha um valor simulado para , assim: t ε * t + 1εtTεT+1{ε1^,,εT^}YT+1

YT+1=YT+εT+1

Se você calcular os quantis como antes, deverá se aproximar da área cinza.

Em geral, portanto, esse tipo de autoinicialização baseada em modelo requer um código ligeiramente diferente para diferentes modelos, para executar diferentes transformações na nova . A função lida com isso para você na classe ETS, mas ainda não parece ser equivalente ao TBATS no pacote, pelo que sei.εtsimulate.ets

Chris Haug
fonte
Alguma recomendação sobre como fazer isso para o TBATS sem a necessidade de criar um simulate.tbatsmétodo?
Bryan Shalloway
1
Pessoalmente, não precisei disso e não conheço uma implementação existente, mas deve ser relativamente simples de implementar. Você pode desenhar o de ou reamostrando o , conforme descrito acima. Depois, passe-os pelas recursões do modelo. Observe que isso fornecerá uma amostra apenas de , portanto, não inclui incerteza de parâmetro, mas os intervalos de previsão citados raramente o fazem. N ( 0 , σ 2 ) ε i p ( Y T + 1 , . . . , Y T + H | Y 1 , . . . , Y T , θ )εTN(0,σ^2)ε^ip(YT+1,...,YT+h|Y1,...,YT,θ^)
Chris Haug
-2

Esta é provavelmente uma resposta muito tardia, mas não vejo por que não.

Sua abordagem parece correta. Mas, existe uma maneira mais fácil de fazer isso.

Você já atribuiu um nome de variável à sua previsão. Você simplesmente precisa plot(prediction). Ao adicionar a variável hque é o número de períodos para previsão prediction, você pode controlar a duração da previsão. Por exemplo, você poderia dizer prediction <- forecast(fit, h = 48). Observe que o valor de hdepende de quanto tempo você deseja ver no futuro.

Mustafa Hasanbulli
fonte
1
Não estou interessado no enredo em si, mas em ter acesso a um conjunto de previsões.
Peter Lustig