You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 03:21:00