R语言Rolling window forecast实现及滚动窗口交叉验证问题求助
R滚动窗口预测及交叉验证实现方案
核心问题解决:输出第9、10期预测结果
原代码中tsCV()是滚动交叉验证的误差计算工具,仅返回历史验证期的预测误差,不会生成超出样本长度的未来预测值。你可以在原有逻辑基础上,调用训练好的模型直接输出未来两期结果,完整可运行代码如下:
library(lubridate) library(forecast) # 构造样本数据 Date = c("2018-01-02", "2018-01-03","2018-01-04","2018-01-05","2018-01-06","2018-01-07","2018-01-08","2018-01-09") Sales = c(255, 138, 368, 223, 335, 75, 188, 118) ForsøgTS <- ts(Sales, start = decimal_date(as.Date("2018-01-01")), frequency = 365 ) # 定义预测函数 farima <- function(x,h) { forecast(auto.arima(x),h=h) } # 滚动交叉验证计算误差(原有逻辑保留) RW <- tsCV(ForsøgTS, farima, window = 3, h = 1 ) # 新增:用最近3期数据(符合你设置的window=3的滚动规则)训练模型,预测未来2期 last_window <- tail(ForsøgTS, 3) future_forecast <- farima(last_window, h = 2) # 输出第9、10期预测结果 print(future_forecast$mean)
运行上述代码后,future_forecast$mean 即为第9、10期的预测值。
滚动窗口交叉验证实现指导
- 基础结果解读:
tsCV()返回的向量长度与原序列一致,前window个值为NA(训练窗口样本不足),后续每个值对应对应期的预测误差,例如返回值的第4位是用1-3期样本训练、预测第4期的误差,你可以用mean(RW, na.rm = TRUE)计算平均绝对误差,评估模型预测效果。 - 多步预测交叉验证:如果需要验证提前2期的预测效果,可将
tsCV()的h参数设置为2,此时返回值为矩阵,每一列对应不同提前步长的预测误差。 - 自定义滚动逻辑:如果需要保存每一轮窗口的预测值而非仅计算误差,可以通过自定义循环实现,示例如下:
window_size <- 3 h <- 2 # 初始化存储矩阵,行对应每一轮窗口,列对应不同预测步长 roll_forecasts <- matrix(NA, nrow = length(ForsøgTS) - window_size, ncol = h) for (i in 1:nrow(roll_forecasts)) { train_data <- ForsøgTS[i:(i + window_size - 1)] roll_forecasts[i,] <- farima(train_data, h = h)$mean } # 每一行对应第i+window_size期到i+window_size+h-1期的滚动预测值 print(roll_forecasts)
内容的提问来源于stack exchange,提问作者Jakob Hansen
相关产品推荐
相关产品推荐

