如何用adonis2同时检验主效应与交互项的边际效应?
问题
我的研究设计包含三个存在交互作用的因子,且拥有16S微生物群落数据。我希望构建一个模型,无需指定因子顺序(默认设置),即可检验所有主效应(A、B、C)、双向交互项(A:B、A:C、B:C)以及三向交互项(A:B:C),理想输出类似Type III Anova。
使用边际检验(by = "margin")无法实现需求,因为该设置仅显示交互项的显著性结果,无法呈现主效应。以下是双因子可复现示例:
library(vegan) data(dune) data(dune.env) adonis2(dune~Moisture*Manure, data = dune.env, permutations = 999, method = "bray", strata = dune.env$Management, by = "margin")
输出:
Permutation test for adonis under reduced model Marginal effects of terms Blocks: strata Permutation: free Number of permutations: 999 adonis2(formula = dune ~ Moisture * Manure, data = dune.env, permutations = 999, method = "bray", by = "margin", strata = dune.env$Management) Df SumOfSqs R2 F Pr(>F) Moisture:Manure 4 0.4678 0.10881 0.9213 0.451 Residual 8 1.0154 0.23620 Total 19 4.2990 1.00000
将交互项单独写出时结果一致:
adonis2(dune~Moisture+Manure+Moisture:Manure, data = dune.env, permutations = 999, method = "bray", strata = dune.env$Management, by = "margin")
输出:
Permutation test for adonis under reduced model Marginal effects of terms Blocks: strata Permutation: free Number of permutations: 999 adonis2(formula = dune ~ Moisture + Manure + Moisture:Manure, data = dune.env, permutations = 999, method = "bray", by = "margin", strata = dune.env$Management) Df SumOfSqs R2 F Pr(>F) Moisture:Manure 4 0.4678 0.10881 0.9213 0.424 Residual 8 1.0154 0.23620 Total 19 4.2990 1.00000
请问是否存在合理方法,可同时检验主效应及其交互项?
解决方案
要在vegan的adonis2中实现类似Type III ANOVA的效应检验(同时输出主效应和交互项的显著性,且不依赖因子顺序),可以通过分步构建模型并逐个检验每个项的边际效应来实现,具体逻辑和代码如下:
核心思路
先拟合包含所有效应的全模型,再对每个主效应/交互项单独拟合去掉该项的简化模型,通过anova()比较全模型与简化模型的差异,得到对应项的显著性——这和Type III ANOVA的边际检验逻辑完全一致,不依赖因子输入顺序。
双因子场景代码示例
library(vegan) data(dune) data(dune.env) # 1. 拟合包含所有效应的全模型 full_mod <- adonis2(dune ~ Moisture * Manure, data = dune.env, permutations = 999, method = "bray", strata = dune.env$Management) # 2. 检验Moisture的边际效应(Type III) mod_no_moisture <- adonis2(dune ~ Manure + Moisture:Manure, data = dune.env, permutations = 999, method = "bray", strata = dune.env$Management) anova(full_mod, mod_no_moisture) # 3. 检验Manure的边际效应(Type III) mod_no_manure <- adonis2(dune ~ Moisture + Moisture:Manure, data = dune.env, permutations = 999, method = "bray", strata = dune.env$Management) anova(full_mod, mod_no_manure) # 4. 检验Moisture:Manure的交互效应 mod_no_interaction <- adonis2(dune ~ Moisture + Manure, data = dune.env, permutations = 999, method = "bray", strata = dune.env$Management) anova(full_mod, mod_no_interaction)
三因子场景扩展
对于三个因子A、B、C的情况,重复相同逻辑即可:
- 全模型:
dune ~ A*B*C - 检验A的边际效应:拟合
dune ~ B + C + A:B + A:C + B:C + A:B:C,与全模型比较 - 检验B的边际效应:拟合
dune ~ A + C + A:B + A:C + B:C + A:B:C,与全模型比较 - 检验C的边际效应:拟合
dune ~ A + B + A:B + A:C + B:C + A:B:C,与全模型比较 - 检验A:B交互:拟合
dune ~ A + B + C + A:C + B:C + A:B:C,与全模型比较 - 以此类推,逐个检验所有双向、三向交互项
简化操作的自定义函数
可以编写循环函数自动处理所有项,避免重复代码:
typeIII_adonis2 <- function(full_formula, data, permutations = 999, method = "bray", strata = NULL) { # 拟合全模型 full_mod <- adonis2(full_formula, data = data, permutations = permutations, method = method, strata = strata) # 提取所有模型项(排除残差和总计项) terms <- attr(full_mod$terms, "term.labels") # 初始化结果存储列表 results <- list() for (term in terms) { # 构建去掉当前项的简化公式 reduced_terms <- setdiff(terms, term) reduced_formula <- as.formula(paste(". ~", paste(reduced_terms, collapse = " + "))) # 拟合简化模型 reduced_mod <- adonis2(reduced_formula, data = data, permutations = permutations, method = method, strata = strata) # 比较模型并保存结果 results[[term]] <- anova(full_mod, reduced_mod) } return(results) } # 三因子场景使用示例(假设数据中有A、B、C三个因子) # typeIII_results <- typeIII_adonis2(dune ~ A*B*C, data = your_env_data, permutations = 999, method = "bray")
注意事项
- 该方法本质是通过模型比较实现边际效应检验,完全符合Type III ANOVA的逻辑,不依赖因子输入顺序
- 每个检验都需要单独进行置换计算,因子数量越多计算量越大,可根据实际需求调整置换次数
内容的提问来源于stack exchange,提问作者Siwook Hwang
相关产品推荐
相关产品推荐

