dplyr中mutate与summarize分组均值差异及回归适配问题
问题分析与解决方案
为什么mutate和summarize的均值结果有差异?
这是两种函数的本质差异导致的:
mutate:为每个组的每一行都复制组内统计值,所以整个数据集的均值等于原始数据的均值——因为每个原始观测都被计入了统计,相当于组均值被重复了n次(n是组内样本量)。summarize:把每个组压缩成一行,此时如果直接取聚合后m.mortf的均值,得到的是各组均值的简单平均(即所有组的死亡率相加除以组数),而非原始数据的加权平均(权重是每组的样本量n)。
看你的数据:原始100行只有2个死亡,所以真实死亡率是0.02;而summarize后,那些只有1个死亡观测的组(死亡率=1)会和大组(死亡率=0)在简单平均中占相同权重,自然拉高了整体均值到0.027左右。
如何让聚合数据集适配后续DID回归?
要避免回归结果因均值偏移失真,核心是让回归模型考虑组大小的权重,因为聚合后的每组代表了不同数量的原始观测。具体有两种实现方式:
方式1:聚合时保留关键分量,回归用加权最小二乘法
先在聚合时计算每组的样本量、总权重、死亡数等核心指标,后续回归用这些指标作为权重:
# 优化后的聚合代码 red_agg <- red11 %>% group_by(hosptg, quarter.adm, g.mdc) %>% summarize( n = n(), # 组内原始样本量 total_group_weight = sum(n.group), # 组内权重总和 female_pct = mean(sex == '1', na.rm = TRUE), avg_age = mean(age, na.rm = TRUE), death_count = sum(deceased == '1'), m.mortf = death_count / n, # 组内简单死亡率(和mean结果一致) w.mortf = sum((deceased == '1') * n.group) / total_group_weight # 手动计算加权死亡率 ) # 验证:用组样本量加权后的m.mortf均值和原始一致 weighted.mean(red_agg$m.mortf, red_agg$n) # 输出0.02
然后在DID回归中使用加权最小二乘法,让大组的影响更符合原始数据的占比:
# 针对简单死亡率m.mortf的回归,用组样本量n作为权重 lm(m.mortf ~ treatment * year, data = red_agg, weights = n) # 针对加权死亡率w.mortf的回归,用组内权重总和total_group_weight作为权重 lm(w.mortf ~ treatment * year, data = red_agg, weights = total_group_weight)
方式2:展开聚合数据(不推荐,仅作补充)
如果一定要让聚合后的数据集简单均值等于原始均值,可以将每组重复n次,回到类似mutate的结构,但这样会失去聚合的意义,一般不推荐:
red_expanded <- red211 %>% uncount(n) # 按组大小n展开行 # 此时red_expanded的m.mortf均值等于原始0.02 mean(red_expanded$m.mortf)
关键注意点
- 你的
sex变量标签是c("0", "1"),对应你描述的女性是1,所以sex == '1'的计算是正确的,无需调整。 - 加权回归的核心逻辑是:聚合后的每组代表了不同数量的原始观测,回归时必须给大组更高的权重,才能让结果反映真实的总体情况,避免简单平均带来的偏差。
内容的提问来源于stack exchange,提问作者chrischi
相关产品推荐
相关产品推荐

