关于R语言tsCV函数滚动交叉验证的误差位置疑问
误差位置错位的原因解析
这是因为tsCV函数的误差序列索引规则和你手动计算的逻辑存在对应关系:
- 你手动计算的是:用前14个数据训练模型,预测第15个数据的误差,这个误差对应实际值与第15个预测值的差值。
- 而
tsCV返回的误差序列中,第k个位置的误差,定义为:用前k个数据训练模型,预测第k+1个数据的误差。
所以当你用前14个数据预测第15个数据时,这个误差会被tsCV放在序列的第14个位置,而非第15个位置。序列第15个位置的误差,实际是用前15个数据预测第16个数据的结果。
代码验证
运行以下代码可以直观看到对应关系:
library(forecast) ### First method tscv_test1 <- c(11, 25, 3, 8, 7, 78, 5, 2, 7, 82, 20, 10, 22, 45, 11, 8) tscv_test1_ts <- ts(tscv_test1, start= c(2012, 1), freq = 4) train.length = 14 train.ts1 <- window(tscv_test1_ts, start=c(2012,1), end=c(2012, train.length)) valid.ts1 <- window(tscv_test1_ts, start=c(2012, train.length+1), end=c(2012, train.length+1)) arima.fit1 <- arima(train.ts1, order=c(0,0,0), seasonal=list(order=c(0,1,0), period=4)) arima.pred1 <- forecast(arima.fit1, h= 1) error1 <- valid.ts1 - arima.pred1$mean[1] error1 ### Second method tscv_test1_cv <- window(x = tscv_test1_ts, start=c(2012,1), end=c(2015,4)) far2 <- function(x, h){forecast(arima(x, order=c(0,0,0), seasonal=list(order=c(0,1,0), period=4)), h=h)} error_test1 <- tsCV(tscv_test1_cv, far2, h=1) error_test1
执行后你会发现error1的值和error_test1[14]完全一致,这就验证了上述索引规则的对应关系。
内容的提问来源于stack exchange,提问作者유준택
相关产品推荐
相关产品推荐

