metaMDS {vegan} 距离而不是社区矩阵

metaMDS {vegan} distances instead of community matrix

metaMDS {vegan} 的帮助文件提到在 comm 参数中也可以使用 dist 对象而不是社区数据。

那么,如果我 运行 以下内容,为什么会得到不同的结果?我在这里做错了什么吗?metaMDS 最终计算出不同之处的不同之处吗?

library(vegan)
data(varespec)
vare_dist <- vegdist(varespec, method="bray")
vare_mds <- metaMDS(comm = vare_dist, autotransform = FALSE) 
# actually autotransform = FALSE doesn't seem to change the results
plot(vare_mds, type = "t")

vare_mds_2 <- metaMDS(comm = varespec, distance = "bray", k =2)
plot(vare_mds_2, display = "sites", type = "t")

# plots above are different and the stress values below as well
vare_mds$stress; vare_mds_2$stress
# [1] 0.1000211
# [1] 0.1843196

休闲 SO question I though that using the autotransform = FALSE would fix the issue. However, I think values are not that extreme to trigger a transformation need, so seems not to apply here. Also this discussion 对我帮助不大。 具体来说,我有一个来自 运行ning unifrac {picante}dist 对象,我想我可以在 metaMDS {vegan} 中使用它。 PS:不幸的是,我不是生态学家,我正在尽我最大的努力来使用行话。只能请大家耐心等待了。

简而言之,给定相同的选项,metaMDS() 如果从相同的随机种子开始(nMDS 涉及一个使用随机起始位置的迭代算法)。

但是,您在您的示例中没有对两个拟合使用相同的随机种子并不是这里问题的根源。您的两次调用实际上导致了不同的拟合,因为输入数据因 autotransform 的默认值与社区数据和差异而不同。

autotransform 有差异,因为它影响实际转换为差异的数据。把它想象成一个预处理步骤,一个你在创建差异时没有做的步骤。因此,您需要将 autotransform = FALSE 添加到 second 调用,即具有社区数据的调用。

如果你运行以下两个调用

set.seed(1)
m1 <- metaMDS(comm = vare_dist, autotransform = FALSE)
set.seed(1)
m2  <- metaMDS(comm = varespec, distance = "bray", autotransform = FALSE)

你会发现它们是一样的:

> procrustes(m1, m2)

Call:
procrustes(X = m1, Y = m2) 

Procrustes sum of squares:
8.882e-16

以上显示配置完全等同于机器精度,并且两种模型的应力统计相同

> m1$stress
[1] 0.1000211
> m2$stress
[1] 0.1000211

metaMDS() 被设计为以特定方式实现 nMDS 的底层函数的包装器(来自 ?metaMDS,详细信息部分)

Function metaMDS is a wrapper function that calls several other functions to combine Minchin's (1987) recommendations into one command.

它根据输入数据做出决定。其中一些决定不能针对不同点做出,因为 autotransform 的情况就是要在分析之前应用这些决定。