我希望在不重新估计的情况下编写一个滚动窗口多步预测(相反,我希望一直使用ARIMA(1,0,0(模型(,并在其中实现外部参照。
我使用Rob Hyndam的代码,他有以下代码:
h <- 5
train <- window(hsales,end=1989.99)
test <- window(hsales,start=1990)
n <- length(test) - h + 1
fit <- auto.arima(train)
fc <- ts(numeric(n), start=1990+(h-1)/12, freq=12)
for(i in 1:n)
{
x <- window(hsales, end=1989.99 + (i-1)/12)
refit <- Arima(x, model=fit)
fc[i] <- forecast(refit, h=h)$mean[h]
}
我读过很多不同的帖子,但在实现外部参照时,以及在试图解决我经常遇到的外部参照长度与拟合线不匹配的问题时,许多帖子都使用了对模型的重新估计。
因此,我试图用这个代码来解决我的问题:
h <- 5
train <- window(hsales,end=1989.99)
test <- window(hsales,start=1990)
xregtrain <-window(hsales, end=1989.99)
n <- length(test) - h + 1
fit <- arima(train, order= c(1,0,0), xreg = xregtrain)
fc <- ts(numeric(n), start=1990+(h-1)/12, freq=12)
for(i in 1:n)
{
x <- window(hsales, end=1989.99+ (i-1)/12)
y<- window(hsales, end=1989.99 + (i-1)/12)
refit <- Arima(x, order=c(1,0,0), xreg=y)
fc[i] <- forecast(refit, h=h, xreg=y)$mean[h]
}
这应该会更新外部参照的长度,以匹配每个新预测的hsales长度,并且似乎有效,但我希望有人能告诉我如何检查这是否在更新每个新预测中的外部参照值,或者有更深入了解的人可以确认它正在做我想做的事情。
我的最后一个问题是;如何从中获取预测值并分析该模型的预测能力,例如,如何计算该预测的MAPE?
谢谢你的帮助!
您当前的代码将无法工作,因为您正在对一个序列本身进行回归(xreg
与您正在建模的时间序列相同(。以下是一些代码,可以使用随机生成的外部参照进行说明。
library(fpp2)
h <- 5
train <- window(hsales, end = c(1989, 12))
test <- window(hsales, start = 1990)
xreg <- hsales * rnorm(length(hsales))
xregtrain <- window(xreg, end = c(1989, 12))
fit <- Arima(train, order = c(1, 0, 0), xreg = xregtrain)
n <- length(test) - h + 1
fc <- ts(numeric(n), start=c(1990, h), frequency = 12)
for (i in seq(n)) {
y <- window(hsales, end = c(1990, i - 1))
x <- window(xreg, end = c(1990, i - 1))
refit <- Arima(y, order = c(1, 0, 0), xreg = x)
fc[i] <- forecast(refit, h = h, xreg = x)$mean[h]
}
accuracy(fc, test)
accuracy()
函数将计算MAPE和其他预测精度度量。