第五章 非約束排序2 主成分分析(PCA)
今天我們來學(xué)習(xí)一下賴江山老師的《數(shù)量生態(tài)學(xué):R語言的應(yīng)用 第二版》第五章的正式內(nèi)容了,今天主要講的是主成分分析,也叫主分量分析,內(nèi)容不少哦,開始吧。
1. 主成分分析(PCA)概述
主成分分析(PCA):也叫主分量分析,基于特征向量的線性無約束排序方法。分析對(duì)象是原始的定量數(shù)據(jù)。標(biāo)尺為1時(shí),排序圖展示樣方之間的歐氏距離,標(biāo)尺為2時(shí),排序圖展示樣方之間的Malhal-anobis距離。
如果一個(gè)數(shù)據(jù)矩陣中每個(gè)變量都是正態(tài)分布,這樣的矩陣可以稱作多元正態(tài)分布矩陣。PCA排序過程將由原始變量定義的軸系統(tǒng)旋轉(zhuǎn),旋轉(zhuǎn)后連續(xù)的新坐標(biāo)軸(也稱主成分)彼此正交,并依次代表方差變化最大的方向。這樣,原來的點(diǎn)在新的坐標(biāo)系統(tǒng)內(nèi)有了新的坐標(biāo)位置。
PCA排序分析的對(duì)象是離差矩陣,即包含方差和協(xié)方差的變量之間(相同量綱)的關(guān)聯(lián)矩陣,或不同綱量的變量之間的相關(guān)系數(shù)矩陣。PCA致力于分析定量數(shù)據(jù),展示歐氏距離和線性關(guān)系。因此,PCA通常不適合原始的物種多度數(shù)據(jù)分析。但是,對(duì)原始數(shù)據(jù)進(jìn)行適當(dāng)轉(zhuǎn)化后的物種數(shù)據(jù)可以進(jìn)行PCA。
在PCA排序圖里,沿襲笛卡爾坐標(biāo)系內(nèi)散點(diǎn)圖的傳統(tǒng),對(duì)象用點(diǎn)表示,變量用箭頭表示。
生態(tài)學(xué)經(jīng)常用的是vegan包的rad( )函數(shù),當(dāng)然還有ade4包dudi.pca( )函數(shù)和stats包里的prcomp( )函數(shù),已經(jīng)作者編寫的PCA.newr( )函數(shù)。
2.使用rda()函數(shù)對(duì)Doubs環(huán)境數(shù)據(jù)進(jìn)行PCA分析
Doubs數(shù)據(jù)集有11個(gè)定量環(huán)境變量。它們有什么相關(guān)性?從樣方排序可以獲得什么信息?
由于環(huán)境變量具有不同的量綱,這里是計(jì)算基于相關(guān)矩陣的PCA。相關(guān)系數(shù)實(shí)際上也就是變量標(biāo)準(zhǔn)化后的協(xié)方差。
2.1 數(shù)據(jù)準(zhǔn)備
setwd("E:/Rstudio_working/lai jian shan/DATA/Data")
# 加載包,函數(shù)和數(shù)據(jù)
library(ade4)
library(vegan)
library(gclus)
library(ape)
library(missMDA)
library(FactoMineR)
#加載本章后面部分所需要的函數(shù)
source("cleanplot.pca.R")
source("PCA.newr.R")
source("CA.newr.R")
# 導(dǎo)入Doubs 數(shù)據(jù)
load("Doubs.RData")
# 刪除無物種數(shù)據(jù)的樣方8
spe <- spe[-8, ]
env <- env[-8, ]
spa <- spa[-8, ]
# 導(dǎo)入 oribatid 甲螨數(shù)據(jù)
load("mite.RData")
2.2 基于相關(guān)矩陣的PCA
# 顯示環(huán)境變量數(shù)據(jù)集的內(nèi)容
summary(env)
# 基于相關(guān)矩陣PCA
# 參數(shù)scale=TRUE表示對(duì)變量進(jìn)行標(biāo)準(zhǔn)化
env.pca <- rda(env, scale = TRUE)
env.pca
summary(env.pca) # 默認(rèn)scaling 2
#注意函數(shù)summary()內(nèi)的參數(shù)scaling,為繪制排序圖所選擇的標(biāo)尺類型,與函數(shù)rda()內(nèi)數(shù)據(jù)標(biāo)準(zhǔn)化的參數(shù)scale無關(guān)。
summary(env.pca, scaling = 1)
#如果不想查看樣方和物種坐標(biāo),可以將summary()里面設(shè)定參數(shù)axes=0
summary(env.pca,axes = 0)
PCA排序結(jié)果的解讀:
慣量(inertia):在vegan包里,是數(shù)據(jù)“變差”的通用術(shù)語。在PCA里,“慣量”可以是變量總方差(基于協(xié)方差矩陣的PCA分析),也可以是相關(guān)矩陣的對(duì)角線數(shù)值和(基于相關(guān)矩陣的PCA)(例如本案例),即變量自相關(guān)系數(shù)的總和,也等于變量的數(shù)量(例如本案例中有11個(gè)變量,慣量等于11)。
約束和非約束(constrained and unconstrained):PCA是非約束排序(即不是被環(huán)境因子解釋),所以這里顯示“unconstrained”。
特征根(eigenvalues):是每個(gè)排序軸的重要性(方差)的指標(biāo),可以用特征根數(shù)值,也可以用占總變差的比例表示(每軸特征根除以總慣量)。
標(biāo)尺((scaling):請(qǐng)不要與rda()函數(shù)內(nèi)的變量標(biāo)準(zhǔn)化參數(shù)scale混淆。“scaling”是指排序結(jié)果投影到排序空間的可視化方式。一般的排序圖需要同時(shí)展示對(duì)象和變量[稱為“雙序圖”(biplot)],但沒有同時(shí)可視化對(duì)象和變量的最優(yōu)化方法。一般有兩種標(biāo)尺模式,不同模式的排序圖有不同解讀,即關(guān)注點(diǎn)不同。下面給出每種模式最主要的特征。
- 1型標(biāo)尺(scaling1)=距離雙序圖(distance biplot):特征向量被標(biāo)準(zhǔn)化為單位長(zhǎng)度,關(guān)注的是對(duì)象之間的關(guān)系。①雙序圖中對(duì)象之間的距離近似于多維空間內(nèi)的歐氏距離。②代表變量的箭頭之間的夾角不反映變量之間的相關(guān)。
- 2型標(biāo)尺(scaling2)=相關(guān)雙序圖(correlation biplot):每個(gè)特征向量被標(biāo)準(zhǔn)化為特征根的平方根,關(guān)注的是變量之間的關(guān)系。①雙序圖中對(duì)象之間的距離不再近似于多維空間內(nèi)的歐氏距離。②代表變量箭頭之間的夾角反映變量之間的相關(guān)性。
- 在這兩種模式下,將對(duì)象點(diǎn)垂直投影到變量箭頭上位置表示該變量在該對(duì)象內(nèi)數(shù)值在所有樣方內(nèi)的排序位置。
- 選擇建議:如果分析興趣在于解讀對(duì)象之間的關(guān)系,設(shè)定scaling=1。如果分析興趣在于解讀變量之間關(guān)系,設(shè)定scaling=2。
- 折中標(biāo)尺,scaling=3,也稱為“對(duì)稱標(biāo)尺”,也是常被用到,包括通過樣方和物種的特征根的平方根。這種不特別強(qiáng)調(diào)關(guān)注對(duì)象或是變量。這種折中標(biāo)尺沒有明確的解釋規(guī)則。
Species scores:代表變量的箭頭在排序圖的坐標(biāo)。由于歷史的原因,在vegan包里,所有的響應(yīng)變量都統(tǒng)稱為物種,不管這些變量是否真的是物種。
Site scores:對(duì)象在排序圖的坐標(biāo)。在vegan包里,所有的對(duì)象都統(tǒng)稱為樣方
2.3 提取、解讀和繪制vegan包輸出的PCA結(jié)果
vegan包輸出的排序結(jié)果是一個(gè)復(fù)雜的實(shí)體,其元素的提取并不總是遵循R的基本規(guī)則。在R的控制臺(tái)輸入?cca.object,可以打開解釋rda()和cca()函數(shù)輸出結(jié)果的幫助文件。在幫助文件的最后案例(example)部分可以學(xué)到如何訪問或提取排序結(jié)果某一部分。
下面以提取某些重要的結(jié)果為例,必要時(shí)再對(duì)提取其他結(jié)果進(jìn)一步檢查。
2.3.1 特征根(Eigenvalues)
前面幾軸的特征根一定比后面軸的大嗎?隨之產(chǎn)生的問題是:有多少個(gè)排序軸值得保留和解讀?
PCA不是統(tǒng)計(jì)檢驗(yàn),而是探索性分析方法,其目的是在低維空間盡可能多地展示數(shù)據(jù)主要趨勢(shì)特征。
首先查看特征根,然后再根據(jù)被解釋方差的比例決定多少個(gè)排序軸值得解讀和繪圖。然而,選擇保留多少個(gè)排序軸并沒有統(tǒng)一標(biāo)準(zhǔn),通常很隨意(例如,75%的解釋量)。
幾種簡(jiǎn)單標(biāo)準(zhǔn)幫助選擇排序軸值:
- 斷棍模型:主要原理是將單位長(zhǎng)度的棍子隨機(jī)分成與PCA軸數(shù)一樣多的幾段,然后將這些斷棍按照長(zhǎng)短依次賦予對(duì)應(yīng)的軸(即最長(zhǎng)的棍子賦予第一軸,第二長(zhǎng)的賦予第二軸,依此類推)。
可以有兩種選擇標(biāo)準(zhǔn),第一種是選取特征根大于所對(duì)應(yīng)的斷棍長(zhǎng)度的軸,第二種是選取特征根的總和大于所對(duì)應(yīng)斷棍長(zhǎng)度總和前幾軸。排序碎石圖:以特征根的降序柱狀圖。vegan包里的screeplot.cca()函數(shù)顯示了將斷棍模型得到的預(yù)測(cè)值表示在碎石圖上,如圖2.3-2。
- Kaiser-Guttman準(zhǔn)則
?cca.object #打開解釋rda()和cca()函數(shù)輸出結(jié)果的幫助文件*
# 特征根
(ev <- env.pca$CA$eig)
# 碎石圖和斷棍模型
dev.new(title = "PCA特征值的碎石圖", noRStudioGD = TRUE)
screeplot(env.pca, bstick = TRUE, npcs = length(env.pca$CA$eig))
# 斷棍模型
n <- length(ev)
bsm <- data.frame(j=seq(1:n), p=0)
bsm$p[1] <- 1/n
for (i in 2:n) {
bsm$p[i] = bsm$p[i-1] + (1/(n + 1 - i))
}
bsm$p <- 100*bsm$p/n
bsm
# 繪制每軸的特征根和方差百分比
dev.new(width = 6,
height = 12,
title = "繪制每軸的特征根和方差百分比",
noRStudioGD = TRUE)
par(mfrow=c(2,1))
barplot(ev, main="特征根", col="bisque", las=2
abline(h=mean(ev), col="red") # 特征根平均值
legend("topright", "平均特征根", lwd=1, col=2, bty="n")
barplot(t(cbind(100*ev/sum(ev),bsm$p[n:1])), beside=TRUE,
main="% 變差", col=c("bisque",2), las=2)
legend("topright", c("% 特征根", "斷棍模型"),
pch=15, col=c("bisque",2), bty="n")
2.3.2樣方和變量的雙序圖
在PCA排序圖內(nèi),為了便于區(qū)分,對(duì)象用點(diǎn)表示,變量用箭頭表示。
圖2.3-4顯示兩種雙序圖,第一種設(shè)定參數(shù)scaling=1(最優(yōu)化展示對(duì)象之間的距離),第二個(gè)設(shè)定scaling=2(最優(yōu)化展示變量之間的協(xié)方差)。繪制雙序圖可以直接調(diào)用vegan包里biplot.rda()函數(shù),也可以使用作者編寫的函數(shù)cleanplot.pca(),同時(shí)生成兩種類型排序圖。
# 使用biplot.rda()函數(shù)繪制排序圖
dev.new(width = 12,
height = 6,
title = "使用biplot.rda()函數(shù)生成的Doubs環(huán)境數(shù)據(jù)PCA分析雙序圖",
noRStudioGD = TRUE
)
par(mfrow = c(1, 2))
biplot(env.pca, scaling = 1, main = "PCA - 1 型標(biāo)尺")
biplot(env.pca, main = "PCA - 2型標(biāo)尺") # 默認(rèn)scaling =2
# 使用cleanplot.pca()函數(shù)繪圖
dev.new(width = 12,
height = 6,
title = " cleanplot.pca()函數(shù)生成的Doubs環(huán)境數(shù)據(jù)PCA分析雙序圖",
noRStudioGD = TRUE
)
par(mfrow = c(1, 2))
cleanplot.pca(env.pca, scaling = 1, mar.percent = 0.08)
cleanplot.pca(env.pca, scaling = 2, mar.percent = 0.04)
注意:
- 用biplot(),text()和arrows()等函數(shù)從PCA結(jié)果中提取我們感興趣的樣方或變量坐標(biāo),或者,使用作者編寫cleanplot.pca()函數(shù)直接讓參數(shù)select.spe選擇感興趣的變量.
- vegan包現(xiàn)在接受了參數(shù)scaling=“sites”用于1型標(biāo)尺,scaling=“species”用于2型標(biāo)尺。vegan包涉及scaling的所有函數(shù)都可以用此規(guī)則。
圖2.3-5左圖的圓圈代表什么?
圖2.3-5的雙序圖進(jìn)行解讀:前兩軸能夠解釋總方差的比例是0.751或75.1%,如此高的解釋率足以讓我們相信前兩軸能夠表達(dá)大部分?jǐn)?shù)據(jù)結(jié)構(gòu)信息。
-
1型標(biāo)尺雙序圖中的圓圈,稱作平衡貢獻(xiàn)圓。它的半徑等于
,d是雙序圖的軸數(shù)量(通常d=2),p是PCA的維度(即變量的個(gè)數(shù))。平衡貢獻(xiàn)圓的半徑代表變量的向量長(zhǎng)度對(duì)排序的平均貢獻(xiàn)率。因此,在任何二維的排序圖中,如果某個(gè)變量的箭頭長(zhǎng)度長(zhǎng)于圓的半徑,代表它對(duì)這個(gè)排序空間的貢獻(xiàn)大于所有變量的平均貢獻(xiàn)。在2型標(biāo)尺不可能畫出一個(gè)平衡貢獻(xiàn)的圓圈,因?yàn)?型標(biāo)尺是對(duì)“Mahalanobis”空間的投影,而不是歐氏空間。只有變量被標(biāo)準(zhǔn)化,且兩兩正交,才能準(zhǔn)確獲得變量的貢獻(xiàn),進(jìn)而才能畫出平衡貢獻(xiàn)圓.
- 1型標(biāo)尺雙序圖(scaling 1 biplot)體現(xiàn)了從左到右的變化梯度,樣方1-10可以歸為第一組,從圖中可以明顯看出,第一組位于高海拔(ele)和陡坡(s1o)、低流量(dis)低硬度(har)的離源頭距離(dfs)近的上游區(qū)域。樣方11-16可以歸為第二組,處于高氧含量(oxy)和低硝酸鹽濃度(nit)的區(qū)域。第三組樣方(17-22)比較密集,幾乎處于所有變量中值的區(qū)域,也表明這些樣方對(duì)前兩軸的貢獻(xiàn)不大。樣方23-25所在區(qū)域也顯示出磷酸鹽濃度(pho)、銨濃度(amm)和生物需氧量(bod)具有最高值。總體來說,1型標(biāo)尺雙序圖樣方分組體現(xiàn)水質(zhì)從營(yíng)養(yǎng)貧瘠、氧豐富到富營(yíng)養(yǎng)化,最后缺氧的變化。
- 在2型標(biāo)尺雙序圖(scaling 2 biplot)內(nèi),環(huán)境變量可以劃分為不同的組。在圖的左下角,顯示海拔(ele)和坡度(slo)高度正相關(guān),這兩個(gè)變量也與離源頭距離(dfs)、流量(dis)和鈣濃度(har)組成的另外一組環(huán)境變量呈現(xiàn)明顯負(fù)相關(guān)。氧含量(oxy)與海拔(ele)和坡度(slo)呈正相關(guān),但與磷酸鹽濃度(nit)和銨濃度(amm)呈負(fù)相關(guān),當(dāng)然,也與生物需氧量(bod)負(fù)相關(guān)。雙序圖右半部顯示的變量主要與河流的下游有關(guān)系,即流量(dis)和硬度(har)這組變量與離源頭距離(dfs)這個(gè)變量和代表富營(yíng)養(yǎng)化這組變量(即磷酸鹽、銨濃度和生物需氧量)高度相關(guān)。硝酸鹽濃度(nit)與這兩組環(huán)境因子正相關(guān)。硝酸鹽濃度(nit)與pH箭頭幾乎正交,顯示它們的相關(guān)系數(shù)接近為0。pH的箭頭很短,表明它對(duì)于前兩軸的貢獻(xiàn)并不大。但如果繪第一軸與第三軸的排序圖可以發(fā)現(xiàn)pH對(duì)第三軸的貢獻(xiàn)比較大。
- 這個(gè)案例表明,雙序圖對(duì)于總結(jié)數(shù)據(jù)的主要特征是非常有用的。樣方梯度分布和聚類、變量之間的相關(guān)性都比較清晰。基于相關(guān)矩陣的雙序圖(2型標(biāo)尺)比直接查看變量之間的相關(guān)系數(shù)矩陣(可以通過輸入cor(env)獲得)更加直觀。
備注:vegan包提供另外一個(gè)繪圖函數(shù)plot()。這個(gè)函數(shù)是用點(diǎn),而不是用箭頭來表示PCA里的變量。plot()生成的排序圖內(nèi)代表變量的點(diǎn)的位置,是biplot()生成的排序圖中變量箭頭頂點(diǎn)的位置,不是箭頭線中點(diǎn)的位置,所以用p1ot()生成的PCA排序圖,解讀的時(shí)候應(yīng)該特別小心。鍵入?plot.cca 查看更詳細(xì)的幫助。
#plot()函數(shù)生成的Doubs環(huán)境數(shù)據(jù)PCA分析雙序圖
dev.new(width = 12,
height = 6,
title = " plot()函數(shù)生成的Doubs環(huán)境數(shù)據(jù)PCA分析雙序圖",
noRStudioGD = TRUE
)
par(mfrow = c(1, 2))
plot(env.pca, scaling = 1)
plot(env.pca, scaling = 2)
僅僅使用四個(gè)變量來繪圖
# 使用ele, oxy, har, bod這4個(gè)變量
dev.new(
title = "帶有變量子集的PCA繪圖 - cleanplot.pca",
width = 12,
height = 6,
noRStudioGD = TRUE
)
par(mfrow = c(1, 2))
var.subset <- c(2, 6, 10, 11)
cleanplot.pca(
env.pca,
scaling = 1,
select.spe = var.subset,
mar.percent = 0.10
)
cleanplot.pca(
env.pca,
scaling = 2,
select.spe = var.subset,
mar.percent = 0.04
)
# 使用ele, oxy, har, bod這4個(gè)變量
dev.new(
title = "帶有變量子集的PCA繪圖 - biplot vegan",
width = 14,
height = 7,
noRStudioGD = TRUE
)
par(mfrow = c(1, 2))
# 標(biāo)尺1
var.sc1.sub <-
scores(env.pca,
scaling = 1,
display = "species")[c(2, 6, 10, 11), ]
biplot(env.pca,
scaling = 1,
main = "PCA 標(biāo)尺1",
type = "n")
text(env.pca, # 添加樣方點(diǎn)
scaling = 1,
display = "sites",
cex = 0.7)
arrows(
0,
0,
var.sc1.sub[, 1],
var.sc1.sub[, 2],
length = 0.10,
angle = 10,
col = "red"
)
text(
var.sc1.sub[, 1],
var.sc1.sub[, 2],
labels = rownames(var.sc1.sub),
col = "red",
pos = 4
)
# 標(biāo)尺2
var.sc2.sub <- scores(env.pca,
display = "species")[c(2, 6, 10, 11), ]
biplot(env.pca, type = "n", main = "PCA 標(biāo)尺2")
text(env.pca,
scaling = 2,
display = "sites",
cex = 0.7)
arrows(
0,
0,
var.sc2.sub[, 1],
var.sc2.sub[, 2],
length = 0.10,
angle = 10,
col = "red"
)
text(
var.sc2.sub[, 1],
var.sc2.sub[, 2],
labels = rownames(var.sc2.sub),
col = "red",
pos = 4
)
2.4 將新變量投影到PCA雙序圖中
通過predict()函數(shù)可以將新的補(bǔ)充變量添加到PCA圖中。此函數(shù)使用排序結(jié)果和新變量的數(shù)值來計(jì)算新變量的PCA坐標(biāo)。新變量的數(shù)據(jù)框的行名字(樣方名)一定要與原始做PCA的數(shù)據(jù)行名準(zhǔn)確一致才能執(zhí)行此操作。
為了演示,首先利用去掉最后兩列(oxy和bod)的Doubs環(huán)境數(shù)據(jù)進(jìn)行PCA分析,然后將oxy和bod作為新的變量投影到PCA的排序圖中:
# 去掉 oxy and bod 的PCA
env.pca2 <- rda(env[, -c(10, 11)], scale = TRUE)
# 生成只有 oxy and bod 對(duì)的數(shù)據(jù)框(作為新變量)
new.var <- env[, c(10, 11)]
# 計(jì)算新變量的坐標(biāo)(箭頭尖端位置)
new.vscores <-
predict(env.pca2,
type = "sp",
newdata = new.var,
scaling = 2)
# 計(jì)算新變量的坐標(biāo)(箭頭尖端位置)
new.vscores <-
predict(env.pca2,
type = "sp",
newdata = new.var,
scaling = 2)
# 繪制結(jié)果-2型標(biāo)尺
dev.new(
title = "主成分分析中的補(bǔ)充變量",
noRStudioGD = TRUE
)
biplot(env.pca2,
scaling = 2,
main = "主成分分析中的補(bǔ)充變量")
arrows(
0,
0,
new.vscores[, 1],
new.vscores[, 2],
length = 0.05,
angle = 30,
col = "blue"
)
text(
new.vscores[, 1],
new.vscores[, 2],
labels = rownames(new.vscores),
cex = 0.8,
col = "blue",
pos = 2
)
這個(gè)案例生成的結(jié)果非常接近所有環(huán)境變量的PCA計(jì)算的結(jié)果。這是因?yàn)?em>兩個(gè)缺失的變量(oxy和bod)與其他幾個(gè)變量相關(guān)性很強(qiáng)。因此,沒有oxy和bod的PCA與完整環(huán)境變量的PCA幾乎類似,所以oxy和bod的位置也與原始的位置幾乎重疊。
注意:
- 將新變量投影到PCA結(jié)果中僅適用于新變量的數(shù)據(jù)預(yù)處理方式與已被用于PCA變量數(shù)據(jù)預(yù)處理方式要一致。
- 在本案例中,原來PCA的變量進(jìn)行標(biāo)準(zhǔn)化(scale=TRUE),但標(biāo)準(zhǔn)化是在PCA過程進(jìn)行的,即提供給函數(shù)rda()的數(shù)據(jù)是未標(biāo)準(zhǔn)化的變量。因?yàn)楹瘮?shù)predict()是從PCA輸出中提取其信息(這里是env.pca2),這表示新的變量已經(jīng)在“預(yù)測(cè)”過程中自動(dòng)做了跟原始的PCA相同的數(shù)據(jù)標(biāo)準(zhǔn)化。
- 如果原始的PCA分析是在輸入rda()函數(shù)之前就做了數(shù)據(jù)轉(zhuǎn)化,則新變量在給predict()函數(shù)之前也得做相應(yīng)的手動(dòng)轉(zhuǎn)化。如果是根據(jù)物種多度數(shù)據(jù)Hellinger轉(zhuǎn)化后做PCA或任何涉及行的轉(zhuǎn)化,新的物種數(shù)據(jù)中在輸入PCA預(yù)測(cè)之前,都應(yīng)該做相應(yīng)的轉(zhuǎn)化,即需要用相同的行的和以及平方根進(jìn)行轉(zhuǎn)化。
2.5 將新對(duì)象投影到PCA雙序圖中
如果已按上述方式計(jì)算PCA,則使用vegan函數(shù)rda(),vegan包里函數(shù)predict()不能按照當(dāng)前的計(jì)算方式,將新的對(duì)象投影到PCA雙序圖。原因是rda()輸出只輸出兩類對(duì)象:“rda”和“cca”,在這種情況下predict()只識(shí)別“cca”對(duì)象,這種情況下,樣方的坐標(biāo)是來自變量加權(quán)平均值。但這種算法僅適用于對(duì)應(yīng)分析(CA)雙序圖,不適用于RDA,因此不能用predict()給RDA的對(duì)象做預(yù)測(cè)。
stats程序包的另一個(gè)predict()函數(shù)可以正確預(yù)測(cè)由其他函數(shù)做出的RDA的樣方坐標(biāo)。例如,我們使用stats 包里面的prcomp()函數(shù)做缺失樣方2、9和22的Doubs魚類數(shù)據(jù)的PCA,然后再預(yù)測(cè)出缺失樣方的坐標(biāo)并投影到原來的排序圖中。
#將新對(duì)象(樣方)投影到PCA圖
#使用stats包里面的prcomp()和predict()做缺失樣方2、9和22的PCA
#并預(yù)測(cè)和投影缺失樣方的坐標(biāo)
#去掉樣方9和22的命令中行號(hào)標(biāo)為8和22是因?yàn)槲覀円呀?jīng)去掉無物種的樣方8
#使用prcomp()運(yùn)算PCA
#參數(shù)’scale.=TRUE'就是基于相關(guān)矩陣的PCA(變量標(biāo)準(zhǔn)化)
#與rda()函數(shù)中‘scale=TRUE’效果一樣
env.prcomp<-prcomp(env[-c(2,8,22),],scale.=TRUE)
dev.new(
title = "使用prcomp函數(shù)補(bǔ)充新對(duì)象",
noRStudioGD = TRUE
)
plot(
env.prcomp$x[ ,1],
env.prcomp$x[ ,2],
type = "n",
main = "PCA 標(biāo)尺1-補(bǔ)充新對(duì)象",
xlab = "PCA 1",
ylab = "PCA 2"
)
abline(h = 0, col = "gray")
abline(v = 0, col = "gray")
text(
env.prcomp$x[ ,1],
env.prcomp$x[ ,2],
labels = rownames(env[-c(2, 8, 22), ])
)
# 計(jì)算新的樣方坐標(biāo)
new.sit <- env[c(2, 8, 22), ]
pca.newsit <- predict(env.prcomp, new.sit)
# 將新樣方投影到PCA圖
text(
pca.newsit[, 1],
pca.newsit[, 2],
labels = rownames(pca.newsit),
cex = 0.8,
col = "blue"
)
注意方法和將新變量投影到樣方中相似,但是得額外注意:
- vegan包會(huì)對(duì)樣方坐標(biāo)統(tǒng)一乘以一個(gè)常數(shù),所以必須通過手動(dòng)的方法也對(duì)新樣方坐標(biāo)做同樣的操作,這個(gè)常數(shù)可以通過scores()獲得。
- 如果PCA運(yùn)算的是標(biāo)準(zhǔn)化數(shù)后的數(shù)據(jù),新樣方數(shù)據(jù)中的變量也必須使用原始數(shù)據(jù)組的平均值和標(biāo)準(zhǔn)差進(jìn)行標(biāo)準(zhǔn)化。
2.6 環(huán)境變量的PCA減去站點(diǎn)2、9和23
基于使用vegan函數(shù)rda()計(jì)算的PCA
#基于使用vegan函數(shù)rda()計(jì)算的PCA
env.small <- env[-c(2, 8, 22), ]
env.pca3 <- rda(env.small, scale = TRUE)
# 用點(diǎn)2、8和22創(chuàng)建數(shù)據(jù)框
new.sit <- env[c(2, 8, 22), ]
# 計(jì)算新站點(diǎn)的得分
# Extract Matrix U (在包vegan中叫做v)
U.mat <- env.pca3$CA$v
# 用PCA中使用的數(shù)據(jù)參數(shù)標(biāo)準(zhǔn)化新數(shù)據(jù)
env.mean <- apply(env.small, 2, mean)
env.sd <- apply(env.small, 2, sd)
newsit.stand <- scale(new.sit, center = env.mean, scale = env.sd)
# 原始標(biāo)尺1 新站點(diǎn)的分?jǐn)?shù)
newsit.scores <- newsit.stand %*% U.mat
#vegan評(píng)分的提取與檢索
# 標(biāo)尺常數(shù)
env.scores1 <-
scores(
env.pca,
display = "sites",
choices = c(1, 2),
scaling = 1
)
const <- attributes(env.scores1)$const
# 計(jì)算新站點(diǎn)的分?jǐn)?shù)
newsit.scores.cons <- newsit.scores / const
# 繪制結(jié)果-標(biāo)尺1
dev.new(title = "Supplementary sites in PCA", noRStudioGD = TRUE)
biplot(env.pca3, scaling = 1)
text(
newsit.scores.cons[, 1],
newsit.scores.cons[, 2],
labels = rownames(newsit.scores.cons),
cex = 0.8,
col = "blue"
)
# 手動(dòng)計(jì)算 vegan 常數(shù)
n <- nrow(env[-c(2, 8, 22), ])
eigenv <- env.pca3$CA$eig
tot <- sum(eigenv)
const <- ((n - 1) * tot) ^ 0.25
2.7 組合聚類分析結(jié)果和排序結(jié)果
組合聚類分析和排序的結(jié)果對(duì)于解釋或確認(rèn)樣方組之間的差異非常直觀。
兩種方式去組合聚類和排序結(jié)果:
- 在排序圖內(nèi)用不同顏色去區(qū)分不同樣方組
- 將聚類樹添加到排序圖上jieg
圖2.7-2圖展示了這兩種方式組合的結(jié)果,當(dāng)然,也可以給每種方法單獨(dú)繪一幅圖。
#聚類組合分析結(jié)果和排序結(jié)果
#使用環(huán)境變量數(shù)據(jù)對(duì)樣方進(jìn)行基于變量標(biāo)準(zhǔn)化后歐氏距離的Ward聚類分析
env.w <- hclust(dist(scale(env)), "ward.D")
# 裁剪聚類樹,只保留4個(gè)聚類簇
gr <- cutree(env.w, k = 4)
grl <- levels(factor(gr))
# 提取樣方坐標(biāo),1型標(biāo)尺
sit.sc1 <- scores(env.pca, display = "wa", scaling = 1)
# 按照聚類分析的結(jié)果對(duì)樣方進(jìn)行標(biāo)識(shí)和標(biāo)色(1型標(biāo)尺)
dev.new(title = "排序和聚類", noRStudioGD = TRUE)
p <- plot(
env.pca,
display = "wa",
scaling = 1,
type = "n",
main = "PCA (基于相關(guān)矩陣)+聚類簇"
)
abline(v = 0, lty = "dotted")
abline(h = 0, lty = "dotted")
for (i in 1:length(grl)) {
points(sit.sc1[gr == i, ],
pch = (14 + i),
cex = 2,
col = i + 1)
}
text(sit.sc1, row.names(env), cex = 0.7, pos = 3)
#在排序圖內(nèi)增加聚類樹
ordicluster(p, env.w, col = "dark grey")
# 人機(jī)互動(dòng)圖例
legend(
locator(1),
paste("Cluster", c(1:length(grl))),
pch = 14 + c(1:length(grl)),
col = 1 + c(1:length(grl)),
pt.cex = 2
)
注意:
排序圖中如何用不同的符號(hào)形狀和顏色標(biāo)定不同聚類簇的樣方。對(duì)象grl包含1到聚類簇?cái)?shù)量的因子水平
因?yàn)橹鞒煞址治鯬CA的內(nèi)容比較多,所以今天先講這些,主要就是使用rda()函數(shù)對(duì)Doubs環(huán)境數(shù)據(jù)進(jìn)行PCA分析的內(nèi)容,下一次將繼續(xù)PCA內(nèi)容,請(qǐng)期待!
這些案例的源代碼我都已經(jīng)上傳到getee,可以在我的公眾號(hào)回復(fù):數(shù)量生態(tài)學(xué)獲得倉庫鏈接
如有不足或錯(cuò)誤之處,請(qǐng)批評(píng)指正。
有什么不明白的也歡迎留言討論。
歡迎關(guān)注微信公眾號(hào):fafu 生信 小蘑菇
感謝你的閱讀!!!你的點(diǎn)贊關(guān)注轉(zhuǎn)發(fā)是對(duì)我最大的鼓勵(lì)。