如何把環(huán)境變量加入R語言的NMDS分析中
非度量多維縮放 (NMDS) 是可用于在二維中顯示多維數(shù)據(jù)的多種排序圖類型之一。NMDS 圖基本上突出了復(fù)雜多維數(shù)據(jù)樣本之間的相似性。圖上的兩個點(樣本)越接近,這些樣本在基礎(chǔ)數(shù)據(jù)方面就越相似。就我而言,我通常會查看樣本中微生物的物種豐度。因此,兩個樣本越接近,它們的微生物群落就越相似。
生成 NMDS 圖的方法是非度量的,這意味著該算法不假設(shè)任何特定的數(shù)據(jù)分布,當(dāng)您擁有本質(zhì)上奇怪且不符合鐘形曲線樣式的數(shù)據(jù)時,這很方便分配。該算法使用基于等級的方法,該方法基本上根據(jù)特定距離度量(即 Bray Curtis)根據(jù)彼此的接近程度對樣本進行排名,并在二維空間中繪制這些關(guān)系。更多關(guān)于這里方法的細(xì)節(jié)。雖然這是一種針對不合格數(shù)據(jù)的穩(wěn)健方法,但這意味著在 NMDS 排序圖中,軸和坐標(biāo)系是任意的,并且與任何有意義的值沒有直接關(guān)系。
重要說明:?NMDS 只是一種可視化技術(shù),而不是對樣本分離或相關(guān)性的統(tǒng)計評估。為此,您應(yīng)該運行統(tǒng)計檢驗,例如分類變量的ANOSIM 檢驗或連續(xù)變量的Mantel 檢驗。如果您希望軸有意義,或者如果您想討論變體分區(qū),其他排序技術(shù)(如PCA、CA、CCA、RDA 等)可能對您更有用。
好了,說了這么多。有多種方法可以在 NMDS 圖上疊加額外信息,以幫助可視化影響數(shù)據(jù)的潛在趨勢。就我而言,潛在的環(huán)境變量與微生物群落結(jié)構(gòu)共同變化,從而可能推動群落的變化。來自 R 包vegan的一系列函數(shù)旨在將額外信息覆蓋在 NMDS 圖等排序圖上。這些函數(shù)包括envfit、ordiplot、ordiellipse和ordisurf。我將首先解釋如何在這里使用 envfit 的功能。
ENVFIT
Envfit 將環(huán)境向量或因素擬合到一個排序上。envfit的默認(rèn)繪圖,如metaMDS,在美學(xué)上不是很討人喜歡,所以我將展示如何使用ggplot2繪制兩者。
首先加載您的庫并讀入您的數(shù)據(jù):
library(vegan)?
library(ggplot2)?
df = read.csv("your_data_frame.csv", header = TRUE)
我的數(shù)據(jù)包含樣本,因為行和列包含環(huán)境變量或物種豐度數(shù)據(jù)。在這個例子中,我有分類和連續(xù)環(huán)境變量。

接下來,對您的數(shù)據(jù)進行子集化,以便您擁有一個僅包含環(huán)境變量(env)的數(shù)據(jù)框和一個僅包含物種豐度數(shù)據(jù)(com)的數(shù)據(jù)框。在下面的代碼中,我命名了包含相應(yīng)信息的數(shù)據(jù)中的列范圍。
com = df[,9:32]?
env = df[,2:8]
執(zhí)行 NMDS 排序,如本教程中所述
#convert com to a matrix
m_com = as.matrix(com)?
#nmds code?
nmds = metaMDS(m_com, distance = "bray")?
nmds
現(xiàn)在我們使用環(huán)境數(shù)據(jù)框env運行 envfit 函數(shù)。
en = envfit(nmds, env, permutations = 999, na.rm = TRUE)
en
第一個參數(shù)是我們剛剛執(zhí)行的 NMDS 排序中的 metaMDS 對象。接下來是env,我們的環(huán)境數(shù)據(jù)框。然后我們聲明我們想要 999 個排列,并刪除任何缺少數(shù)據(jù)的行。

當(dāng)我們調(diào)用 envfit 函數(shù)的結(jié)果時,我們得到的結(jié)果被分成Vectors和Factors,分別用于您的連續(xù)變量和分類變量。如果您的數(shù)據(jù)不包含兩者,那么您將只能看到向量或因子。對于向量和因子,顯示了一個表格,將變量作為行給出,然后給出它們各自在 NMDS1 和 NMDS2 軸上的 NMDS 排列坐標(biāo)。如果排列 > 0,則使用環(huán)境變量的排列來評估擬合向量或因子的重要性。
我解釋這一點的方式是向量在你的情節(jié)中充當(dāng)一種“偽軸”。如果你沿著你的圖朝那個方向移動,你會看到你的樣本通常相對于那個變量增加。這當(dāng)然不是一個完美的關(guān)系,這就是 r2 和顯著性值來解釋關(guān)聯(lián)強度的地方。更長的箭頭,意味著更強的關(guān)聯(lián)。因為這種關(guān)系并不總是線性的,envfit 的開發(fā)人員建議您也可以使用其他方法將重要變量映射到您的數(shù)據(jù)上,包括點大小或 ordisurf 函數(shù)。
屬于某個類別的所有樣本的質(zhì)心值由因子坐標(biāo)繪制,這使您可以查看來自特定類別的樣本分組在一起(或不分組)的程度。
我們可以使用基數(shù) R 繪制 NMDS 和 envfit 結(jié)果,以查看因子和向量是如何繪制的:
plot(nmds)?
plot(en)

