You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 15:47:01