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:不幸的是,我不是生态学家,我正在尽力避免使用行话。我只能请你极度耐心。
答案 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
的情况一样,这些决定是在分析之前应用的。