2017-03-01 29 views
1

metaMDS {vegan}的帮助文件提到,人们也可以使用dist对象而不是comm参数中的社区数据。metaMDS {素食}距离而不是社区矩阵

所以,如果我运行以下,为什么我会得到不同的结果?我在这里做错了什么,并且是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

你不需要推测:'metaMDS'输出会告诉你是否使用了转换。看看输出的'Data:'行。 –

回答

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()设计为一个包装(,细节部分来自?metaMDS)基本在一个特定的方式实现NMDS功能

功能metaMDS是一个包装函数 调用等多种功能于明钦(1987) 建议合并成一个命令。

它根据输入数据做出决定。这些决定中的一部分可以用来区分不同之处,就像autotransform的情况那样,打算在分析之前应用这些决定。

+0

Hi @Gavin Simpson。感谢您的回答。我注意到,在绘制两个模型'm1'和'm2'的例子中,我得到了相同的点分布,但是不同的nMDS轴坐标。因此,结果与'm1'图对称,看起来像是'm2'图的放大图。那是我应该担心的事情吗? – Valentin