如何在R中按滑动窗口循环执行线性回归提取系数?
滚动窗口线性回归代码调整方案
原代码存在的问题
- 循环边界错误:窗口大小为20行时,i的最大取值应为总数据行数减19,否则当i接近末尾时,
i:(i+20)会超出数据集行索引范围,同时i:(i+20)本身会取到21行数据,和需求的20行窗口不符 - 变量选取错误:需求的因变量是第一列的Streamflow,原代码错误取了第二列作为y;且需求的自变量包含x1-x4四个变量,原代码仅选取了x1、x2两个变量
- 系数存储结构错误:
lm()返回的系数包含截距+4个自变量共5个值,原代码用一维向量mod_coef[i]无法存储多列系数结果
修正后的代码
# 预定义存储系数的矩阵,每一行对应一个窗口的系数:截距、x1、x2、x3、x4 window_size <- 20 max_i <- nrow(CFbasin) - window_size + 1 mod_coef <- matrix(NA, nrow = max_i, ncol = 5, dimnames = list(NULL, c("intercept", "x1", "x2", "x3", "x4"))) for(i in 1:max_i) { # 取当前窗口的20行数据 window_data <- CFbasin[i:(i + window_size - 1), ] # 拟合指定线性模型 mod <- lm(Streamflow ~ x1 + x2 + x3 + x4, data = window_data) # 保存系数 mod_coef[i, ] <- coef(mod) }
补充说明
如果需要提升运行效率,可以用rollRegres包的roll_regres()函数替代for循环实现向量化计算,避免循环带来的性能损耗。
内容的提问来源于stack exchange,提问作者Rua Jing
相关产品推荐
相关产品推荐

