在阅读了这篇关于贝叶斯结构时间序列模型的博文后,我想看看在我之前使用 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,而是随着时间的推移而继续增加。我绝对不明白为什么模型会以这种方式崩溃。任何建议都会非常受欢迎。