组间比较时EMMEANS失效,如何通过单次ANCOVA完成正确成对比较
拆分3个子集分别拟合两两ANCOVA的做法存在统计偏差:每次仅使用部分样本估计残差,检验效能不稳定,且未做统一的多重比较校正,假阳性风险高。通过1次全样本建模即可完成所有成对比较,核心步骤如下:
第一步:先验证斜率齐性前提
异速生长曲线(log转换后为线性关系)的高程比较,必须满足组间斜率同质的前提,也就是协变量与分组变量的交互项无统计学显著性——这也是之前emmeans结果不符合预期的最常见原因:如果直接在带交互项的模型上运行默认的emmeans比较,得到的是协变量均值处的单点差异,当斜率存在组间差异时,这个结果不代表整体高程差,自然和两两拟合的结果不一致。
首先拟合纳入全部3组样本的全模型,不做子集拆分:
# 全样本带交互项模型,用于检验斜率齐性 full_model <- lm(Q.log ~ Endo.log * Family, data = CrocaCerCData) anova(full_model)
根据交互项的检验结果分两种情况处理:
- 若
Endo.log:Family的p值>0.05,说明各组异速生长斜率无显著差异,满足高程比较前提,移除交互项拟合最终ANCOVA主效应模型:
ancova_final <- lm(Q.log ~ Endo.log + Family, data = CrocaCerCData)
- 若交互项显著,说明各组异速生长斜率本身存在差异,曲线存在交叉,不存在统一的整体高程差,此时不能做笼统的高程比较,需要在关心的具体协变量取值位置比较组间预测值差异。
第二步:单次模型完成成对比较
斜率同质场景(可直接比较高程)
使用emmeans计算调整后边际均值(即校正了协变量影响的组间均值,对应异速生长曲线的高程),直接输出三组两两比较结果,多重比较采用三组比较最常用的Tukey法校正:
library(emmeans) # 成对比较组间高程差异 pairwise_res <- emmeans(ancova_final, specs = pairwise ~ Family, adjust = "tukey") pairwise_res
输出结果的contrasts模块就是1.Extant/2.Metriorhynchid/2.Non-metriorhynchid三组的两两高程差异检验结果,由于使用全部样本估计模型参数,结果比拆分子集的两两检验更稳定可靠,显著性趋势会和之前两两拟合的结果一致。
斜率不齐场景(无统一高程差)
此时需要指定协变量的代表性取值点位(比如取协变量的最小值、四分位数、中位数、最大值),比较对应点位上的组间预测值差异:
# 在Endo.log的5个代表性分位点处做组间成对比较 pairwise_res_slope <- emmeans(full_model, specs = pairwise ~ Family, at = list(Endo.log = quantile(CrocaCerCData$Endo.log, probs = c(0, 0.25, 0.5, 0.75, 1))), adjust = "tukey") pairwise_res_slope
注意:不要在带交互项的模型上直接运行不指定
at参数的emmeans组间比较,此时输出的均值差仅对应协变量总均值位置的差异,斜率差异较大时这个结果没有实际生物学意义,很容易出现和预期不符的显著性结果。
拆分子集两两拟合的固有问题
- 每次检验仅使用2/3的总样本,残差自由度更低,残差标准误估计偏差大,一类错误、二类错误率都会升高
- 三次独立检验未做统一的多重比较校正,整体假阳性率远高于0.05的设定阈值
- 不同子集模型的斜率、截距估计独立,结果不具备整体一致性
内容的提问来源于stack exchange,提问作者Arthur Erb

