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

如何计算PERMANOVA的效应量ω²?vegan与effectsize适配问题

PERMANOVA(adonis2)效应量ω²计算方案

问题说明

effectsize包的omega_squared()函数目前不支持vegan::adonis2()的输出对象,原因是adonis2的结果结构与该函数预期的常规方差分析对象(如aov、lm)不一致,无法自动识别均方等关键统计量。

手动计算ω²的正确性验证

PERMANOVA中ω²的计算逻辑与普通ANOVA一致,公式为:

ω² = (SS效应 - df效应 × MS误差) / (SS总 + MS误差)

你可以直接从adonis2的结果中提取对应值完成计算,该手动计算方式完全符合PERMANOVA效应量ω²的定义,是正确的。

示例代码

# 加载包与示例数据
library(vegan)
data(dune)
data(dune.env)

# 执行PERMANOVA
adonis_res <- adonis2(dune ~ Management, data = dune.env, permutations = 999)

# 提取关键统计量
ss_effect <- adonis_res$SumOfSqs[1]       # 自变量的平方和
df_effect <- adonis_res$Df[1]             # 自变量的自由度
ms_error <- adonis_res$MeanSq[nrow(adonis_res)] # 残差均方
ss_total <- sum(adonis_res$SumOfSqs)      # 总平方和

# 计算ω²
omega_sq <- (ss_effect - df_effect * ms_error) / (ss_total + ms_error)
omega_sq

适配effectsize包的自定义方法

如果你想直接用omega_squared()函数处理adonis2结果,可以为adonis2类对象编写一个自定义方法:

library(effectsize)

# 为adonis2对象添加omega_squared方法
omega_squared.adonis2 <- function(model, ...) {
  # 排除残差行,提取所有自变量的统计量
  terms <- rownames(model)[-nrow(model)]
  ss_eff <- model$SumOfSqs[-nrow(model)]
  df_eff <- model$Df[-nrow(model)]
  ms_err <- model$MeanSq[nrow(model)]
  ss_total <- sum(model$SumOfSqs)
  
  # 计算每个自变量的ω²
  omega_vals <- (ss_eff - df_eff * ms_err) / (ss_total + ms_err)
  
  # 返回标准化结果
  data.frame(
    Term = terms,
    Omega_Squared = omega_vals,
    row.names = NULL,
    check.names = FALSE
  )
}

# 直接调用
omega_squared(adonis_res)

运行后即可得到所有自变量的ω²值,结果与手动计算完全一致。

内容的提问来源于stack exchange,提问作者maRvin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:10:23