在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
相关产品推荐
相关产品推荐

