基于slider包将历史预测值作为因变量实现递归OLS预测求助
现有代码的问题
你目前写的代码有两个核心缺陷:
slider::slide滑动的是原始数据集,不会自动将上一轮生成的预测值回填到y列中,后续窗口建模时用的还是带缺失值的原始y,完全跑不通递归预测的逻辑- 用
lm(y ~ . , .x)的写法会把后续生成的预测列也误纳入自变量,导致模型参数错误
函数式方案实现
用purrr::accumulate就能完美实现你的需求,这个函数本身就是为迭代/递归场景设计的,完全符合函数式编程的思路,不需要手动处理偏移和列表元素提取:
library(tidyverse) # 生成测试数据集 regex <- tibble(a = rnorm(10), b = rnorm(10), y = rnorm(10)) %>% add_row(a = rnorm(5), b = rnorm(5)) n_initial <- 10 # 初始有y观测的行数 n_forecast <- nrow(regex) - n_initial # 需要递归预测的步数 # 递归预测核心逻辑 filled_y <- accumulate( .x = 1:n_forecast, .f = function(prev_y, current_step) { # 组装当前可用的完整数据集(包含之前的预测值) train_df <- regex[1:(n_initial + current_step - 1), ] %>% mutate(y = prev_y) # 取最近10条观测拟合OLS ols_model <- lm(y ~ a + b, data = tail(train_df, 10)) # 预测当前步的y值 current_pred <- predict(ols_model, newdata = regex[n_initial + current_step, ]) # 返回更新后的y序列,供下一轮迭代使用 c(prev_y, current_pred) }, .init = pull(regex, y)[1:n_initial] # 初始的10条真实y值 ) %>% last() # 提取最终完整的y序列(真实值+预测值) # 结果回填到原数据 regex <- regex %>% mutate(y_filled = filled_y)
方案优势
- 递归逻辑天然由
accumulate实现,不需要手动处理lag和列表解析,代码可读性更高 - 显式指定自变量
a + b,避免无关列被误纳入模型 - 每一轮生成的预测值都会自动传入下一轮的训练集,完全匹配你需要的「用预测值作为原始值继续预测」的需求
- 如果需要单独提取纯预测结果,直接取
tail(filled_y, n_forecast)即可
内容的提问来源于stack exchange,提问作者Matheus Pasche
相关产品推荐
相关产品推荐

