如何将vegan包adonis对象转为lm类以使用lsmeans做Tukey校正比较?
Hey there! 你遇到的这个问题其实挺常见的——adonis2输出的anova.cca类对象确实没法直接塞进lsmeans里,而且直接转换为lm/aov/manova这类线性模型类是绝对不可行的,原因很简单:PERMANOVA是基于距离矩阵的非参数分析,它的底层逻辑和传统线性模型完全不同,硬转出来的结果不仅没有统计意义,还会误导你。
不过别担心,有几个靠谱的替代方案能帮你实现交互项的Tukey校正比较:
方案1:用vegan自带的pairwise.adonis2(最直接)
从vegan 2.6版本开始,官方提供了pairwise.adonis2函数,专门用来做PERMANOVA的事后两两比较,完美支持Tukey校正。用法很简单:
假设你的原始模型是这样的:
library(vegan) # 构建距离矩阵(比如Bray-Curtis) dist_mat <- vegdist(my_data[, -c(1,2)], method = "bray") # 拟合含交互项的PERMANOVA模型 mod <- adonis2(dist_mat ~ A * B, data = my_data)
要对交互项A:B做Tukey校正的两两比较,直接运行:
pairwise.adonis2(mod, by = "A:B", p.adjust = "tukey")
by参数指定你要分析的交互项;p.adjust = "tukey"就是你需要的Tukey校正方法。
这个方法的结果完全贴合PERMANOVA的分析逻辑,是最推荐的选择。
方案2:维度缩减后用emmeans/lsmeans(适合可视化探索)
如果你需要更灵活的对比(比如特定组的配对比较,或者想结合可视化),可以先把距离矩阵做维度缩减(比如PCoA或NMDS),然后对得到的轴分数拟合传统线性模型,再用emmeans(lsmeans的替代包,现在官方更推荐emmeans,lsmeans已经停止维护了)来做事后比较:
步骤如下:
library(vegan) library(emmeans) # 1. 做PCoA(基于你的距离矩阵) pcoa_res <- capscale(dist_mat ~ 1, data = my_data) # 提取样本的轴分数(比如前2个轴,解释大部分变异) site_scores <- scores(pcoa_res, display = "sites")[, 1:2] # 合并到原数据框 new_data <- cbind(my_data, site_scores) # 2. 对每个轴拟合aov模型 mod_aov1 <- aov(MDS1 ~ A * B, data = new_data) mod_aov2 <- aov(MDS2 ~ A * B, data = new_data) # 3. 用emmeans做Tukey校正的交互项比较 emmeans(mod_aov1, pairwise ~ A:B, adjust = "tukey") emmeans(mod_aov2, pairwise ~ A:B, adjust = "tukey")
注意:这个方法是基于维度缩减后的轴来分析的,和原始PERMANOVA的结果不完全等价,但可以帮你直观探索交互项在群落主要变异梯度上的差异,适合配合NMDS/PCoA图展示结果。
重要提醒
别再纠结把anova.cca对象转成线性模型类了,不仅行不通还会出错。优先用方案1的pairwise.adonis2,这是官方专门为PERMANOVA事后比较设计的工具;如果需要更灵活的分析,再考虑方案2。另外,建议尽快从lsmeans迁移到emmeans,后者功能更完善,维护更活跃。
内容的提问来源于stack exchange,提问作者J.Con

