我想使用auto.arima
函数进行样本外预测实验。此外,应使用固定滚动窗口大小的时间序列交叉验证。目标是针对未来的1,3和6步获得一步预测。
library(forecast)
library(tseries)
#the time series
y1 = 2+ 0.15*(1:20) + rnorm(20,2)
y2 = y1[20]+ 0.3*(1:30) + rnorm(30,2)
y = as.ts(c(y1,y2))
#10obs in test set, 40obs in training set
ntest <- 10
ntrain <- length(y)-ntest
#auto.arima with some prefered specifications
farima <- function(x,h){forecast(auto.arima(x,ic="aic",test=c("adf"),seasonal=FALSE,
stepwise=FALSE, approximation = FALSE,
method=c("ML")),h=h)}
# executing the following function, gives the forecast errors in a matrix for each one-step forecast
e <- tsCV(y,farima,h = 6,window=40)
通过从真实值中减去误差来给出预测值:
#predicted values
fc1 <- c(NA,y[2:50]-e[1:49,1])
fc1 <- fc1[41:50]
fc3 <- c(NA,y[2:50]-e[1:49,3])
fc3 <- fc3[41:50]
fc6 <- c(NA,y[2:50]-e[1:49,6])
fc6 <- fc6[41:50]
但是,我很好奇前面三步的预测值是否正确编码。由于第一个3步超前预报是对第43个观测的预报?
我也不明白为什么提前3步误差[第3列]的矩阵e
具有观察值40。由于我认为获得观察值43的第一个提前3步预测,因此不应观察错误40。
答案 0 :(得分:0)
始终阅读帮助文件:
值
包含预测误差的矢量时间序列对象,作为矢量(如果h = 1),否则为矩阵。时间索引对应于训练数据的最后一个周期。这些列对应于预测范围。
因此tsCV()
在矩阵中返回错误,其中第(i,j)项包含预测原点i和预测水平h的误差。因此,第40行和第3列的值是在时间段43的时间40处产生的3步误差。
答案 1 :(得分:0)
感谢您的帮助!
因此对于h = 1,2,3步,预测值如下:
#predicted values
#h=1
fc1 <- c(NA,y[41:50]-e[40:49,1])
fc1 <- fc1[2:11]
#h=2
fc2 <- c(NA,y[42:50]-e[40:49,2])
fc2 <- fc2[2:10]
#h=3
fc3 <- c(NA,y[43:50]-e[40:49,3])
fc3 <- fc3[2:9]
对吗?