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

时间:2017-03-01 22:44:59

标签: r vegan

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

因此,如果我运行以下内容,为什么会得到不同的结果?我在这里做错了吗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感到厌烦我虽然使用autotransform = FALSE会解决问题。但是,我认为价值并不是触发转型需求的极端因素,所以似乎不适用于此。此discussion对我没什么帮助。 具体来说,我在运行dist时有一个unifrac {picante}对象,我想我可以在metaMDS {vegan}中使用它。 PS:不幸的是,我不是生态学家,我正在尽力避免使用行话。我只能请你极度耐心。

1 个答案:

答案 0 :(得分:2)

简而言之,给定相同的选项,metaMDS()调用不相似性和社区将导致相同的模型如果从相同的随机种子启动(nMDS涉及使用随机启动的迭代算法位置)。

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

autotransform 有差别,因为它影响实际转换为不相似的数据。可以把它想象成一个预处理步骤,当你创造不同之处时,你并没有这样做。因此,您需要将autotransform = FALSE添加到第二个调用,即带有社区数据的调用。

如果您运行以下两个电话

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,详细信息部分)

  

函数metaMDS是一个包装函数        调用其他几个函数来组合Minchin&#39; s(1987)        推荐到一个命令。

它根据输入数据做出决定。其中一些决策可以针对不同点做出,就像autotransform的情况一样,这些决定是在分析之前应用的。