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

