为何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
相关产品推荐
相关产品推荐

