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

如何使用emmeans包获取自定义分组的估计边际均值?

如何使用emmeans包获取自定义分组的估计边际均值?

你想要计算gear3和gear4的自定义分组边际均值,其实本质上是构造这些子组边际均值的加权平均线性组合——emmeans的contrast函数不仅能做差异对比,还能完美实现这个需求,只要我们给目标组设置合适的权重就行。结合你现有的代码和输出,我给你两种常见场景的具体实现方法:

场景1:不区分vs,合并gear3和gear4的所有子组取平均

你的emm对象里,gear3和gear4分别对应vs0和vs1两个子组,共4行数据。我们要给这4行各分配1/4的权重(总和为1),就能得到它们的合并平均边际均值:

# 先获取你已经生成的emmeans对象
mod <- lm(mpg ~ factor(gear) * factor(vs), data = mtcars)
emm <- emmeans(mod, ~ gear * vs)

# 构造自定义加权平均:给gear3/vs0、gear4/vs0、gear3/vs1、gear4/vs1各0.25权重
custom_combined_mean <- contrast(
  emm,
  list(gear3_4_combined = c(0.25, 0.25, 0, 0.25, 0.25, 0))
)

# 查看结果
custom_combined_mean

运行后你会得到类似这样的输出(手动计算验证:(15.1+21.0+20.3+25.2)/4 = 20.4,和计算结果一致):

contrast           estimate   SE df lower.CL upper.CL
 gear3_4_combined      20.4 0.94 26     18.4     22.4

Confidence level used: 0.95

场景2:按vs分组,分别计算每个vs下gear3和gear4的平均

如果你想在每个vs水平下,单独计算gear3和gear4的平均边际均值,可以用by = "vs"参数拆分数据,此时每个vs组内只有3个gear水平(3、4、5),我们给gear3和gear4各分配0.5的权重即可:

# 按vs分组,计算每个vs下gear3和gear4的平均
custom_mean_by_vs <- contrast(
  emm,
  list(gear3_4_avg = c(0.5, 0.5, 0)),
  by = "vs"
)

# 查看结果
custom_mean_by_vs

这个代码会输出两个结果:分别对应vs0下gear3和gear4的平均,以及vs1下的平均,比如:

vs = 0:
 contrast   estimate   SE df lower.CL upper.CL
 gear3_4_avg      18.0 1.87 26     14.2     21.9

vs = 1:
 contrast   estimate   SE df lower.CL upper.CL
 gear3_4_avg      22.7 1.46 26     19.7     25.7

Confidence level used: 0.95

小提示

如果你的自定义分组不是简单的平均,也可以调整权重向量:比如你想给gear3的权重是2/3、gear4是1/3,只要把对应位置的权重改成2/3和1/3就行,只要权重总和为1,得到的就是加权边际均值。

备注:内容来源于stack exchange,提问作者A. Bohyn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 12:05:32