事件研究项目中按个体分组、基于事件时间的结果均值计算及R语言实现方案问询
如何在R中实现事件研究的均值计算(排除事件年份早于目标年份的个体)
首先,我们明确你的需求:要计算特定目标年份下结果变量的均值,但需要排除那些事件发生年份早于该目标年份的个体,同时只保留该目标年份有观测记录的个体。下面我会用两种方法实现这个逻辑——一种是用dplyr(更简洁直观,适合数据处理),另一种是基础R代码(不需要额外包)。
先修正模拟数据的创建方式
你原来用cbind创建数据会导致列变成因子类型,我们改用data.frame直接创建,确保所有变量都是数值型:
df <- data.frame( ID = c(1,1,1,1,2,2,2,3,3), year = c(2018,2019,2020,2021,2019,2020,2021,2018,2020), outcome = c(1,1,0,0,1,0,0,0,1), event_year = c(2019,2019,2019,2019,2020,2020,2020,2017,2017) )
方法一:使用dplyr包(推荐)
dplyr的管道语法非常适合这种分组筛选+聚合的操作:
# 加载dplyr包(如果没安装先运行install.packages("dplyr")) library(dplyr) # 设定目标年份(这里是你例子中的2019年) target_year <- 2019 # 计算符合条件的均值 mean_result <- df %>% # 第一步:筛选出目标年份的所有观测 filter(year == target_year) %>% # 第二步:按个体ID分组,只保留事件年份不早于目标年份的个体 group_by(ID) %>% filter(event_year >= target_year) %>% # 取消分组,计算结果变量的均值 ungroup() %>% summarise(average_outcome = mean(outcome)) # 查看结果 print(mean_result)
运行后你会得到:
# A tibble: 1 × 1 average_outcome <dbl> 1 0.5
完全符合你预期的结果。
方法二:使用基础R代码
如果你不想加载额外的包,可以用基础R的索引和聚合函数实现:
# 设定目标年份 target_year <- 2019 # 1. 先筛选出目标年份的观测数据 target_data <- df[df$year == target_year, ] # 2. 找出事件年份不早于目标年份的有效个体ID valid_ids <- unique(target_data$ID[target_data$event_year >= target_year]) # 3. 提取这些有效个体的结果变量值 valid_outcomes <- target_data$outcome[target_data$ID %in% valid_ids] # 4. 计算均值 mean_result <- mean(valid_outcomes) # 查看结果 print(mean_result)
运行后同样会输出0.5。
逻辑解释
- 首先我们锁定了目标年份(2019)的所有观测,得到个体1和个体2的记录(个体3在2019年没有数据,自然不会被纳入)。
- 然后我们过滤掉事件年份早于目标年份的个体:个体3的事件年份是2017,早于2019,但它在目标年份没有记录,所以不影响;而个体1(事件2019)和个体2(事件2020)都符合条件,保留它们的结果值计算均值。
内容的提问来源于stack exchange,提问作者Ludwig Gershwin
相关产品推荐
相关产品推荐

