You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 19:11:31