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

在R中为列表各元素实现带最小观测值限制的滚动回归

滚动窗口回归实现方案

步骤1:定义单个数据集的处理函数

先写一个函数,输入包含date、re、mkt列的数据框,按规则执行滚动回归:

library(zoo)

roll_reg_single <- function(df) {
  # 检查观测数是否达标
  obs_num <- nrow(df)
  if (obs_num < 40) {
    return(NA)
  }
  
  # 自动匹配窗口大小
  window_size <- if (obs_num >= 60) 60 else obs_num
  
  # 按日期排序,确保时间序列逻辑正确
  df_sorted <- df[order(df$date), ]
  
  # 滚动执行回归,提取截距和mkt的系数
  roll_results <- rollapply(
    data = df_sorted[, c("re", "mkt")],
    width = window_size,
    FUN = function(window_data) {
      model <- lm(re ~ mkt, data = as.data.frame(window_data))
      coef(model)  # 返回截距与mkt的回归系数
    },
    by.column = FALSE,
    align = "right"  # 窗口取截至当前月的最新观测,符合逐月滚动逻辑
  )
  
  # 整理结果为带日期的数据框
  result_df <- as.data.frame(roll_results)
  colnames(result_df) <- c("intercept", "mkt_coef")
  result_df$date <- df_sorted$date[window_size:nrow(df_sorted)]
  
  return(result_df)
}

说明:

  • 观测数不足40时直接返回NA
  • 观测数在40-59之间时,用全部观测作为窗口;≥60时固定用60个观测
  • 强制按日期排序,避免时间序列顺序混乱

步骤2:批量处理列表所有元素

假设你的目标列表名为data_list,直接用lapply遍历所有元素:

# 批量执行滚动回归
all_results <- lapply(data_list, roll_reg_single)

处理后all_results与原列表结构一致:

  • 原列表中观测数不足40的元素,对应结果为NA
  • 其他元素返回包含日期、截距、mkt系数的数据框

测试示例

构造测试数据验证逻辑:

set.seed(123)
# 60个观测的数据集
df1 <- data.frame(
  date = seq.Date(as.Date("2010-01-01"), as.Date("2014-12-01"), by = "month"),
  re = rnorm(60),
  mkt = rnorm(60)
)
# 48个观测的数据集
df2 <- data.frame(
  date = seq.Date(as.Date("2012-01-01"), as.Date("2015-12-01"), by = "month"),
  re = rnorm(48),
  mkt = rnorm(48)
)
# 36个观测的数据集(不足40)
df3 <- data.frame(
  date = seq.Date(as.Date("2018-01-01"), as.Date("2020-12-01"), by = "month"),
  re = rnorm(36),
  mkt = rnorm(36)
)
data_list <- list(df1, df2, df3)

# 执行批量处理
all_results <- lapply(data_list, roll_reg_single)

# 查看结果结构
str(all_results)
  • df1用60窗口,返回1行结果
  • df2用48窗口,返回1行结果
  • df3观测数不足40,返回NA

内容的提问来源于stack exchange,提问作者Maral

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 21:40:10