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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:53:23