非約束排序2 主成分分析(PCA)第五章

第五章 非約束排序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")
Doubs數(shù)據(jù)中的物種數(shù)據(jù)spe
Doubs數(shù)據(jù)中的坐標(biāo)數(shù)據(jù)spa
Doubs數(shù)據(jù)中的環(huán)境因子數(shù)據(jù)env

2.2 基于相關(guān)矩陣的PCA

# 顯示環(huán)境變量數(shù)據(jù)集的內(nèi)容
summary(env)
image-20210515151302441
# 基于相關(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) 
env.pca <- rda(env, scale = TRUE)
image-20210515161420569
image-20210515161527545
image-20210515162028043

PCA排序結(jié)果的解讀:

  1. 慣量(inertia):在vegan包里,是數(shù)據(jù)“變差”的通用術(shù)語。在PCA里,“慣量”可以是變量總方差(基于協(xié)方差矩陣的PCA分析),也可以是相關(guān)矩陣的對(duì)角線數(shù)值和(基于相關(guān)矩陣的PCA)(例如本案例),即變量自相關(guān)系數(shù)的總和,也等于變量的數(shù)量(例如本案例中有11個(gè)變量,慣量等于11)。

  2. 約束和非約束(constrained and unconstrained):PCA是非約束排序(即不是被環(huán)境因子解釋),所以這里顯示“unconstrained”。

  3. 特征根(eigenvalues):是每個(gè)排序軸的重要性(方差)的指標(biāo),可以用特征根數(shù)值,也可以用占總變差的比例表示(每軸特征根除以總慣量)。

  4. 標(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ī)則。
  5. Species scores:代表變量的箭頭在排序圖的坐標(biāo)。由于歷史的原因,在vegan包里,所有的響應(yīng)變量都統(tǒng)稱為物種,不管這些變量是否真的是物種。

  6. 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)幫助選擇排序軸值:

  1. 斷棍模型:主要原理是將單位長(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。

  1. 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))
2.3-1
2.3-2
# 斷棍模型
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-3

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
2.3-4 使用biplot.rda()函數(shù)繪制排序圖
# 使用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)
圖2.3-5 使用cleanplot.pca()函數(shù)繪制排序圖

注意:

  • 用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. 1型標(biāo)尺雙序圖中的圓圈,稱作平衡貢獻(xiàn)圓。它的半徑等于\sqrt{d/p}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)圓.
  2. 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)化,最后缺氧的變化。
  3. 在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)比較大。
  4. 這個(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)                                                                                                                                                                             
圖2.3-6 plot()函數(shù)生成的Doubs環(huán)境數(shù)據(jù)PCA分析雙序圖

僅僅使用四個(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
)
圖2.3-7
# 使用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.3-8

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)
2.4-1
2.4-2
2.4-3
# 計(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
)

2.4-4

這個(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)
圖2.5-1
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), ])
)
圖2.5-2 PCA 標(biāo)尺1-補(bǔ)充新對(duì)象
# 計(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"
)
圖2.5-3

注意方法和將新變量投影到樣方中相似,但是得額外注意:

  1. vegan包會(huì)對(duì)樣方坐標(biāo)統(tǒng)一乘以一個(gè)常數(shù),所以必須通過手動(dòng)的方法也對(duì)新樣方坐標(biāo)做同樣的操作,這個(gè)常數(shù)可以通過scores()獲得。
  2. 如果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)
2.6-1
# 用點(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)
圖2.6-2
# 原始標(biāo)尺1 新站點(diǎn)的分?jǐn)?shù)
newsit.scores <- newsit.stand %*% U.mat
2.6-3
#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
圖2.6-4
圖2.6-5
# 繪制結(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.6-6

2.7 組合聚類分析結(jié)果和排序結(jié)果

組合聚類分析和排序的結(jié)果對(duì)于解釋或確認(rèn)樣方組之間的差異非常直觀。

兩種方式去組合聚類和排序結(jié)果:

  1. 在排序圖內(nèi)用不同顏色去區(qū)分不同樣方組
  2. 將聚類樹添加到排序圖上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)
2.7-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)
2.7-2
#在排序圖內(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
)
2.7-3

注意:

排序圖中如何用不同的符號(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ì)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評(píng)論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,497評(píng)論 3 416
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,305評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評(píng)論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,727評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,193評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,411評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,945評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,777評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,978評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,216評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評(píng)論 1 286
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,657評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,960評(píng)論 2 373

推薦閱讀更多精彩內(nèi)容