如何在R中绘制展示年度处理组与对照组差异的事件研究图?
在R中绘制事件研究图(Event Study Plot)的方法
基于你提供的数据集,我们可以通过数据预处理计算相对事件时间,再用ggplot2绘制带置信区间的事件研究图,展示处理组与对照组的年度结果差异,匹配目标图的样式(横轴为事件前后相对年度,纵轴为组间差异,带误差棒的点线图)。
1. 数据预处理
首先将日期转换为以2015年(事件发生年)为基准的相对年份,再分组计算组间差异及置信区间:
library(tidyverse) library(lubridate) # 加载你提供的数据集 groups <- c("A", "B", "C", "D", "E") data <- tibble(id=1:10000, date=sample(seq(as.Date("2006-01-01"), as.Date("2019-01-01"), by="day"), 10000, replace = T), group=sample(groups, 10000, replace=T), treat=ifelse(group %in% c("A", "B"), 1, 0), after=ifelse(date>as.Date("2015-05-01"), 1, 0), results=rnorm(10000)+ifelse(treat*after==1, 0.2, 0) ) # 计算相对事件年份:以2015年为事件基准年 event_year <- 2015 data <- data %>% mutate(year = year(date), rel_year = year - event_year) %>% # 过滤数据范围,只保留事件前后合理年份 filter(rel_year %in% -9:4) # 按相对年份、处理组计算结果的均值、标准误和置信区间 summary_stats <- data %>% group_by(rel_year, treat) %>% summarise( mean_res = mean(results), se = sd(results)/sqrt(n()), lower_ci = mean_res - 1.96*se, upper_ci = mean_res + 1.96*se ) %>% ungroup() # 计算处理组与对照组的结果差异及差异的置信区间 diff_stats <- summary_stats %>% pivot_wider( names_from = treat, values_from = c(mean_res, lower_ci, upper_ci) ) %>% mutate( diff = mean_res_1 - mean_res_0, diff_lower = lower_ci_1 - upper_ci_0, diff_upper = upper_ci_1 - lower_ci_0 )
2. 绘制事件研究图
使用ggplot2绘制带置信区间的点线图,标记事件发生时间:
ggplot(diff_stats, aes(x = rel_year, y = diff)) + # 绘制95%置信区间误差棒 geom_errorbar(aes(ymin = diff_lower, ymax = diff_upper), width = 0.2, color = "#333333") + # 绘制数据点和连接线 geom_point(size = 2.5, color = "#1f77b4") + geom_line(color = "#1f77b4", linewidth = 1) + # 添加事件发生时间的垂直虚线 geom_vline(xintercept = 0, linetype = "dashed", color = "#ff7f0e", linewidth = 1) + # 自定义横轴标签,明确事件前后年份 scale_x_continuous( breaks = unique(diff_stats$rel_year), labels = paste0(ifelse(unique(diff_stats$rel_year) < 0, "前", "后"), abs(unique(diff_stats$rel_year)), "年") ) + # 设置坐标轴与标题 labs( x = "相对事件时间", y = "处理组与对照组结果差异", title = "事件研究图:处理效应年度变化" ) + # 优化主题样式 theme_minimal() + theme( plot.title = element_text(hjust = 0.5, size = 14, face = "bold"), axis.title = element_text(size = 12), axis.text = element_text(size = 10) )
图说明
- 橙色虚线标记事件发生时间(2015年)
- 蓝色点线代表处理组与对照组的年度结果差异
- 黑色误差棒为95%置信区间,展示差异的统计显著性
内容的提问来源于stack exchange,提问作者Ajern
相关产品推荐
相关产品推荐

