如何从R语言did包输出中提取精确p值与自由度?
从did包的多期多组DiD结果中提取精确p值与自由度
在使用did包进行多期多组DiD分析时,默认summary()输出仅标识p值是否小于0.05,但可以通过提取结果对象的核心统计量自行计算精确p值,具体操作如下:
1. 提取核心统计量
aggte()生成的结果对象中,已经包含计算p值所需的关键数据:
group_effects$att:各组的ATT估计值group_effects$se:对应估计值的标准误
2. 计算双侧精确p值
did包默认采用正态近似构建置信区间,因此可以基于正态分布计算双侧p值,公式为:p值 = 2 * pnorm(-|统计量|),其中统计量 = ATT估计值 / 标准误
代码示例(基于你的复现场景)
library(did) data("mpdta") # 估计组水平ATT out <- att_gt( yname = "lemp", gname = "first.treat", idname = "countyreal", tname = "year", xformla = ~ 1, data = mpdta, est_method = "reg" ) group_effects <- aggte(out, type = "group") # 提取统计量并计算p值 att_vals <- group_effects$att se_vals <- group_effects$se p_vals <- 2 * pnorm(-abs(att_vals / se_vals)) # 整理为可读表格 result_table <- data.frame( 处理组 = group_effects$group, ATT估计值 = round(att_vals, 4), 标准误 = round(se_vals, 4), 精确p值 = round(p_vals, 4) ) print(result_table)
关于自由度的说明
如果需要提取自由度:
- 当使用
est_method="reg"时,att_gt()的输出out$models包含每个处理组对应的回归模型,可通过循环提取残差自由度:# 提取各组回归模型的残差自由度 df_list <- lapply(out$models, function(m) m$df.residual) - 不过did包默认使用正态近似推断,样本量较大时该近似结果足够可靠,无需额外用t分布调整。
内容的提问来源于stack exchange,提问作者user26896348
相关产品推荐
相关产品推荐

