2017-03-01 141 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