在阅读了有关贝叶斯结构时间序列模型的博客文章之后,我想看看在以前使用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。我绝对不明白为什么模型会以这种方式崩溃。任何建议都将受到欢迎。