非約束排序3 主成分分析(PCA)-基于Hellinger轉化的數據以及其他內容

第五章 非約束排序3 主成分分析(PCA)-基于Hellinger轉化的數據以及其他內容

由于前幾天電腦被我搗鼓壞了,今天才修好,所以這幾天就沒有更新,加油。

上次我們講了主成分分析的概念,如何提取、解讀和繪制vegan包輸出的PCA結果,如何將新變量和新對象投影到PCA雙序圖中以及如何組合聚類分析結果和排序結果。不知道你們都消化了嗎?那么今天繼續學習PCA的部分,今天的主要內容是:

  1. 轉化后的物種數據PCA分析
  2. PCA的應用
  3. 使用PCA.newr()函數進行PCA分析
  4. PCA中缺失值的估算

1.數據和包準備

setwd("E:/Rstudio_working/lai jian shan/DATA/Data")
# 加載包,函數和數據
library(ade4)
library(vegan)
library(gclus)
library(ape)
library(missMDA)
library(FactoMineR)

#加載本章后面部分所需要的函數
source("cleanplot.pca.R")
source("PCA.newr.R")
source("CA.newr.R")

# 導入Doubs 數據
load("Doubs.RData")
# 刪除無物種數據的樣方8
spe <- spe[-8, ]
env <- env[-8, ]
spa <- spa[-8, ]

2. 轉化后的物種數據PCA分析

PCA是展示樣方之間歐式距離的線性方法,理論上說并不適用物種多度數據的分析(特別是含有許多0值的情形,歐幾里得距離對雙零問題很敏感)。對于物種組成數據一般不使用PCA這種線性模型去做,而是使用PCoA或NMDS等方法。

如果仍要使用PCA的話,一般需要對數據進行轉化,但是并不是說物種多度數據一定要作轉化。如果物種多度數據比較均勻,且含有很少的0值(避開了歐幾里得距離的“雙零”問題),數據不轉化也可以的。但是如果高豐度和低豐度物種種群的豐度差別比較大,數據并不“均勻”,可以在運行rda( )時,使用“scale=TRUE”消除高豐度物種與稀有物種在重要性方面的差異,降低歐幾里得距離對高數值的敏感性

但是如果0值過多,物種多度數據還是需要進行數據轉化,推薦使用Hellinger轉化

2.1 Hellinger轉化的魚類數據PCA分析

首先需要使用decostand()函數對魚類數據進行Hellinger轉化,然后用rad()進行PCA分析,當然你也可以試一試別的數據轉化方法。

# 物種Hellinger 轉化
spe.h <- decostand(spe, "hellinger")
(spe.h.pca <- rda(spe.h))
圖2.1-1 Hellinger 轉化后數據
圖2.1-2 spe.h.pca
# 帶斷棍模型的碎石圖
dev.new(
  title = "PCA特征值-物種數據的碎石圖", 
  noRStudioGD = TRUE
)
screeplot(spe.h.pca,
          bstick = TRUE, 
          npcs = length(spe.h.pca$CA$eig)
)
圖2.1-3 PCA特征值-物種數據的碎石圖
# PCA 雙序圖
spe.pca.sc1 <- scores(spe.h.pca, display = "species", scaling = 1) #標尺1
spe.pca.sc2 <- scores(spe.h.pca, display = "species", scaling = 2) #標尺2

dev.new(title = "魚類的主成分分析",
        width = 12,
        height = 6,
        noRStudioGD = TRUE
)
par(mfrow = c(1, 2))
cleanplot.pca(spe.h.pca, scaling = 1, mar.percent = 0.06)
cleanplot.pca(spe.h.pca, scaling = 2, mar.percent = 0.06)
圖2.1-4 經過Hellinger轉化后魚類物種數據的PCA分析雙序圖

這里物種不像環境變量那樣能夠明顯分組,但是同樣可以看出物種沿著梯度更替分布。在1型標尺的雙序圖內,可以觀察到有8個物種對于第一、二軸有很大貢獻。

那么這些物種與聚類分析中聚類簇的指示種是否重合?我們可以重新運行一下沒有轉化的物種數據(文件名spe)的PCA,比較一下哪個排序圖能更好地展示物種沿著河流路線的梯度分布情況?

PCA用于物理或化學屬性變量排序分析,在群落數據分析方面的應用越來越廣泛。

數據預轉化并不會改變PCA線性排序的屬性。物種數據預轉化保證物種數據本身特異性,即并沒有過分強調雙零的重要性。

