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

为何aggte()输出的置信区间与tidy()提取的结果不一致?

问题:did包中aggte()直接输出与tidy()提取的置信区间不一致

我使用did包基于条件平行趋势假设进行估计,仅设置1个处理组(搭配7个从未接受处理的控制组),即单一处理时点。用type="simple"的aggte()函数计算ATT时,R直接显示的MP对象置信区间,和用tidy()提取的估计值、标准误及置信区间结果不一致。尝试type="group"参数后,差异依然存在。

相关代码:

library(did)
data(mpdta)
mw.attgt.X <- att_gt(yname = "lemp",
gname = "first.treat",
idname = "countyreal",
tname = "year",
xformla = ~lpop,
data = mpdta,
)

mw.attgt.X

aggte(mw.attgt.X, type = "simple")
tidy(aggte(mw.attgt.X, type = "simple"))


aggte(mw.attgt.X, type = "group")
tidy(aggte(mw.attgt.X, type = "group"))

核心原因

aggte()直接打印的置信区间是基于个体聚类标准误计算的(att_gt()默认按idname指定的countyreal做聚类调整),但broom包的tidy()函数处理MP类对象时,默认使用未做聚类调整的普通标准误,两者计算逻辑不同,导致置信区间出现差异。

解决方法

方法1:直接从MP对象提取聚类调整后的结果

aggte()返回的对象已包含正确的聚类调整后统计量,可直接访问:

# 保存aggte结果
simple_agg <- aggte(mw.attgt.X, type = "simple")
# 提取估计值、标准误及95%置信区间
result_df <- data.frame(
  estimate = simple_agg$overall.att,
  std.error = simple_agg$se.overall.att,
  conf.low = simple_agg$overall.att - 1.96 * simple_agg$se.overall.att,
  conf.high = simple_agg$overall.att + 1.96 * simple_agg$se.overall.att
)
print(result_df)

方法2:通过summary()转换为tidy格式

利用did包的summary()函数先生成带聚类标准误的汇总结果,再用tidy()转换,输出结果会和aggte()直接打印的一致:

# 生成summary对象
simple_summary <- summary(aggte(mw.attgt.X, type = "simple"))
# 转换为tidy格式
tidy(simple_summary)

验证差异根源

对比两种方式的标准误,可明确差异来源:

# aggte直接输出的聚类标准误
aggte(mw.attgt.X, type = "simple")$se.overall.att
# tidy默认输出的未调整标准误
tidy(aggte(mw.attgt.X, type = "simple"))$std.error

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:52:24