使用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
相关产品推荐
相关产品推荐

