BSTS模型(在R中)的预测完全失败


15

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


2
您为什么不发布数据,我会尽力帮助...我将无法回答为什么模型会崩溃,因为我没有使用此方法,因为它内置了太多的假设。关于保留的多少值,开始日期和原产国的精确信息。
IrishStat

非常感谢您的评论。如果您有时间看一下,我已经在此处上传了原始数据。数据范围从2013年初到今年年底。我也尝试使用ARIMA模型进行预测,但是从中得出的预测也与保留数据不匹配。保留数据基本上只是2015年或2016年的一小部分,具体取决于我想使用多少训练数据。
2016年

我在下载文件时遇到问题..请发送一个csv文件到我的电子邮件地址
IrishStat 2016年

Answers:


26

史蒂夫·斯科特(Steve Scott)在这里。我写了bsts包。我为您提供一些建议。首先,您的季节性因素没有按照您的预期做。我认为您拥有每日数据,因为您正在尝试添加一个7季组件,该组件应该可以正常运行。但是,您已经告知您的年度季节性因素每12天重复一次。很难获得包含每日数据的每月季节性成分,但是您可以通过进行52周的季节性检查 AddSeasonal(..., nseasons = 52, season.duration = 7)

seasonal.duration参数告诉模型每个季节应持续多少时间。该nseasons参数告诉它一个周期中有多少个季节。一个周期中的时间点总数为season.duration * nseasons

第二个建议是,您可能想考虑一种不同的趋势模型。该LocalLinearTrend模型非常灵活,但是这种灵活性会在长期预测中显示为不期望的方差。还有一些其他趋势模型包含更多结构。 GeneralizedLocalLinearTrend(很抱歉,这种非描述性名称)假定趋势的“斜率”成分是AR1过程,而不是随机游走。如果我想预测未来,这是我的默认选项。您的大多数时间序列变化似乎都来自季节性,因此您可以尝试AddLocalLevel甚至什至AddAr代替AddLocalLinearTrend

最后,一般来说,如果您得到的预测很奇怪,并且您想弄清楚应归咎于模型的哪一部分,请尝试plot(model, "components")查看将模型分解为您所要求的各个部分。


仅供参考:我的数据也存在类似的问题,这也是每天的问题。我已经执行了此处列出的所有建议,但似乎没有帮助。
ZakJ

1
@Steve Scott抱歉打扰了Steve,我想问你一个问题:如果我想对多个时间序列建模,并且我处于层次混合模型框架中,可以使用您的软件包对它建模吗?顺便说一句:非常感谢您的包裹!
Tommaso Guerrini

4

我认为您也可以更改默认刻录。当我使用bsts时,我以MAPE作为保留期的统计数据创建了燃烧和硝化值的网格。如果您的数据有很大的变化,也可以尝试使用AddStudentLocalLinearTrend,以使模型能够预期到这种变化


1
当我的数据点很少时,对我的情况很有帮助(20)
SCallan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.