使用Arima模型预测超出序列末尾的时期的值

5
我正在生成带外部回归变量的ARIMA模型。假设我有n个观察值。来自预测包的predict.Arima函数只为n+1个观察值及其之后的观察值进行预测。
我需要对第n个数值(系列的最后一个数)进行预测,同时改变外部回归变量的值。换句话说,我需要根据特定的外部回归变量值预测第n个观察值的值。请注意保留HTML标记。
library(forecast)
set.seed(123)
aux <- 1:24
covari <- aux + rnorm(24,0,2)
vari <- ts(aux * runif(24,0,3), start=c(2010,1), freq=12)

mod <- auto.arima(vari, xreg=covari)

predict(mod, newxreg=20)

这段代码生成了一个模型,并展示了如何进行预测。我可以通过设置参数n.ahead来控制向前预测的时间周期数。

predict(mod, newxreg=runif(4,15,25), n.ahead=4)

这段代码将为系列生成接下来4个值的预测。
我需要的是一个n.ahead=-1,也就是说,需要对系列中的一个值进行预测,但使用不同的外部回归器。
如果我只使用一个外部回归器,那么任务并不复杂,因为由于是加法模型,我可以将观察到的xreg值与我想要的值的差乘以xreg的系数,然后将其相加。但是如果外部回归器的数量增加,情况就会变得更加复杂。
有没有办法在Arima模型中预测不超过系列末尾的值?
1个回答

3
您所说的“预测”是什么意思?在时间序列中,这是基于已观察到的过去值对未来值的估计。因此,“预测”一个已观察到的值就是该值本身。
但也许您的意思是拟合值。也就是说,在所有先前的观察值条件下,观察值的一步预测。在这种情况下,您可以使用 fitted(mod) 来获得所需内容。
顺便提一下,predict.Arima() 不是 forecast 包的一部分。forecast 包提供了 forecast.Arima() 函数作为替代。例如:
forecast(mod, xreg=20)
forecast(mod, xreg=runif(4,15,25), h=4)

更新: 正如评论中所解释的那样,原作者想要对过去的观察结果进行“预测”,假设观察到了不同值的回归器。有几种解释方式。

首先,系数会被更新以反映新信息,并且只使用过去的数据。在这种情况下,只需重新拟合模型并获取拟合值即可。

其次,系数不会被更新,只使用过去的数据。没有相应的函数,我也不确定为什么有人需要这样做。但可以按以下方式完成:

fitted(mod) + mod$coef["covari"] * (newx - oldx)

第三种情况是当系数不更新,所有数据都被使用时。这时我们得到:
observed  + mod$coef["covari"] * (newx - oldx)

您好,Hyndman教授。实际上我并没有说“预测”。也许我可以更清楚地表达:我想要在时间序列结束之前的某个时间段内,基于不同的xreg值来预测一个数值。换句话说,假设我有一个Arima模型,该模型是基于2010年1月到2011年12月的时间序列和外部回归变量构建的,那么如果我观察到了一个不同的外部回归变量值,该模型将如何预测2011年12月的值呢? - João Daniel
我意识到还有另一种选择,根据你的问题可能更自然。没有更多信息,我只能猜测所需要的内容。 - Rob Hyndman
我一直在寻找你所解释的第二个选项,但是我还没有想出如何实现它。我也没有意识到我可以使用oldx作为原始回归向量,而将newx作为我想要的新回归变量向量。这样我就可以将其应用于过去的观测值。感谢Hyndman教授的帮助! - João Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接