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

如何为双重差分表格的所有统计值生成对应标准误?

双重差分(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"

解决方案:手动整合统计量或用专业包快速生成

方法一:手动计算并整合(适合理解原理)

通过分步计算分组统计量、差值及其标准误,最终合并为统一表格:

  1. 计算分组基础统计量
    用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"
  )
  1. 转换为宽格式方便计算差值
    将均值、标准误分别转为宽格式(行是分组,列是时间节点):
# 均值宽表
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)
  1. 计算组内时间差值及标准误
    组内差值(改革后-改革前)的标准误采用独立样本差值方差公式:$\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)
  1. 计算组间差值及双重差分标准误
    双重差分的标准误是两组内差值标准误的平方和开根号:
# 组间差值(控制组-处理组)的均值行
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)
  1. 整合均值与标准误为最终表格
    将标准误用括号标注在均值后,得到直观的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:20:24