物種數據1型標尺PCA雙序圖揭示的是群落的潛在梯度結構,樣方也是沿著這些潛在梯度(排序軸)依次排列,雙序圖平衡貢獻圓可以識別物種變量對于排序軸的貢獻程度。

2型標尺PCA雙序圖可以揭示物種之間的相關性,但如果是用轉化后的物種數據進行排序,排序圖上的物種之間相關性并不完全等同于原始數據的Pearson相關系數

2.2 環境因子被動加入物種數據PCA分析

在排序過程直接加入環境變量的約束分析(即典范排序)經常被使用,但是如果想在物種數據簡單排序后,再被動加入環境變量呢?這樣我們可以總覽物種數據的結構的同時,也可以推測這種結構與環境因子的關系

通過vegan包里envfit()函數實現,它也適用于CA、PCoA和NMDS。

“envfit 函數在排序圖中確定環境變量向量或因子的平均值。[...]排序圖上點到環境變量向量上的投影距離代表與該環境變量相關性因子的點是因子水平的平均值”。

envfit()函數的輸出結果包含代表因子水平的點或定量環境變量的箭頭的坐標,這些坐標可以被動投影到排序圖。此外,用戶可以通過p1ot()函數只顯示通過envfit()函數計算的置換檢驗獲得的相應的顯著性水平的環境變量

dev.new(
  title = "帶有環境因子的PCA雙序圖-標尺2",
  noRStudioGD = TRUE
)
biplot(spe.h.pca, main = "魚類數據PCA - 2型標尺")
(spe.h.pca.env <-
    envfit(spe.h.pca, env, scaling = 2)) 
# 默認2型標尺
圖2.2-1
圖2.2-2
# 顯示顯著環境變量,用戶設定變量箭頭顏色
plot(spe.h.pca.env, p.max = 0.05, col = 3)

#這行命令是在最后版的雙序圖中增加了顯著環境變量
#注意:必須給envfit提供與繪圖相同的標尺
圖2.2-3

在約束排序中,envfit()函數也可以用于解釋變量與排序軸回歸r^2的顯著性的置換檢驗。但envfit()并不是檢驗解釋變量對響應變量是否有顯著效應最好的方法。

3. PCA的應用領域

PCA在生態學應用主要是用于基于定量環境變量的樣方排序,以及經過適當轉化后的群落組成數據的樣方排序。PCA原始假設要求數據符合多元正態分布。但在生態學領域,只要偏離正態分布不要太離譜,PCA對于數據是否正態分布并不敏感。

PCA的主要計算步驟是基于離散矩陣(線性協方差或相關)的特征分解過程。雖然協方差或相關系數必須用定量變量才能算出,但二元(1-0)數據也可以用于PCA分析。

PCA使用條件

  • PCA分析必須從相同量綱的變量表格開始。因為需要將變量總方差分配給特征根,所以變量必須有相同的物理單位,方差和才有意義(方差的單位是變量單位的平方),或者變量是無量綱的數據,例如標準化或對數轉化后的數據。
  • 矩陣數據不能倒置,因為對象(樣方)之間的協方差或相關沒有意義。
  • 協方差或相關系數必須用定量變量才能算出。但由于半定量變量之間的Pearson相關系數等同于Spearman秩相關系數,所以基于半定量數據的PCA排序結果中變量之間關系是反映Spearman秩相關。
  • 二元的數據也可以進行PCA分析。排序圖對象之間的距離是1減去簡單匹配系數s_1后的平方根(即\sqrt{1-S_1})乘以變量數量的平方根。
  • 物種有-無數據進行PCA分析前,可以用Hellinger轉化或弦轉化數據進行預處理。因為有-無數據的Hellinger距離或弦距離均等于\sqrt2\sqrt{1-Ochiai\ similarity},因此,有-無數據的Hellinger轉化或弦轉化后PCA分析的排序圖(1型標尺)內樣方之間的距離是Ochiai距離。\sqrt2\sqrt{1-Ochiai\ similarity}是一種距離測度,這種測度也適用于有一無物種數據的分析。
  • 應該避免用變量箭頭頂點的距離來評估變量之間的相關性,而是用箭頭之間的角度來判斷相關性

4.使用PCA.newr()函數進行PCA分析

為了方便能夠快速地用自己的數據進行PCA分析,本書作者編寫了PCA.newr()和biplot.PCA.newr()兩個函數(在自編函數PCA.newr.R里面)。下面用Doubs環境數據為例演示這兩個函數的使用流程。

