如何计算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
相关产品推荐
相关产品推荐

