ベイジアン構造時系列モデルに関するこのブログ投稿を読んだ後、以前にARIMAを使用していた問題のコンテキストでこれを実装することを検討しました。
私はいくつかの既知の(しかしノイズの多い)季節的要素に関するデータを持っています-これには間違いなく年次、月次、週次の要素があり、特別な日(連邦政府や宗教の祝日など)による影響もあります。
bsts
パッケージを使用してこれを実装しましたが、コンポーネントと予測は単に期待どおりに見えませんが、間違ったことは何もしていないと言えます。私の実装が間違っているか、不完全であるか、その他の問題があるかどうかは明確ではありません。
フルタイムシリーズは次のようになります。
データの一部のサブセットでモデルをトレーニングできます。モデルは一般に適合性の点で見栄えがよくなります(プロットは下にあります)。これを行うために使用しているコードは次のとおりです。
library(bsts)
predict_length = 90
training_cut_date <- '2015-05-01'
test_cut_date <- as.Date(training_cut_date) + predict_length
df = read.csv('input.tsv', sep ='\t')
df$date <- as.Date(as.character(df$date),format="%Y-%m-%d")
df_train = df[df$date < training_cut_date,]
yts <- xts(log10(df_train$count), order.by=df_train$date)
ss <- AddLocalLinearTrend(list(), yts)
ss <- AddSeasonal(ss, yts, nseasons = 7)
ss <- AddSeasonal(ss, yts, nseasons = 12)
ss <- AddNamedHolidays(ss, named.holidays = NamedHolidays(), yts)
model <- bsts(yts, state.specification = ss, niter = 500, seed=2016)
モデルは合理的に見えます:
しかし、予測をプロットすると、最初に傾向が完全に間違っており、次に不確実性が非常に急速に増加します-対数軸上にy軸を作成せずに予測と同じプロットに不確実性バンドを表示できないポイントまで規模。この部分のコードは次のとおりです。
burn <- SuggestBurn(0.1, model)
pred <- predict(model, horizon = predict_length, burn = burn, quantiles = c(.025, .975))
純粋な予測は次のようになります。
そして、初期分布にスケールバックすると(点線がトレーニングから予測への移行を示しているため、問題は明らかです:
私は、季節のトレンドを追加し、季節のトレンドを削除し、AR項を追加し、AddLocalLinearModelをAddGeneralizedLocalLinearTrendに変更し、モデルの調整に関する他のいくつかのことを試みましたが、問題を解決し、予測をより意味のあるものにしませんでした。場合によっては方向が変わるため、0に低下するのではなく、予測は時間の関数として増加し続けます。モデルがこのように壊れている理由を私は絶対に理解していません。どんな提案も大歓迎です。