bsts包的预测置信区间比auto.arima的预测置信区间宽得多

bsts包的预测置信区间比auto.arima的预测置信区间宽得多,r,time-series,bayesian,forecasting,R,Time Series,Bayesian,Forecasting,我最近在Google上读到了Steven Scott为贝叶斯结构时间序列模型编写的bsts包,并想尝试一下forecast包中的auto.arima函数,我一直在使用该函数进行各种预测任务 我尝试了几个例子,并对包的效率以及点预测留下了深刻印象。但是,当我观察预测方差时,我几乎总是发现,与auto.arima相比,bsts最终给出了更宽的置信区间。下面是一个关于白噪声数据的示例代码 library("forecast") library("data.table") library("bsts")

我最近在Google上读到了Steven Scott为贝叶斯结构时间序列模型编写的bsts包,并想尝试一下forecast包中的auto.arima函数,我一直在使用该函数进行各种预测任务

我尝试了几个例子,并对包的效率以及点预测留下了深刻印象。但是,当我观察预测方差时,我几乎总是发现,与auto.arima相比,bsts最终给出了更宽的置信区间。下面是一个关于白噪声数据的示例代码

library("forecast")
library("data.table")
library("bsts")
truthData = data.table(target = rnorm(250))
freq = 52
ss = AddGeneralizedLocalLinearTrend(list(), truthData$target)
ss = AddSeasonal(ss, truthData$target, nseasons = freq)
tStart = proc.time()[3]
model = bsts(truthData$target, state.specification = ss, niter = 500)
print(paste("time taken: ", proc.time()[3] - tStart))
burn = SuggestBurn(0.1, model)
pred = predict(model, horizon = 2 * freq, burn = burn, quantiles = c(0.10, 0.90))

## auto arima fit
max.d = 1; max.D = 1; max.p = 3; max.q = 3; max.P = 2; max.Q = 2; stepwise = FALSE
dataXts = ts(truthData$target, frequency = freq)
tStart = proc.time()[3]
autoArFit = auto.arima(dataXts, max.D = max.D, max.d = max.d, max.p = max.p, max.q = max.q, max.P = max.P, max.Q = max.P, stepwise = stepwise)
print(paste("time taken: ", proc.time()[3] - tStart))
par(mfrow = c(2, 1))
plot(pred, ylim = c(-5, 5))
plot(forecast(autoArFit, 2 * freq), ylim = c(-5, 5))
这里是情节 我想知道是否有人可以解释这种行为,以及我们如何控制预测差异。据我回忆,从Hyndman博士的论文auto.arima的预测方差计算没有考虑参数估计方差,即估计ar和ma系数的方差。这就是我在这里看到的差异的驱动原因,还是我遗漏了其他一些微妙的点,可以通过一些参数来控制

谢谢

下面是一个脚本,用于测试将bsts与auto.arima进行比较的中短期预测问题的包含概率

library("forecast")
library("data.table")
library("bsts")
set.seed(1234)
n = 260
freq = 52
h = 10
rep = 50
max.d = 1; max.D = 1; max.p = 2; max.q = 2; max.P = 1; max.Q = 1; stepwise = TRUE
containsProb = NULL
for (i in 1:rep) {
    print(i)
    truthData = data.table(time = 1:n, target = rnorm(n))
    yTrain = truthData$target[1:(n - h)]
    yTest = truthData$target[(n - h + 1):n]

    ## fit bsts model
    ss = AddLocalLevel(list(), truthData$target)
    ss = AddSeasonal(ss, truthData$target, nseasons = freq)
    tStart = proc.time()[3]
    model = bsts(yTrain, state.specification = ss, niter = 500)
    print(paste("time taken: ", proc.time()[3] - tStart))
    pred = predict(model, horizon = h, burn = SuggestBurn(0.1, model), quantiles = c(0.10, 0.90))
    containsProbBs = sum(yTest > pred$interval[1,] & yTest < pred$interval[2,]) / h

    ## auto.arima model fit
    dataTs = ts(yTrain, frequency = freq)
    tStart = proc.time()[3]
    autoArFit = auto.arima(dataTs, max.D = max.D, max.d = max.d, max.p = max.p, max.q = max.q, max.P = max.P, max.Q = max.P, stepwise = stepwise)
    print(paste("time taken: ", proc.time()[3] - tStart))
    fcst = forecast(autoArFit, h = h)

    ## inclusion probabilities for 80% CI
    containsProbBs = sum(yTest > pred$interval[1,] & yTest < pred$interval[2,]) / h
    containsProbAr = sum(yTest > fcst$lower[,1] & yTest < fcst$upper[,1]) / h
    containsProb = rbindlist(list(containsProb, data.table(bs = containsProbBs, ar = containsProbAr)))
}
colMeans(containsProb)
>  bs   ar 
 0.79 0.80 
c(sd(containsProb$bs), sd(containsProb$ar))
> [1] 0.13337719 0.09176629
库(“预测”)
库(“数据表”)
图书馆(“bsts”)
种子集(1234)
n=260
频率=52
h=10
代表=50
最大d=1;最大D=1;最大p=2;最大q=2;最大P=1;最大Q=1;逐步=正确
containsProb=NULL
对于(i in 1:rep){
印刷品(一)
truthData=data.table(时间=1:n,目标=rnorm(n))
yTrain=truthData$target[1:(n-h)]
yTest=truthData$target[(n-h+1):n]
##拟合bsts模型
ss=AddLocalLevel(list(),truthData$target)
ss=AddSeasonal(ss,truthData$target,nseasons=freq)
tStart=proc.time()[3]
型号=bsts(yTrain,state.specification=ss,niter=500)
打印(粘贴(“所用时间:,过程时间()[3]-tStart))
pred=predict(模型,水平=h,burn=SuggestBurn(0.1,模型),分位数=c(0.10,0.90))
containsProbBs=sum(yTest>pred$interval[1,]&yTestpred$interval[1,]&yTestfcst$lower[,1]&yTestbs ar
0.79 0.80 
c(sd(containsProb$bs)、sd(containsProb$ar))
> [1] 0.13337719 0.09176629

不同之处在于,BSTS模型是非平稳的,而在这种情况下选择的ARIMA模型是平稳的(实际上只是白噪声)。对于BSTS模型,预测区间在预测范围内继续扩大,而ARIMA模型具有恒定的预测区间。对于第一个预测期,它们相对较近,但在较长的预测期内会出现分歧。

尊敬的Hyndman博士,感谢您的回复。这非常清楚地表明,我们正在通过更广泛的长期预测CI为状态空间类型的模型增加灵活性而付费。我做了一个快速测试来验证短期(10个周期)预测,bsts模型中80%CI的包含概率非常接近公布的极限。我已经在我的原始评论中添加了代码作为编辑。我不会说BSTS模型更灵活。它们在设计上是非平稳的,而ARIMA模型可以是非平稳的或平稳的。众所周知,ARIMA预测区间过窄,许多其他时间序列模型也是如此,这不是因为它们忽略了参数不确定性,而是因为它们忽略了模型不确定性。BSTS模型通过允许所有组件都是非平稳的来近似模型不确定性。