如何以y1为因变量、y2/y3等为自变量执行多滚动回归?
嘿,我来帮你把滚动回归扩展到多组自变量上!你已经搞定了y1和y2的单组情况,接下来只需要把逻辑改成循环遍历每个目标自变量就行,不用重复写冗余代码啦。
多组滚动回归实现方案
1. 完整可运行代码
基于你提供的示例数据结构,直接用这段代码就能实现y1分别和y2-y6的独立滚动回归:
library(xts) library(zoo) # 生成可复现的示例数据 set.seed(123) df <- data.frame(y1=rnorm(300),y2=rnorm(300),y3=rnorm(300),y4=rnorm(300),y5=rnorm(300),y6=rnorm(300)) data <- xts(df, Sys.Date()-300:1) # 提取需要循环的自变量列表(排除因变量y1) independents <- colnames(df)[-1] # 创建列表存储每组回归的滚动系数结果 rolling_results <- list() # 循环处理每个自变量 for (var in independents) { # 动态构建回归公式:y1 ~ 当前自变量 formula_str <- paste("y1 ~", var) # 执行滚动回归,注意设置by.column=FALSE(需要整行数据拟合模型) rolling_coefs <- rollapply(zoo(data), width=20, FUN = function(Z) { model <- lm(formula = formula_str, data = as.data.frame(Z), na.rm = TRUE) return(model$coef) }, by.column = FALSE) # 用自变量名作为键,把结果存入列表 rolling_results[[var]] <- rolling_coefs } # 查看y2的滚动系数前几行验证结果 head(rolling_results[["y2"]])
2. 关键细节说明
- 动态公式构建:用
paste()拼接公式字符串,自动生成y1~y2、y1~y3等不同的回归公式,避免手动重复编写。 by.column=FALSE:这个参数一定要设置!rollapply默认按列处理数据,但我们需要每次取20行的完整数据框来拟合lm模型,不设置会直接报错。- 结果存储:用列表保存每组回归的系数,后续你可以随时提取任意一组的结果,比如
rolling_results[["y4"]]就能拿到y1和y4的滚动回归系数。
3. 可选:合并结果为统一数据框
如果想把所有滚动系数整合到一个直观的xts对象里,加这段代码即可:
# 合并所有结果并对齐日期 combined_results <- do.call(cbind, rolling_results) # 重命名列,让含义更清晰 colnames(combined_results) <- paste(rep(independents, each=2), c("截距", "系数"), sep="_") # 查看合并后的结果 head(combined_results)
这样你会得到一个每列对应“自变量_截距”“自变量_系数”的数据集,日期完全对齐,方便后续分析或可视化。
内容的提问来源于stack exchange,提问作者M_Sunny
相关产品推荐
相关产品推荐

