在R中检验不同回归模型的treat系数是否存在显著差异
检验不同回归模型系数相等性的实现方法
针对你需要检验treat对Y1、Y2的效应是否一致的需求,以下提供两种无需堆叠因变量的事后检验方法:
方法一:手动构造Wald检验(考虑残差相关性)
由于两个模型基于同一观测样本,Y1和Y2的残差大概率存在相关性,必须纳入联合方差计算,步骤如下:
- 提取核心统计量并计算协方差
# 提取treat的系数 coef_Y1 <- coef(twfe_Y1)["treat::1"] coef_Y2 <- coef(twfe_Y2)["treat::1"] # 提取模型残差 resid_Y1 <- residuals(twfe_Y1) resid_Y2 <- residuals(twfe_Y2) # 计算聚类层面的残差协方差(与原模型聚类标准误逻辑一致) library(dplyr) cluster_cov <- dt %>% group_by(group) %>% summarise(cov = mean(resid_Y1 * resid_Y2)) %>% pull(cov) %>% mean() # 提取两个模型treat系数的方差 var_Y1 <- vcov(twfe_Y1)["treat::1", "treat::1"] var_Y2 <- vcov(twfe_Y2)["treat::1", "treat::1"] # 计算系数差的方差:var(Y1-Y2) = var(Y1) + var(Y2) - 2*cov(Y1,Y2) var_diff <- var_Y1 + var_Y2 - 2 * cluster_cov
- 计算Wald统计量与p值
# 计算系数差值 coef_diff <- coef_Y1 - coef_Y2 # 构造Wald统计量(服从自由度1的卡方分布) wald_stat <- (coef_diff)^2 / var_diff # 计算对应的p值 p_value <- 1 - pchisq(wald_stat, df = 1) # 输出结果 cat(sprintf("treat效应差值: %.4f\nWald统计量: %.4f\np值: %.4f\n", coef_diff, wald_stat, p_value))
方法二:使用modelsummary包的联合假设检验
modelsummary支持直接对多模型系数做假设检验,无需手动计算协方差:
- 安装并加载包
install.packages("modelsummary") library(modelsummary)
- 执行假设检验
# 定义检验假设:treat对Y1的效应 = treat对Y2的效应 hypotheses <- c("treat::1 (twfe_Y1) = treat::1 (twfe_Y2)") # 执行检验,指定与原模型一致的聚类标准误 model_test <- hypothesis_test(list(twfe_Y1, twfe_Y2), hypotheses = hypotheses, vcov = ~group) # 输出检验结果 print(model_test)
关键注意事项
- 必须考虑残差相关性:忽略Y1、Y2残差的协方差会导致标准误估计偏误,进而影响检验的准确性。
- 适配其他倍分法包:如果使用
did等其他包,只需替换提取系数、残差的代码,核心检验逻辑保持不变。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

