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

使用broom::tidy处理含聚类标准误的felm结果时出错

我刚踩过一模一样的坑!咱们先把问题复现出来,再一步步解决:

问题复现代码

先贴出能复现报错的代码(用lfe自带的示例数据模拟你的场景):

library(lfe)
library(broom)

# 加载lfe内置的面板数据
data(Produc)

# 无聚类标准误的模型:tidy提取固定效应正常
est1 <- felm(gsp ~ unemp | state + year | 0 | 0, data = Produc)
tidy(est1, effects = "fixed") # 完全没问题

# 按state(模拟你的企业层面)聚类的模型:提取固定效应报错
est2 <- felm(gsp ~ unemp | state + year | 0 | state, data = Produc)
tidy(est2, effects = "fixed") # 弹出报错:Error in overscope_eval_next(overscope, expr) : object 'se' not found

问题根源

简单说:broom::tidy()在处理带聚类标准误的felm对象时,提取固定效应的逻辑有漏洞——它默认认为固定效应的标准误存在于模型对象的fixef属性里,但聚类模型的固定效应标准误并没有被自动存到这个位置,导致tidy函数找不到se对象。

两种解决方案

方案1:用lfe自带的getfe()提取(最靠谱,推荐)

lfe包本身提供了专门提取固定效应的函数getfe(),不管有没有聚类都能正常输出效应值和标准误,我们只需要把它转成tidy格式就行:

# 直接提取固定效应及标准误
fe_results <- getfe(est2)

# 转换成broom风格的tidy数据框
tidy_fe <- data.frame(
  term = paste(fe_results$fe, fe_results$idx, sep = "_"), # 生成类似state_Alabama的变量名
  estimate = fe_results$effect, # 点估计值
  std.error = fe_results$se, # 置信区间用的标准误
  group = fe_results$fe # 区分是state还是year固定效应
)

# 查看结果
head(tidy_fe)

方案2:手动补全模型对象的se属性(临时hack)

如果你特别想用broom::tidy()的统一格式,可以手动把固定效应的标准误补到模型对象里,让tidy函数能找到它:

# 先提取固定效应的标准误
fe_se <- getfe(est2)$se

# 把标准误添加到模型的fixef属性中
est2$fixef <- lapply(est2$fixef, function(x) {
  attr(x, "se") <- fe_se[names(x)]
  x
})

# 现在再用tidy提取固定效应就正常了
tidy(est2, effects = "fixed")

不过这个方法每次拟合新模型都要重复操作,不如方案1稳定。

内容的提问来源于stack exchange,提问作者jfeigenbaum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:17:09