使用rollapply()与step()实现滚动逐步回归时zoo序列日期范围滞后问题
解决滚动逐步回归的日期戳滞后问题
我来帮你搞定这个问题!其实问题根本不是step()函数的锅,而是你第二个滚动回归的代码里漏掉了align="right"参数,这才导致日期范围看起来“滞后”了。
问题原因分析
rollapply()函数的默认对齐方式是align="center":当你设置窗口宽度为365(奇数)时,每个滚动窗口的结果会被绑定到窗口的中心日期,而不是你需要的窗口最后一天。
看你的第一个案例,明确指定了align="right",所以结果的日期是每个滚动窗口的右端点(也就是回归完成对应的日期),范围是2016-12-30至2017-12-31,完全符合预期。而第二个案例没加这个参数,默认用了中心对齐,所以日期范围变成了每个窗口的中心日期,看起来就像是“滞后”了。
修正后的代码
除了加上align="right",还要注意step()可能会删除部分变量,导致不同窗口返回的系数数量不一致,所以我们需要预先创建包含所有原始系数的向量,把step返回的系数填充进去,缺失的用NA补齐,确保每个窗口返回的结果结构一致:
library(zoo) date <- seq(as.Date("2016-01-01"), as.Date("2017-12-31"), by="days") y <- rnorm(length(date)) x1 <- rnorm(length(date)) x2 <- rnorm(length(date)) z <- rnorm(length(date)) x3 <- z+5 all_vars <- cbind.data.frame(date, y, x1, x2, x3) # 修正后的滚动逐步回归 rolling_reg_fixed <- rollapply(zoo(all_vars[,-1], order.by = date), width=365, FUN=function(z){ df <- as.data.frame(z) # 拟合逐步回归 step_model <- step(lm(formula=y~x1+x2+x3, data=df), direction = "backward", k=2) # 预先创建包含所有原始系数的向量,缺失的用NA填充 full_coefs <- setNames(numeric(4), c("(Intercept)", "x1", "x2", "x3")) full_coefs[names(step_model$coef)] <- step_model$coef return(full_coefs) }, by.column = FALSE, align="right") # 查看结果结构 str(rolling_reg_fixed)
验证结果
运行修正后的代码后,你会发现rolling_reg_fixed的日期范围和第一个正常的滚动回归完全一致:从2016-12-30到2017-12-31,每个日期对应一个滚动窗口的右端点,参数也能正确匹配对应的日期戳。
内容的提问来源于stack exchange,提问作者Lauri
相关产品推荐
相关产品推荐