envfit 向量和因子(藍(lán)色)覆蓋在原始 NMDS 圖上,樣本為黑點。這里的基礎(chǔ) R 情節(jié)真的很難閱讀,容易人滿為患,而且難以定制。我建議使用ggplot2來制作更好看的圖。
為了使用ggplot2進行繪圖,您需要從 nmds 和 envfit 結(jié)果中提取適當(dāng)?shù)男畔ⅰ?/p>
對于 NMDS 輸出,使用以下代碼提取 NMDS 排序空間中的樣本坐標(biāo)。然后從您的原始數(shù)據(jù)中添加包含您想要包含在繪圖中的信息的列。在這種情況下,我包括“季節(jié)”列
data.scores = as.data.frame(scores(nmds))?
data.scores$season = df$Season
vegan 包的最新版本 (>2.6-2) 將 score(nmds) 對象的格式更改為列表,因此上面的代碼將拋出一個錯誤,說?arguments 暗示不同的行數(shù)。如果您收到此錯誤,請嘗試使用以下代碼來提取您的網(wǎng)站分?jǐn)?shù):
#extract NMDS scores (x and y coordinates) for sites from newer versions of vegan package?
data.scores = as.data.frame(scores(nmds)$sites)?
#add 'season' column as before?
data.scores$season = df$Season
從 envfit 結(jié)果中提取所需的信息有點復(fù)雜。envfit 輸出包含有關(guān)每個變量的段長度的信息。這些片段被縮放到 r2 值,因此具有較長片段的環(huán)境變量與數(shù)據(jù)的相關(guān)性比具有較短片段的那些更強烈。您可以使用分?jǐn)?shù)提取此信息。然后這些長度被進一步縮放以適合繪圖。這是通過特定于分析的乘數(shù)完成的,可以使用命令ordiArrowMul(en)訪問。下面我將分?jǐn)?shù)乘以這個乘數(shù),以使坐標(biāo)保持正確的比例。
因為我的數(shù)據(jù)包含連續(xù)的和分類的環(huán)境變量,所以我分別使用“向量”和“因子”選項從兩者中提取信息。
en_coord_cont = as.data.frame(scores(en, "vectors")) * ordiArrowMul(en)
en_coord_cat = as.data.frame(scores(en, "factors")) * ordiArrowMul(en)
現(xiàn)在數(shù)據(jù)采用適當(dāng)?shù)母袷?,可以使?ggplot2 在 R 中繪制。
首先,我們將制作一個沒有 envfit 變量的 nmds 圖:
gg =?
ggplot(data = data.scores, aes(x = NMDS1, y = NMDS2)) +?
geom_point(data = data.scores, aes(colour = season), size = 3, alpha = 0.5) + ? ??
scale_colour_manual(values = c("orange", "steelblue")) +?
theme(axis.title = element_text(size = 10, face = "bold", colour = "grey30"), ? ? panel.background = element_blank(), panel.border = element_rect(fill = NA, colour = "grey30"),?axis.ticks = element_blank(), axis.text = element_blank(), legend.key = element_blank(),?legend.title = element_text(size = 10, face = "bold", colour = "grey30"),?legend.text = element_text(size = 9, colour = "grey30")) +?
labs(colour = "Season")? ? ??
gg

下面是 NMDS 圖和 envfit 數(shù)據(jù)的代碼:
gg =?
ggplot(data = data.scores, aes(x = NMDS1, y = NMDS2)) +
geom_point(data = data.scores, aes(colour = season), size = 3, alpha = 0.5) +
? scale_colour_manual(values = c("orange", "steelblue")) +
geom_segment(aes(x = 0, y = 0, xend = NMDS1, yend = NMDS2),data = en_coord_cont, size =1, alpha = 0.5, colour = "grey30") +?
geom_point(data = en_coord_cat, aes(x = NMDS1, y = NMDS2),shape = "diamond", size = 4, alpha = 0.6, colour = "navy") +? ? ??
geom_text(data = en_coord_cat, aes(x = NMDS1, y = NMDS2+0.04),label = row.names(en_coord_cat), colour = "navy", fontface = "bold") +?
geom_text(data = en_coord_cont, aes(x = NMDS1, y = NMDS2), colour = "grey30",fontface = "bold", label = row.names(en_coord_cont)) +?
theme(axis.title = element_text(size = 10, face = "bold", colour = "grey30"), panel.background = element_blank(), panel.border = element_rect(fill = NA, colour = "grey30"), axis.ticks = element_blank(), axis.text = element_blank(), legend.key = element_blank(), legend.title = element_text(size = 10, face = "bold", colour = "grey30"), legend.text = element_text(size = 9, colour = "grey30")) +
labs(colour = "Season")? ?
gg

看起來比原始的基本 R 示例要好得多。代碼有點復(fù)雜,因為繪圖現(xiàn)在有很多方面,包括點、線段和文本標(biāo)簽。此圖與本教程系列中的其他圖的主要區(qū)別在于,我們在這里從 3 個不同的數(shù)據(jù)幀中繪制信息,因此每次向圖中添加幾何圖層時都必須指定數(shù)據(jù)源。
資料來源 https://jkzorz.github.io/2020/04/04/NMDS-extras.html