按组计算带滞后项线性模型残差并添加为新变量的问题
分组面板数据AR(1)模型残差添加解决方案
原代码存在的问题
- 语法错误:
group.by = group是错误的分组写法,正确调用应为group_by(group) - 模型公式错误:目标是拟合一阶自回归模型,公式需改为
Var1 ~ lag(Var1),而非Var1 ~ Var1 - 匹配逻辑缺陷:通过行号匹配会忽略分组内滞后项导致的缺失,每组首条观测因无滞后值无法计算残差,应保留为
NA
正确实现方式
方法1:dplyr + broom 适配方案
先确保数据按组和时间排序(保证滞后项计算正确),再分组拟合模型并提取残差:
library(dplyr) library(broom) # 按组、时间排序 panel_data <- panel_data %>% arrange(group, time) # 分组拟合AR(1)并合并残差 panel_data_with_resid <- panel_data %>% group_by(group) %>% group_modify(~ { model <- lm(Var1 ~ lag(Var1), data = .x) augment(model, newdata = .x) %>% select(.resid) }) %>% ungroup() %>% bind_cols(panel_data) %>% relocate(group, time, Var1, Var2, .resid)
方法2:data.table 高效方案
针对data.table格式的数据集,原生语法性能更优:
library(data.table) # 按组、时间排序 setorder(panel_data, group, time) # 分组计算残差 panel_data[, resid := { model <- lm(Var1 ~ shift(Var1), .SD) c(NA, residuals(model)) }, by = group]
关键说明
每组首条观测因无有效滞后项,无法参与模型拟合,残差设为NA是合理结果;后续观测的残差基于组内独立拟合的AR(1)模型生成,确保分组逻辑正确。
内容的提问来源于stack exchange,提问作者ZayzayR
相关产品推荐
相关产品推荐

