如何利用split feols()批量提取623组回归的系数?
解决
feols分组回归结果的系数提取问题 我需要针对623个MECE分组(取值为{1,2,...,623})分别运行回归,提取每个回归中所有自变量的系数估计值。此前用循环实现,在600万条数据下耗时约10分钟;换成ols_split <- feols(as.formula(formula), df, split=~group)后仅需1分钟完成所有回归,结果是包含623个元素的列表。但尝试循环提取系数时,因引号内的变量i被识别为文本而失败,现寻求有效提取方法。
原循环实现代码
# loop prep formula <- "dv ~ iv_1 + iv_2 + iv_3 | fe" ols_stored_coef <- matrix(0, 623, 3) ols_stored_coef <- as.data.frame(ols_stored_coef ) # loop for(i in 1:623) { #run regression: ols <- feols(as.formula(formula), subset(df, group==i)) # generate coefficients: ols_coef <- summary(ols)$coefficients ols_coef <- data.frame(as.list(ols_coef)) # store coefficients: ols_stored_coef[i,1] = ols_coef[1,1] ols_stored_coef[i,2] = ols_coef[1,2] ols_stored_coef[i,3] = ols_coef[1,3] }
split回归实现代码
ols_split <- feols(as.formula(formula), df, split=~group)
失败的系数提取循环代码
for(i in 1:623) { ols_coef <- ols_split $`sample.var: store; sample: i`$coefficients ols_coef <- data.frame(as.list(ols_coef)) # store coefficients: ols_stored_coef[i,1] = ols_coef[1,1] ols_stored_coef[i,2] = ols_coef[1,2] ols_stored_coef[i,3] = ols_coef[1,3] }
有效提取方法
方法1:直接用列表索引循环
ols_split是标准列表,直接用[[i]]访问第i个分组的回归结果,无需拼接字符串索引:
# 初始化系数存储框,指定列名更清晰 ols_stored_coef <- data.frame( iv_1 = numeric(623), iv_2 = numeric(623), iv_3 = numeric(623) ) for(i in 1:623) { # 直接索引列表元素 current_model <- ols_split[[i]] # 用coef()直接提取系数,比summary()更高效 current_coef <- coef(current_model) # 赋值到对应行 ols_stored_coef[i, ] <- current_coef }
方法2:用purrr批量处理(简洁高效)
用purrr的map_dfr函数批量提取系数并合并成数据框,无需手动写循环:
library(purrr) # 提取每个分组的系数,自动合并为数据框,保留分组ID ols_stored_coef <- map_dfr(ols_split, ~as.data.frame(t(coef(.x))), .id = "group") # 把group列转成数值型(原.id返回的是字符串) ols_stored_coef$group <- as.integer(ols_stored_coef$group)
方法3:用data.table提速(大数据场景首选)
如果处理超大规模数据,data.table的绑定操作速度更快:
library(data.table) # 批量提取系数并组合成data.table,保留分组ID ols_stored_coef <- rbindlist( lapply(ols_split, function(x) data.table(t(coef(x)))), idcol = "group" ) # 转换分组ID为数值型 ols_stored_coef$group <- as.integer(ols_stored_coef$group)
关键注意点
- 列表元素访问:
ols_split[[i]]是正确的索引方式,之前失败是因为错误地用字符串硬编码索引,没有让i作为变量生效。 - 系数提取效率:
coef()函数直接从模型对象提取系数,比调用summary()再取coefficients更高效,避免了计算额外统计量的开销。 - 批量处理优势:
map_dfr或rbindlist这类批量函数代码更简洁,出错概率更低,在分组数量多的时候尤其好用。
内容的提问来源于stack exchange,提问作者eades
相关产品推荐
相关产品推荐

