如何为双重差分表格的所有统计值生成对应标准误?
双重差分(DID)表格整合均值、差值及对应标准误的实现方法
数据集定义
首先是你使用的数据集代码:
data<-data.frame(c("R1", "R2", "R3", "R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R12"), c(2005,2005,2005,2006,2006,2006,2005,2005,2005,2006,2006,2006), c(0,0,0,0,0,0,1,1,1,1,1,1), c(1,0,1,1,0,1,1,1,1,0,0,1)) colnames(data)<-c("id", "time", "group", "med.use") data$group[data$group==1]<-"treated" data$group[data$group==0]<-"control" data$time[data$time==2005]<-"prior_reform" data$time[data$time==2006]<-"after_reform"
解决方案:手动整合统计量或用专业包快速生成
方法一:手动计算并整合(适合理解原理)
通过分步计算分组统计量、差值及其标准误,最终合并为统一表格:
- 计算分组基础统计量
用dplyr分组计算均值、方差、样本量和标准误:
library(dplyr) summary_stats <- data %>% group_by(group, time) %>% summarise( mean_val = mean(med.use, na.rm = TRUE), var_val = var(med.use, na.rm = TRUE), n = n(), se = sqrt(var_val / n), .groups = "drop" )
- 转换为宽格式方便计算差值
将均值、标准误分别转为宽格式(行是分组,列是时间节点):
# 均值宽表 wide_mean <- summary_stats %>% select(group, time, mean_val) %>% pivot_wider(names_from = time, values_from = mean_val) # 标准误宽表 wide_se <- summary_stats %>% select(group, time, se) %>% pivot_wider(names_from = time, values_from = se)
- 计算组内时间差值及标准误
组内差值(改革后-改革前)的标准误采用独立样本差值方差公式:$\sqrt{SE_{前}^2 + SE_{后}^2}$
wide_mean$dif_time <- wide_mean$after_reform - wide_mean$prior_reform wide_se$dif_time <- sqrt(wide_se$prior_reform^2 + wide_se$after_reform^2)
- 计算组间差值及双重差分标准误
双重差分的标准误是两组内差值标准误的平方和开根号:
# 组间差值(控制组-处理组)的均值行 diff_row_mean <- tibble( group = "difference", prior_reform = wide_mean$prior_reform[wide_mean$group == "control"] - wide_mean$prior_reform[wide_mean$group == "treated"], after_reform = wide_mean$after_reform[wide_mean$group == "control"] - wide_mean$after_reform[wide_mean$group == "treated"], dif_time = wide_mean$dif_time[wide_mean$group == "control"] - wide_mean$dif_time[wide_mean$group == "treated"] ) # 组间差值的标准误行 diff_row_se <- tibble( group = "difference", prior_reform = sqrt(wide_se$prior_reform[wide_se$group == "control"]^2 + wide_se$prior_reform[wide_se$group == "treated"]^2), after_reform = sqrt(wide_se$after_reform[wide_se$group == "control"]^2 + wide_se$after_reform[wide_se$group == "treated"]^2), dif_time = sqrt(wide_se$dif_time[wide_se$group == "control"]^2 + wide_se$dif_time[wide_se$group == "treated"]^2) ) # 合并所有行 final_mean <- bind_rows(wide_mean, diff_row_mean) final_se <- bind_rows(wide_se, diff_row_se)
- 整合均值与标准误为最终表格
将标准误用括号标注在均值后,得到直观的DID表格:
did_table <- final_mean %>% mutate( prior_reform = paste0(round(prior_reform, 3), " (", round(final_se$prior_reform, 3), ")"), after_reform = paste0(round(after_reform, 3), " (", round(final_se$after_reform, 3), ")"), dif_time = paste0(round(dif_time, 3), " (", round(final_se$dif_time, 3), ")") ) # 重命名列名 colnames(did_table) <- c("分组", "改革前均值(SE)", "改革后均值(SE)", "组内差值(SE)")
运行后did_table即为包含所有单元格统计量的完整DID表格。
方法二:用modelsummary包快速生成(高效便捷)
如果不需要手动推导,直接用专业包可以一键生成规范的DID表格,自动计算所有均值、差值和标准误:
library(modelsummary) # 拟合DID回归模型 did_model <- lm(med.use ~ group * time, data = data) # 生成平衡表形式的DID统计表格 datasummary_balance(~ group * time, data = data, outcome = "med.use")
内容的提问来源于stack exchange,提问作者Albert
相关产品推荐
相关产品推荐

