为何ggpredict()与ggemmeans()对混合效应模型的预测结果存在差异?
我使用ggeffects包1.3.0版本中的ggpredict()和ggemmeans()函数,为混合效应模型计算均值估计值与置信区间(CI)。这两个函数分别基于predict()和emmeans()实现,输出结果适配ggplot可视化,但二者得出的预测均值与CI均存在差异。
以下为可复现示例,基于RIKZ数据集(Janssen & Mulder 2005;Zuur等2007),该数据集研究物种丰富度(物种数量)随采样站相对平均潮位高度(NAP,单位:米)和暴露程度(含低、中、高三个水平的因子)的变化:
rm(list=ls()) if (!require(pacman)) install.packages('pacman'); library(pacman) p_load(emmeans) p_load(ggplot2) p_load(ggpubr) p_load(ggeffects) p_load(lme4, lmerTest, glmmTMB) p_load(RCurl) # 获取数据: RIKZ <- read.csv(text = RCurl::getURL( "https://raw.githubusercontent.com/marcoplebani85/datasets/master/RIKZ.csv")) str(RIKZ) # 将"Exposure"转换为因子: RIKZ$Exposure <- as.factor(RIKZ$Exposure)
我使用glmmTMB()拟合了带有泊松分布残差的广义混合效应模型:
mem1 <- glmmTMB(Richness ~ NAP+Exposure + (1 | Beach), family="poisson", data = RIKZ, REML=T)
通过ggeffects::ggpredict()获取模型预测值与CI,不考虑随机效应的不确定性:
richness.predicted <- ggpredict(mem1, terms=c("NAP", "Exposure"), type="fixed")
通过ggeffects::ggemmeans()获取同一模型的预测值与CI,同样不考虑随机效应的不确定性:
richness.emmeans <- ggemmeans(mem1, terms=c("NAP", "Exposure"), type="fixed")
将两组预测结果与观测数据可视化:
p1 <- plot(richness.predicted, add.data=T) + labs(title="ggpredict()的预测结果") + ylim(0,45) + theme(text = element_text(size = 15)) p2 <- plot(richness.emmeans, add.data=T) + labs(title="ggemmeans()的预测结果") + ylim(0,45) + theme(text = element_text(size = 15)) ggarrange(p1, p2, ncol=2, labels=c("(a)", "(b)"), common.legend=T, legend="bottom")

为何这两组均值估计值与置信区间存在差异?
更新说明:
关于两个函数的差异,官方文档有如下解释:
ggpredict()返回的是条件效应(即基于因子的特定参考水平),而ggemmeans()返回的是边际均值,因为效应是对因子水平进行“边缘化”(或“平均化”)处理的。但这些差异仅适用于非焦点项,即未在terms参数中指定的剩余变量。
文档进一步说明:
当所有分类预测变量都在
terms中指定,且其他(非焦点)项仅为数值型时,结果也会一致(因为ggpredict()和ggemmeans()默认均使用均值来固定非焦点数值变量)。
我猜测混合效应模型中两个函数预测结果存在差异的原因在于它们对随机效应的处理方式,但具体机制尚不明确。
参考文献:
- Janssen, G. and Mulder, S. (2005), Zonation of macrofauna across sandy beaches and surf zones along the Dutch coast. Oceanologia 47(2): 265-282.
- Zuur, A.F., Ieno, E.N., and Smith, G.M. (2007), Analysing ecological data. Springer Science & Business Media
- ggeffects官方文档:随机效应介绍
- ggeffects官方文档:predict与emmeans的技术差异
内容的提问来源于stack exchange,提问作者Marco Plebani

