如何使用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
相关产品推荐
相关产品推荐