#PCA,這里默認是1型標尺雙序圖
# PCA; 這里默認是1型標尺雙序圖
env.PCA.PL <- PCA.newr(env, stand = TRUE)
dev.new(
  title = "PCA on environmental variables - scaling 1",
  noRStudioGD = TRUE
)
biplot.PCA.newr(env.PCA.PL)

# PCA;生成2型標尺雙序圖
dev.new(
  title = "PCA on environmental variables - scaling 2",
  noRStudioGD = TRUE
)
biplot.PCA.newr(env.PCA.PL, scaling = 2)
圖4-1
圖4-2
圖4-3

這里主成分軸正負方向是隨機的,可能與vegan包輸出的排序圖成鏡像關系。但沒有關系,因為對象或變量之間的相對位置沒有變化。

5. PCA中缺失值的估算

如果有缺失值該怎么辦?

刪除缺失值所在的行和列,把珍貴的同行或列數據丟棄不用?或者,為了避免這種情況,用一些方法找到有意義的替代值進行運算(統計語時中稱為“插值")。例如:利用相應變量的平均值或通過其他相關變量的國歸分析獲得的估計插值。當這兩種解決方案出現時,我們不會考慮估計缺失值不確定性及其在進一步分析中的用途。結果,補充后的變量的標準誤被低估,導致接下來的運算一些假設統計檢驗失效。

為了解決這些缺點,Josse和Huson(2012)提出了“一個正則化(regu-larized)的迭代PCA算法,為主坐標分析和主成分分析提供點估計”。這個算法與vegan包里的算法不一樣,PCA是一軸一軸逐步迭代出來。當碰到缺失值的時候,會以該變量的平均值來替代。但不斷迭代過程,缺失值會根據新的計算結果不斷獲得新的估計值,直到收斂為止,也就是讓缺失值獲得穩定的補充值。

實施復雜程序的目的在于:

避免過度擬合估算模型(即當數據里面有比較多的缺失值的時候,有太多參數需要調整的問題)

克服低估內插值方差的問題

注意:用推算得到的PCA的解決方案在不同PCA軸之間并不是嵌套關系,即基于s軸解決方案不等于與(s+1)或(s+2)解決方案。所以,做出所需的軸數適當的先驗決定非常重要。該決定可能是經驗性的(例如,使用具有特征值之和大于斷棍模型預測的軸),或者在PCA重建過程,它可以通過數據本身的交又驗證程序告知數據哪里刪除,以及計算重建誤差。我們的目的是保留最小化重建誤差的軸數

missMDA包,匯總了PCA分析所有可能通過選代方式插值缺失值的方法。這個差值的函數為imputePcA()。接下來將以Doubs環境數據做兩個實驗,第一次只有3個缺失值(即所有319個數值的1%的缺失值),第二次是32個缺失值(10%)。

我們的第一個實驗包括刪除選擇代表各種情況的三個值

第一個值將靠近帶相對對稱分布的變量的平均值附近。pH平均值=8.04。讓我們刪除樣方2中pH值(8.0)。

第二個將接近高度不對稱分布的變量的均值,pho平均值=0.57。讓我們刪除樣方19中的pho值(第18行,0.60)。

第三個將從不對稱分布變量中刪除,但刪除后遠離均值。bod平均值為5.01。讓我們刪除樣方23的bod值(第22行,16.4,是第二高的值)。

看一下imputePcA()如何執行迭代?

# PCA缺失值估計實驗一:3個缺失值

# 用 NA 替換3個備選的值
env.miss3 <- env
env.miss3[2, 5] <- NA    # pH
env.miss3[18, 7] <- NA   # pho
env.miss3[22, 11] <- NA  # dbo

#三個變量的新均值(無缺失值)
mean(env.miss3[, 5], na.rm = TRUE)
mean(env.miss3[, 7], na.rm = TRUE)
mean(env.miss3[, 11], na.rm = TRUE)

圖5-1
圖5-2
圖5-3
# 估算
env.imp <- imputePCA(env.miss3)

# 估算值

env.imp$completeObs[2, 5]    # 原始值: 8.0
env.imp$completeObs[18, 7]   # 原始值: 0.60
env.imp$completeObs[22, 11]  # 原始值 16.4

# 帶估算值的PCA
env.imp3 <- env.imp$completeObs
env.imp3.pca <- rda(env.imp3, scale = TRUE)

# 原始PCA和帶估算值的PCA的Procrustes比較
env.pca <- rda(env,scale=TRUE)
pca.proc <- procrustes(env.pca, env.imp3.pca, scaling = 1)
圖5-4
圖5-5
圖5-6
dev.new(title = "Imputation in PCA",
        width = 14,
        height = 7,
        noRStudioGD = TRUE
)

plot(pca.proc, 
     main = "原始和帶估計值PCA的procrustes比較\n3缺失值")
points(pca.proc, display = "target", col = "red")
text(
  pca.proc,
  display = "target",
  col = "red",
  pos = 4,
  cex = 0.6
)

圖5-7

圖5-7 PCA中缺失數據的估算。Procrustes比較原始環境變量PCA和對三個缺失值進行估算的PCA。1型標尺,這里只繪制樣方圖。紅色是原始PCA的樣方;藍色是估算值的PCA中的樣方。3個缺失值,即1%

上面這三個估算值,唯一比較好的估算是pH,它恰好落在原始值上。請記住,pH在數據中是對稱分布的。另外兩個估算遠離原始值,這兩個變量都有強不對稱分布。顯然,這比缺失值接近或不接近變量的平均值更重要(pho屬于這種情況,但bod不是這種情況)。

那么如何影響排序結果(前2軸)

為了觀察這個結果,在帶有估算值矩陣上計算新的PCA,并將其與原始PCA進行比較。通過Procrustes旋轉新環境變量PCA軸,使其與原始PCA一致。Procrustes旋轉是最小化兩個排序結構同一標號的對象圖上的距離平方和目的在于獲得最多的重疊區域Procrustes旋轉可以通過vegan包的函數procrustes()來執行

顯然,實際值和重建值之間的差異對排序的影響很小。唯一可見的區別是在樣方23,其中實際值與重建值之間的差異最大。

#缺失值估計實驗二:32個缺失值
#從319個值中隨機抽取32個用NA替代
rnd <- matrix(sample(c(rep(1, 32), rep(0, 287))), 29, 11)
env.miss32 <- env
env.miss32[rnd == 1] <- NA
# 每個樣方里面多少NA?
summary(t(env.miss32))
# 顯示NA數量的替代方法:
# sapply(as.data.frame(t(env.miss32)), function(x) sum(is.na(x)))

# 內插估計
env.imp2 <- imputePCA(env.miss32)

# 帶估計值的PCA
env.imp32 <- env.imp2$completeObs
env.imp32.pca <- rda(env.imp32, scale = TRUE)

# 原始PCA和帶估計值的PCA的procrustes比較
pca.proc32 <- procrustes(env.pca, env.imp32.pca, scaling = 1)
圖5-8
圖5-9
dev.new(title = "Imputation in PCA",
        width = 14,
        height = 7,
        noRStudioGD = TRUE
)

plot(pca.proc32, 
     main = "原始和帶估計值PCA的procrustes比較\n32缺失值")
points(pca.proc32, display = "target", col = "red")
text(
  pca.proc32,
  display = "target",
  col = "red",
  pos = 4,
  cex = 0.6
)

圖5-10

第二個例子是基于隨機刪除環境中的32個值矩陣。這個案例表明了Josse和Husson的插補技巧可以用來拯救一個數據集,以避免由于刪除較多缺失值所在的行和列引起的影響(此處如刪除了18行;所有列均受影響)。

注意:在上面的一些標題中,\n的使用允許人們將長標題進行換行

到這里,大部分的PCA內容就都結束了,今天的主要內容是:

  • 轉化后的物種數據PCA分析
  • PCA的應用
  • 使用PCA.newr()函數進行PCA分析
  • PCA中缺失值的估算

今天的內容也比較多,但是我覺得最主要的就是利用Hellinger轉化后的數據進行PCA分析,這個用的多。請期待下一次的內容對應分析(CA)。

如有不足或錯誤之處,請批評指正。
有什么不明白的也歡迎留言討論。

歡迎關注微信公眾號:fafu 生信 小蘑菇

往期內容:

《數量生態學:R語言的應用》第三章-R模式

《數量生態學:R語言的應用》第二版第三章-關聯測度與矩陣------Q模式

《數量生態學:R語言的應用》第二版筆記2

《數量生態學——R語言的應用》第二版閱讀筆記--緒論和第二章(一部分)

R語言 pheatmap 包繪制熱圖(基礎部分)

R語言pheatmap包繪制熱圖進階教程

使用PicGo和gitee搭建圖床

組間分析—T檢驗、R語言繪圖

Rmarkdown的xaringan包來制作PPT

htlm文件部署到個人網站

感謝你的閱讀!!!你的點贊關注轉發是對我最大的鼓勵。

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

推薦閱讀更多精彩內容