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

如何从vegan包metaMDS生成的NMDS对象获取累积解释方差(R²m)?

如何在vegan的metaMDS中获取NMDS的累积解释方差(R²m)

嗨,我来帮你解决这个问题!首先得明确一点:非度量多维标度(NMDS)本质上是基于秩次的排序方法,它的核心拟合指标是stress(应力值),而不是像PCA那样直接的方差解释率。不过你提到的R² = 1 - 总stress这个说法是成立的,这里的R²可以理解为NMDS的“度量拟合度”(metric fit,即R²m),代表排序结果对原始数据秩次关系的解释比例。

下面是具体的实现步骤:

1. 先运行metaMDS得到NMDS对象

假设你已经有了物种矩阵(比如用vegan自带的示例数据dune):

library(vegan)
# 加载示例数据
data(dune)
# 运行NMDS,k指定排序维度,默认是2
nmds_result <- metaMDS(dune, k = 2)

2. 提取stress并计算R²m

metaMDS返回的对象里,$stress就是最终收敛后的应力值,直接用它计算即可:

# 提取应力值
nmds_stress <- nmds_result$stress
# 计算度量拟合度R²m
r_squared_m <- 1 - nmds_stress

# 打印结果,保留4位小数更直观
cat("NMDS应力值:", round(nmds_stress, 4), "\n")
cat("度量拟合度R²m:", round(r_squared_m, 4), "\n")

关键注意事项

  • 这个R²m和PCA的“累积解释方差”不是一回事:PCA的R²是基于原始数据的方差分解,而NMDS的R²m是基于秩次相似性的拟合程度,两者的含义和计算逻辑不同,不能直接对比。
  • 如果需要在NMDS图上标注这个指标,可以用mtext()或者text()函数添加:
    plot(nmds_result)
    mtext(paste0("R²m = ", round(r_squared_m, 3)), side = 3, line = -1, adj = 0.95)
    
  • 如果你想查看每个样本点的拟合度(即单个点的stress贡献),可以用goodness(nmds_result)函数,返回的是每个点的残差平方和。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:55:06