R 語言主成分分析(PCA)實戰教程


作者:落痕的寒假
原文:https://blog.csdn.net/LuohenYJ/article/details/97950522

聲明:本文章經原作者同意后授權轉載。

主成分分析 Principal Component Methods(PCA)允許我們總結和可視化包含由多個相互關聯的定量變量描述的個體/觀察的數據集中的信息。每個變量都可以視為不同的維度。如果數據集中包含 3 個以上的變量,那么可視化多維超空間可能非常困難。

主成分分析用於從多變量數據表中提取重要信息,並將此信息表示為一組稱為主成分的新變量。這些新變量對應於原件的線性組合。主成分的數量小於或等於原始變量的數量。PCA 的目標是識別數據變化最大的方向(或主成分)。換句話說,PCA 將多變量數據的維度降低到兩個或三個主要成分,這些成分可以圖形化可視化,同時信息損失最小。PCA 屬於機器學習降維方法質之一,但是僅僅對線性數據有用,非線性數據建議使用 TSNE。

本文描述了 PCA 的基本概念,並演示了如何使用 R 軟件計算和可視化 PCA。此外,我們將展示如何揭示解釋數據集變化的最重要變量。主要內容如下:

  1. 基礎

  2. 計算

  3. 實例

  4. 總結

1. 基礎

1.1 基礎概念

了解 PCA 的細節需要線性代數的知識。在這里,我們將僅通過簡單的數據圖形表示來解釋基礎知識。

在下圖 1A 中,數據在 XY 坐標系中表示。通過識別數據變化的主要方向(稱為主成分)來實現降維。PCA 假設方差最大的方向是最 “重要的”(即最主要的方向)。

在下圖 1A 中,PC1 軸是樣本顯示最大變化的第一個主方向。PC2 軸是第二個最重要的方向,它與 PC1 軸正交。通過將每個樣本投影到第一個主成分上,我們的二維數據的維數可以減少到一個維度(圖 1B)。

4d982c19-49b1-41f0-a4f0-7c6cfbe0402e.png

65e61ff0-3400-4a46-8884-50a7b7d7bb24.png

從技術上講,每個主成分保留的方差量是通過所謂的特征值來測量的。請注意,當數據集中的變量高度相關時,PCA 方法特別有用。相關性表明數據存在冗余。由於這種冗余,PCA 可用於將原始變量減少為較少數量的新變量(= 主成分),解釋原始變量的大部分方差。
82bd0007-8997-41e7-a166-085b3a7413e6.png

d97bc558-2bfe-4049-bfa8-3d496d68c181.png

總的來說,主成分分析的主要目的是:
  • 識別數據集中的隱藏模式;

  • 通過消除數據中的噪聲和冗余來降低數據的維度;

  • 識別相關變量。

1.2 計算過程

目前很多書籍講PCA並不那么通俗易懂。PCA 是用來降低數據維度的,維度降低后的主成分和原來的變量不是一個東西。如果想獲得原來數據中重要的變量,刪除無關變量,請參考特征工程。PCA 計算過程很簡單,具體如下:

1.2.1 數據處理

假設我們有這樣的 2 維數據:

2f0cebaf-2410-4f0c-b8c6-a2573a7be735.png

其中行代表了樣例,列代表特征,這里有 10 個樣例可以認為有 10 輛汽車,x 是千米/小時的速度,y 是英里/小時的速度。

通常 x,y 都是不同的變量,如果要放到一起來比較,一般都要進行數據標准化使得各個變量數據能夠放到一塊比較。這里簡單一點,只減去平均值。分別求 x 和 y 的平均值,然后對於所有的樣例,都減去對應的均值。這里 x 的均值是 1.81,y 的均值是 1.91,那么一個樣例減去均值后即為(0.69, 0.49),得到:

8c1864c4-6e9e-493b-aca1-42cba3431601.png

1.2.2 計算特征值

在現實情況下,我們需要通過計算數值矩陣的相關系數矩陣或者協方差矩陣來求得特征值和特征向量,進而獲得主要成分。相關系數矩陣和協方差矩陣能夠變量間相關性,主成分分析會刪除和其他變量相關性強的變量,留下更具有代表性的變量。相關系數矩陣相當於消除量綱的表示變量間相關性的一個矩陣,協方差系數矩陣是沒有消除量綱的表示變量間相關性的矩陣。相關系數矩陣是協方差系數矩陣的特例,通常在 PCA 中,如果數據量很少用相關系數矩陣,很多用協方差系數矩陣。

這里主要計算協方差系數矩陣,因為協方差系數更具有實際代表意義。主要計算過程網上都有。那么我們能夠獲得矩陣的特征值和特征向量(這部分是線性代數的內容)。如下所示:

fcb345f5-5f81-4ada-a1ae-e4bd70cbf485.png

這里特征值 0.049 對應特征向量為:

7d0969eb-e574-4353-b8e0-e962c39a04a6.svg
特征值 1.284 對應特征向量為:
dff09bab-589a-4c1e-b55a-cf89b72dd3de.svg

主成分分析降維的意思就是根據特征值的大小挑選主成分變量,比如這里我們要把二維數據降為一維,就選取最大特征值 1.284 對應的特征向量計算主成分得分。計算公式如下:

82faf381-bd20-4204-97e8-9d2617433b72.svg

PC1 就是我們說的主成分得分,特征向量 (-0.677, -0.735) 就是我們說得主成分系數。我們所獲得降維后的一維變量就是通過這個公式對每行數據通過上面公式獲得的。結果如下:

3b57e505-6e1a-4786-a72a-661bfaba0c77.png

1.2.3 可視化描述

上述過程可以簡單用圖來描述,我們有一個經過歸一化的數據,這個數據各個樣本點都是分散的,無規律的。

fb81624b-9cc5-4c6d-b396-9fbcd2228511.png

如果我們將原數據降為二維(這里實際維度沒有變化,一維不好表示)。那么結果如下:

0558d77a-a0e5-40d0-b90a-c98849cef94b.png
可以看到現在各個樣本點分布像一條直線,與 x 軸平行。樣本點的 x 坐標就是第一主成分,第二主成分就是 y 坐標。

其中貢獻率是表示投影后信息的保留程度的變量,計算公式就是前 K 個特征值除以總的特征值之和。計算公公式如下:

7b1d3de6-41df-4123-9dc2-ddb0cc8ced39.svg

比如本文例子有兩個特征值 1.284 和 0.049,如果我們降為一維主成分,那么第一主成分貢獻率為 1.284/( 1.284 + 0.049 ) = 0.963 。

PCA詳細原理說明見:[機器學習] PCA (主成分分析)詳解

2. 計算

2.1 R 包

用於計算 PCA 的 R 軟件中提供了來自不同軟件包的多個函數:

  • prcomp()princomp()[內置]

  • PCA( [FactoMineR包]

  • dudi.pca()[ade4包]

  • epPCA()[ExPosition包]

無論您決定使用什么功能,您都可以使用factoextraR包中提供的 R 功能輕松提取和可視化 PCA 的結果。

通過install.packages("FactoMineR", "factoextra")安裝所使用的包。

# 調用 R 包
library("FactoMineR")
library("factoextra")
Warning message:
"package 'FactoMineR' was built under R version 3.6.1"Loading required package: ggplot2
Welcome! Related Books: `Practical Guide To Cluster Analysis in R` at https://goo.gl/13EFCZ

我們將使用來自factoextra包的decathlon2演示數據集,數據集如下:

data(decathlon2)
head(decathlon2)
71fb4cc7-85b6-4a61-856a-68ccbf092f80.png
但我們只選擇部分數據進行計算,處理如下:
decathlon2.active <- decathlon2[1:231:10]
head(decathlon2.active[, 1:6], 4)
5cfb918f-5ff2-4099-92e7-825dee0d2431.png

在主成分分析中,變量通常被縮放(即標准化)。當變量以不同的尺度(例如:千克,千米,厘米…)測量時,尤其建議這樣做; 否則,獲得的 PCA 輸出將受到嚴重影響。目標是使變量具有可比性。通常,變量被縮放為具有標准偏差1和平均值為零。數據標准化是在PCA和聚類分析之前廣泛用於基因表達數據分析的方法。當變量的平均值和/或標准偏差大不相同時,我們可能還希望縮放數據。縮放變量時,數據轉換公式如下:
9153591f-cf32-4f33-9cff-5a9333ea3404.png

這種方法是計算相關系數矩陣,默認是計算相關系數矩陣而不是協方差系數矩陣。請注意,默認情況下在 FactoMineR 中,PCA 之前會自動標准化數據;所以你不需要在 PCA 之前進行這種轉換。


2.2 R 代碼

本部分主要介紹 R 語言FactoMineR進行 PCA 的常用代碼,具體實例見下一章。

PCA(X, scale.unit = TRUE, ncp = 5, graph = TRUE)
  • X:數據框。行是個體,列是數字變量

  • scale.unit:一個邏輯值。如果為 TRUE,則在分析之前將數據縮放為單位方差。這種相同規模的標准化避免了一些變量因其較大的測量單位而成為主導。它使變量具有可比性。

  • ncp:最終結果中保留的維數。

  • graph:一個邏輯值。如果為 TRUE,則顯示圖表。

我們將使用 factoextra R 包來幫助解釋 PCA。無論你決定使用什么函數,你都可以輕松地提取和可視化 PCA 的結果。使用 factoextra R 包中提供的 R 函數,這些功能包括:
  • get_eigenvalue(res.pca):提取主成分的特征值/方差。

  • fviz_eig(res.pca):可視化特征值。

  • get_pca_ind(res.pca)get_pca_var(res.pca):分別提取個體和變量的結果。

  • fviz_pca_ind(res.pca)fviz_pca_var(res.pca):分別可視化結果個體和變量。

  • fviz_pca_biplot(res.pca):制作主成分分析散點圖biplot圖。

我們檢查特征值以確定考慮的主成分的數量。可以使用函數get_eigenvalue提取主成分保留的特征值和方差(即信息)的比例。

eig.val <- get_eigenvalue(res.pca)
eig.val
##        eigenvalue variance.percent cumulative.variance.percent
## Dim.1       4.124            41.24                        41.2
## Dim.2       1.839            18.39                        59.6
## Dim.3       1.239            12.39                        72.0
## Dim.4       0.819             8.19                        80.2
## Dim.5       0.702             7.02                        87.2
## Dim.6       0.423             4.23                        91.5
## Dim.7       0.303             3.03                        94.5
## Dim.8       0.274             2.74                        97.2
## Dim.9       0.155             1.55                        98.8
## Dim.10      0.122             1.22                       100.0

每個特征值解釋的變化比例在第二列中給出。例如,4.124 除以 1 0等於 0.4124,或者,通過該第一特征值解釋約 41.24% 的變化。解釋的累積百分比是通過將所解釋的變化的連續比例相加以獲得運行總計來獲得的。例如,41.242% 加上 18.385% 等於 59.627%,依此類推。因此,大約 59.627% 的變化由前兩個特征值一起解釋。

可以使用函數fviz_eig()fviz_screeplot()生成 scree 圖。結果如下:

2e16b5de-9b59-4161-b3bd-77847e32f4a7.png

scree 圖能夠表示各個主成分貢獻率,進而決定選擇多少主成分。目前沒有廣為接受的客觀方法來決定有多少主成分就足夠了,這取決於具體的應用領域和具體的數據集。通過可以將主成分數量限制為占總方差的比例。例如上圖,數據中包含的 87% 的信息(差異)由前五個主要組成部分保留,我們就選擇前五個主成分。


3. 實例

3.1 變量分析

變量也就是樣本的屬性,在R語言中每列就是樣本集的單個屬性值。

3.1.1 變量基礎作圖

# 獲得數據
library("FactoMineR")
library("factoextra")
data(decathlon2)
decathlon2.active <- decathlon2[1:231:10]
# PCA計算
res.pca <- PCA(decathlon2.active, graph = FALSE)
# 提取變量的分析結果
var <- get_pca_var(res.pca)
var
Principal Component Analysis Results for variables
 ===================================================
  Name       Description
1 "$coord"   "Coordinates for the variables"
2 "$cor"     "Correlations between variables and dimensions"
3 "$cos2"    "Cos2 for the variables"
4 "$contrib" "contributions of the variables"
factoextra包自帶了提取變量的分析結果 get_pca_var函數,其中:
  • coord:表示用於創建散點圖的變量坐標。coord 實際上就是成分載荷,指觀測變量與主成分的相關系數。

  • cor:表示相關系數。

  • cos2:表示因子質量,var.cos2 = var.coord * var.coord。

  • contrib:表示包含變量對主成分的貢獻(百分比)。

接下來我們將介紹如何可視化這些變量並得出有關其相關性的結論。

1. 相關曲線作圖

一個變量和一個主成分之間的關系的代表着在PC坐標系里面該變量的坐標,對變量作圖我們可以用fviz_pca_var函數。

這張圖也可以稱為變量相關圖,它展示了變量組內包括和主成分之間的關系,正相關的變量是彼此靠近的,負相關的變量師南轅北轍的,而從中心點到變量的長度則代表着變量在這個維度所占的比例(也可以理解為質量,quality)。這個圖根據coord獲得。

# Coordinates of variables
head(var$coord, 4)
# col.var設定線條顏色
fviz_pca_var(res.pca, col.var = "black")
20ffbcc4-c520-4f95-ae32-c8b1049d54e9.png

0a38d22b-a3bb-4148-9192-81bd11359b72.png
2. 代表質量作圖

變量在PCA結果里面的質量(quality)稱為 cos2,可以使用corrplot包在所有維度上可視化變量的 cos2。或者使用factoextra包的fviz_cos2()可視化,只是顯示效果相比前種方法弱。

head(var$cos2)
library("corrplot")
# is.corr表示輸入的矩陣不是相關系數矩陣
corrplot(var$cos2, is.corr=FALSE)
68498ef6-8f27-4840-84bb-f515f2c45786.png
corrplot 0.84 loaded
28dddadd-8a6f-4071-9c97-fc5c12a47d45.png
# Total cos2 of variables on Dim.1 and Dim.2
# 在第一第二主成分是顯示結果(通過值的疊加顯示)
fviz_cos2(res.pca, choice = "var", axes = 1:2)
2f47acde-f1fb-4dd8-ba79-3958c8155f9c.png
  • 一個較高的 cos2 值代表着這個變量對該主成分有較大的貢獻值,這種情況下變量位於相關曲線圖里面的靠近圓的邊緣。

  • 一個較低的 cos2 值代表着這個變量並沒有很好的被主成分所代表,變量在相關曲線圖里面就靠近圓心。

  • cos2 值就是為了衡量一個變量的有用程度,越高就代表着這個變量在主成分分析里面越重要。

  • 對於給定變量,所有主成分上的 cos2 之和等於 1。

可以使用參數通過 cos2 值對變量進行着色 col.var = "cos2。這會產生漸變色。在這種情況下,參數 gradient.cols可用於提供自定義顏色。例如, gradient.cols = c("white", "blue", "red")意味着:
  • 具有低 cos2 值的變量將以 "白色" 着色。

  • 具有中等 cos2 值的變量將以 "藍色" 着色。

  • 具有高 cos2 值的變量將以 "紅色" 着色。

# Color by cos2 values: quality on the factor map
fviz_pca_var(res.pca, col.var = "cos2",
             gradient.cols = c("#00AFBB""#E7B800""#FC4E07"),
             repel = TRUE # Avoid text overlapping
             )
835bf2d0-2372-4ea2-8a85-c7e05b8c86f8.png

當然,我們也可以通過改變變量的透明度 alpha.var來說明其重要性:
# Change the transparency by cos2 values
fviz_pca_var(res.pca, alpha.var = "cos2")
babb3fac-658e-438c-acfa-97fe517b14a6.png
3. 變量對主成分的貢獻作圖

變量在計算給定主成分變異性時的貢獻以百分比表示。與 PC1(即 Dim.1)和 PC2(即 Dim.2)相關的變量在解釋數據集的可變性時是最重要的。

與任何 PCA 無關或與最后維度相關的變量是具有低貢獻的變量,可能會被刪除以簡化整體分析。貢獻值越大,變量對主成分的貢獻越大。可以使用函數corrplot()[corrplot包]突出顯示每個維度的最大貢獻變量:

head(var$contrib, 4)
library("corrplot")
corrplot(var$contrib, is.corr=FALSE)
6ba02025-21df-4bfe-aaf6-03cb153ef5f5.png

d25f1294-f6b9-4f9c-99a6-48a2a83e1dd0.png

函數fviz_contrib()[factoextra 包] 可用於繪制可變貢獻的條形圖。如果您的數據包含許多變量,則可以決定僅顯示最常見的變量。下面的 R 代碼顯示了主要組件的前 10 個變量:

# Contributions of variables to PC1
# 各變量對第一主成分的貢獻
fviz_contrib(res.pca, choice = "var", axes = 1, top = 10)
# Contributions of variables to PC2
# 各變量對第二主成分的貢獻
fviz_contrib(res.pca, choice = "var", axes = 2, top = 10)
14708a9e-f0e6-4172-b357-67be912059e3.png

c004619e-99c4-4315-ac82-ecd942cd8ff8.png

使用以下 R 代碼獲得對 PC1 和 PC2 的總貢獻。其中 axes 指示坐標,top 指示畫前多少個變量,紅色虛線代表着平均貢獻,高於平均值的可以被認為算是重要變量。如果變量的貢獻是均勻的,則預期值將是 1/長度(變量)= 1/10 = 10%。對於給定的組件,貢獻大於此截止值的變量可以被認為對組件的貢獻很重要。

fviz_contrib(res.pca, choice = "var", axes = 1:2, top = 10)
97eeb181-e19d-4cae-a2d2-d3c05d2de1ad.png
但是注意給定變量的總貢獻解釋由兩個主成分保留的變化,比如 PC1 和 PC2 不是簡單的貢獻率疊加,需要通過該公式計算得到 contrib = [(C1 * Eig1)+(C2 * Eig2)] /(Eig1 + Eig2)。其中:
  • C1 和 C 2分別是變量在 PC1 和 PC2 上的貢獻。

  • Eig1 和 Eig2 分別是 PC1 和 PC2 的特征值。回想一下,特征值測量每個主成分保留的變化量。

在這種情況下,預期平均貢獻(截止)計算如下:如上所述,如果 10 個變量的貢獻是均勻的,則給定 PC 上的預期平均貢獻將是 1/10 = 10%。PC1 和 PC2 變量的預期平均貢獻為:[(10 * Eig1)+(10 * Eig2)]/(Eig1 + Eig2)。可以看出,變量 X100m,Long.jump 和 Pole.vault 對第一主成分和第二主成分 2 的貢獻最大。

類似於 cos2 的顯示,最重要的(或貢獻的)變量可以在相關圖中突出顯示如下:

fviz_pca_var(res.pca, col.var = "contrib",
             gradient.cols = c("#00AFBB""#E7B800""#FC4E07")
             )
eb90ad0c-60a0-4f94-88bc-30fcbe94e6aa.png

請注意,還可以使用選項根據其 contrib 值更改變量的透明度 alpha.var = "contrib"。例如,鍵入以下內容:
# Change the transparency by contrib values
fviz_pca_var(res.pca, alpha.var = "contrib")
ba69badb-0f67-417a-bef4-aed4afce821f.png

3.1.2 變量自定義作圖

1. 由自定義連續變量着色

在前面的部分中,我們展示了如何根據貢獻和 cos2 對變量進行着色。請注意,可以通過任何自定義連續變量為變量着色。着色變量的長度應與 PCA 中的活動變量數相同(此處 n = 10)。例如,鍵入以下內容:

# Create a random continuous variable of length 10
# 生成隨機數
set.seed(123)
my.cont.var <- rnorm(10)
# Color variables by the continuous variable
# col.var設置顏色
# gradient.cols設置顏色漸變范圍
fviz_pca_var(res.pca, col.var = my.cont.var,
             gradient.cols = c("blue""yellow""red"),
             legend.title = "Cont.Var")
b8b6df93-0c6a-4c48-97fa-71498a3f1a2a.png
2. 按組確定顏色

也可以通過定性/分類變量定義的組來更改變量的顏色,也可以 factor 在 R 術語中調用。由於我們的數據集中沒有任何分組變量用於分類變量,我們將創建它。在下面的演示示例中,我們首先使用 kmeans 聚類算法將變量分為 3 組。接下來,我們使用 kmean s算法返回的聚類來着色變量.請注意,要更改組的顏色,應使用參數調色板。要更改漸變顏色,應使用參數gradient.cols

# Create a grouping variable using kmeans
# Create 3 groups of variables (centers = 3)
set.seed(123)
# 進行聚類
# center聚類數量
res.km <- kmeans(var$coord, centers = 3, nstart = 25)
# 將向量編碼為因子
grp <- as.factor(res.km$cluster)
# Color variables by groups
fviz_pca_var(res.pca, col.var = grp,
             palette = c("#0073C2FF""#EFC000FF""#868686FF"),
             legend.title = "Cluster")
2773e0e3-4678-4591-9b95-e3893725e3b6.png
2. 維度說明

對於維度描述可以通過dimdes 函數 [FactoMineR包] 用於標識具有給定主成分的最顯着關聯變量。在輸出中,quant 表示定量變量的結果。請注意,變量按相關性的 p 值排序。它可以用如下:

#proba用於表征維度的顯着性閾值,
res.desc <- dimdesc(res.pca, axes = c(1,2), proba = 0.05)
# Description of dimension 1 第一主成分
res.desc$Dim.1
590c2f54-0b95-417a-bc47-7b7c866f496d.png
# 第二主成分
res.desc$Dim.2
dd2130ab-becc-4370-a39c-6b244a417a50.png

3.2 觀測值分析

觀測值指的是樣本集中單個樣本數據,R語言中數據每一行代表一個樣本。

3.2.1 觀測值基礎作圖

可以使用函數get_pca_ind()[factoextra包] 提取個體的結果。與此類似get_pca_var(),該函數get_pca_ind()提供了一個包含個體所有結果的矩陣列表(坐標,相關性,cos2 和貢獻率)。

ind <- get_pca_ind(res.pca)
ind
Principal Component Analysis Results for individuals
 ===================================================
  Name       Description
1 "$coord"   "Coordinates for the individuals"
2 "$cos2"    "Cos2 for the individuals"
3 "$contrib" "contributions of the individuals"

fviz_pca_ind()用於產生觀測值的曲線圖。要創建簡單的圖,請鍵入:

fviz_pca_ind(res.pca)
e98a2741-3022-498a-8a35-7219fc89b022.png

與變量一樣,也可以通過 cos2 值為觀測值着色:

# Quality of individuals
head(ind$cos2)
# repel=TRUE能夠避免部分重合的點重疊
fviz_pca_ind(res.pca, col.ind = "cos2",
             gradient.cols = c("#00AFBB""#E7B800""#FC4E07"),
             repel = TRUE # Avoid text overlapping (slow if many points)
             )
5ab83e98-03a7-49c4-8d0a-b2ac96260d29.png

1ef333ad-565c-434b-a40d-6acee93ca9de.png

你還可以通過pointsizegradient.cols改變點的大小和顏色:

fviz_pca_ind(res.pca, col.ind = "cos2", pointsize = "cos2",
             gradient.cols = c("#00AFBB""#E7B800""#FC4E07"),
             repel = TRUE # Avoid text overlapping (slow if many points)
             )
d4a45ef3-e9c4-48a1-b92c-4586827f57bd.png

要在圖上創建觀測量表示 cos2 的條形圖,您可以使用fviz_cos2()前面描述的變量函數,通過 choice 選擇類型,變量是 var,觀測量是 ind:

fviz_cos2(res.pca, choice = "ind")
c04f434b-611a-4926-9759-f386ffac0a3d.png

要想描繪觀測量對前兩個主要組成部分的貢獻,請鍵入:

# Total contribution on PC1 and PC2
fviz_contrib(res.pca, choice = "ind", axes = 1:2)
ec36404c-c190-48ac-ab79-692ad5e08258.png

3.2.2 觀測值自定義作圖

在這里,我們描述了如何按組對觀測量進行着色。此外,我們將展示如何按組添加濃度橢圓和置信橢圓。為此,我們將使 iris 數據作為演示數據集。iris 數據集如下所示:

4561d744-f5b1-4616-a52c-1a72b5716300.png

iris 數據集包含 150 個數據樣本,分為 3 類,每類 50 個數據,每個數據包含 4 個屬性。可通過花萼長度,花萼寬度,花瓣長度,花瓣寬度 4 個屬性預測鳶尾花卉屬於(Setosa,Versicolour,Virginica)三個種類中的哪一類。“Species” 列將用作分組變量。我們首先計算主成分分析如下:
# The variable Species (index = 5) is removed before PCA analysis
# 第5列不進行PCA運算
iris.pca <- PCA(iris[,-5], graph = FALSE)
在下面的 R 代碼中:
  • 參數 habillagecol.ind 可用於指定因子變量以按組着色個體。

  • 要在每個組周圍添加集中橢圓,請指定參數 addEllipses = TRUE 。該

  • 參數 palette 可用於更改組顏色。

  • 要刪除組平均點(組的重心),請指定參數 mean.point = FALSE

  • 如果你想要置信橢圓而不是集中橢圓,請使用 ellipse.type ="confidence" 。置信橢圓是對置信區域的描述,濃度橢圓是對點分布的描述。置信橢圓的算法復雜,背后有很多繁雜的數學原理。置信橢圓的長短半軸,分別表示二維位置坐標分量的標准差(如經度的 σλ 和緯度的 σφ)。一倍標准差(1σ)的概率值是 68.3%,二倍標准差(2σ)的概率值為 95.5%;三倍標准差(3σ)的概率值是 99.7%。


fviz_pca_ind(iris.pca,
             # show points only (nbut not "text") 只顯示點而不顯示文本,默認都顯示
             geom.ind = "point",
             # 設定分類種類
             col.ind = iris$Species,
             # 設定顏色
             palette = c("#00AFBB""#E7B800""#FC4E07"),
             # 添加橢圓 Concentration ellipses
             addEllipses = TRUE,
             legend.title = "Groups",
             )
403d08c9-f22c-4cc2-b547-91dea328cbf0.png

請注意,調色板的允許值包括:
  • 灰色調色板的 "grey";

  • brewer 調色板例如 "RdBu","Blues",…;要查看全部,請在 R 中鍵入RColorBrewer::display.brewer.all()

  • 自定義調色板,例如c("blue", "red")

  • 科學期刊調色板(來自ggsci R package),例如:"npg","aaas","lancet","jco","ucscgb","uchicago","simpsons" 和 "rickandmorty"。這些"npg","jco" 都是雜志或者出版集團的縮寫,具體搜索就行。

例如,要使用 jco(臨床腫瘤學雜志)調色板,請輸入以下內容:

fviz_pca_ind(iris.pca,
             label = "none"# hide individual labels
             habillage = iris$Species, # color by groups
             addEllipses = TRUE# Concentration ellipses
             palette = "jco"
             )
4e348f1e-0b89-4974-ae56-ca4172300caa.png

3.3 圖表定制

注意,fviz_pca_ind()fviz_pca_var()相關的函數是核心函數的包裝fviz()[factoextra包]。fviz()是函數ggscatter()[ggpubr包] 中的包裝器。因此,可以在fviz_pca_ind()fviz_pca_var()中指定要傳遞給函數fviz()ggscatter()的其他參數。在這里,我們提供了一些額外的參數來定制變量和觀測量的 PCA 圖。

3.3.1 基礎要素

1. 維度

默認情況下,變量/觀測量在主成分 1 和 2 上表示。例如,如果要在主成分 2 和 3 上可視化它們,則應指定參數axes = c(2, 3)

# Variables on dimensions 2 and 3
fviz_pca_var(res.pca, axes = c(23))
# Individuals on dimensions 2 and 3
fviz_pca_ind(res.pca, axes = c(23))
df8337d1-d874-4065-a3ec-a9724e644d92.png

fbd98ce0-c9c9-4535-8365-d54b84e08c47.png
2. 繪圖元素:點,文本,箭頭

參數geom(對於幾何)和導數用於指定要用於繪圖的幾何元素或圖形元素。

  1. geom.var:一個文本,指定用於繪制變量的幾何參數。允許值是c(“點”,“箭頭”,“文本”)的組合。

  • 使用geom.var = "point",僅顯示點;

  • 用於geom.var = "text",僅顯示文本標簽;

  • 使用geom.var = c("point", "text"),同時顯示點和文字標簽;

  • 使用geom.var = c("arrow", "text"),顯示箭頭和標簽(默認)。

例如,鍵入以下內容:

# Show variable points and text labels
fviz_pca_var(res.pca, geom.var = c("point""text"))
4526e48d-2735-417f-985c-59c2a750bd62.png
  1. geom.ind:一個文本,指定用於繪制觀測值的幾何體。允許值是c("point", "text")的組合。

  • 使用geom.ind = "point",僅顯示點;

  • 用於geom.ind = "text",僅顯示文本標簽;

  • 使用geom.ind = c("point", "text"),同時顯示點和文本標簽(默認)。

例如,鍵入以下內容:

# Show individuals text labels only
fviz_pca_ind(res.pca, geom.ind =  "text")
470eb717-3cdf-4876-bedd-709fd32305e8.png
3. 繪圖元素的大小和形狀
  • labelsize:文本標簽的字體大小,例如:labelsize = 4。
  • pointsize:點的大小,例如:pointsize = 1.5。

  • arrowsize:箭頭的大小。控制箭頭的粗細,例如:arrowsize = 0.5。

  • pointshape:點的形狀,pointshape = 21。鍵入ggpubr::show_point_shapes()以查看可用的點形。

具體例子如下:

# Change the size of arrows an labels
fviz_pca_var(res.pca, arrowsize = 1, labelsize = 5,
             repel = TRUE)
# Change points size, shape and fill color
# Change labelsize
fviz_pca_ind(res.pca,
             pointsize = 3, pointshape = 21, fill = "lightblue",
             labelsize = 5, repel = TRUE)
80fbc25d-9324-4d40-89d0-47a295431fe2.png

b60c65bc-d685-4770-88fc-eb8b9b8c5bb7.png
4. 橢圓的添加
正如我們在上一節中所描述的,當按組着色觀測值時,可以使用參數添加點集中橢圓 addEllipses = TRUE。請注意,該參數 ellipse.type可用於更改省略號的類型。可能的值是:
  • "convex":繪制一組凸包。

  • "confidence":將組平均點周圍的置信橢圓作為函數coord.ellipse()[FactoMineR包]。

  • "t":假設多變量 t 分布。

  • "norm":假設多元正態分布。

  • "euclid":繪制一個半徑等於水平的圓圈,表示距離中心的歐氏距離。除非coord_fixed()應用,否則此橢圓可能不會顯示為圓形。

該參數ellipse.level也可用於以正常概率改變濃集中橢圓的大小。例如,指定ellipse.level = 0.95ellipse.level = 0.66。具體例子如下:

# Add confidence ellipses
fviz_pca_ind(iris.pca, geom.ind = "point",
             # 使用iris數據集
             col.ind = iris$Species, # color by groups
             palette = c("#00AFBB""#E7B800""#FC4E07"),
             addEllipses = TRUE, ellipse.type = "confidence",
             legend.title = "Groups"
             )
# Convex hull
fviz_pca_ind(iris.pca, geom.ind = "point",
             col.ind = iris$Species, # color by groups
             palette = c("#00AFBB""#E7B800""#FC4E07"),
             # 用凸包多邊形代替橢圓
             addEllipses = TRUE, ellipse.type = "convex",
             legend.title = "Groups"
             )
8b6d60cd-d2c3-4592-8842-8e6243f2082a.png

41882326-6e25-4064-8ae7-356c28916ac2.png
5. 軸線

該參數axes.linetype可用於指定軸的線型。默認為“虛線”。允許的值包括"blank","solid","dotted" 等。要查看所有可能的值,請ggpubr::show_line_types()在 R 中鍵入。要刪除軸線,請使用axes.linetype ="blank"。具體使用如下:

fviz_pca_var(res.pca, axes.linetype = "dotted")
9f2fdcb5-331f-47e2-93df-fd9e733d6f15.png
6. 圖形參數
要輕松更改任何 ggplots 的圖形,可以使用函數 ggpar[ ggpubr包]。可以使用 ggpar()更改的圖形參數包括:
  • 主要標題,軸標簽和圖例標題。

  • 標題位置。可能的值:"top","bottom","left","right","none"。

  • 調色板。

  • 主題。允許的值包括:theme_gray()theme_bw()theme_minimal()theme_classic()theme_void()

具體使用如下:

ind.p <- fviz_pca_ind(iris.pca, geom = "point", col.ind = iris$Species)
ggpubr::ggpar(ind.p,
              title = "Principal Component Analysis",
              # 下標題
              subtitle = "Iris data set",
              # 說明
              caption = "Source: factoextra",
              # x,y軸標題
              xlab = "PC1", ylab = "PC2",
              # 標題名字位置
              legend.title = "Species", legend.position = "top",
              # 主題和配設
              ggtheme = theme_gray(), palette = "jco"
              )
192834be-1788-4412-9086-fb63f84971e6.png
7. Biplot
Biplot 為主成分分析雙標圖。注意 biplot 圖可能僅在數據集中存在少量變量和觀測量時才有用;否則最終的情節將無法辨認。另請注意,觀察值和變量的坐標不是在同一空間上構建的。因此,在 biplo t圖中,您應該主要關注變量的方向,而不是它們在圖上的絕對位置。粗略地說:biplot 展示了兩方面內容:
  1. 根據前兩個主成分,每個觀測的得分;

  2. 根據前兩個主成分,每個變量的載荷。

其具體說明意義如下:
  • 向量在橫坐標的投影就是對主成分 2 的載荷(系數),在縱坐標的投影就是對主成分 1 的載荷。(具體軸對應哪個變量看軸名)。但是這些都是近似,因為坐標軸有所不同;

  • 點代表的是觀測值,點之間的距離,反映它們對應的樣本之間的差異大小,兩點相距較遠,對應樣本差異大;兩點相距較近,對應樣本差異小,存在相似性;

  • 兩向量余弦值的絕對值大小反映兩向量間的相關性大小,值越大表明兩個向量對應的屬性之間相關性越高。當兩個向量近似垂直時,兩個屬性之間相關性很弱,幾乎互不影響。

詳細解釋見:
  • 《Interpretation of biplots in principal components analysis》

  • 《How to read PCA biplots and scree plots》

要制作觀測量和變量的 biplot,請鍵入:

fviz_pca_biplot(res.pca, repel = TRUE,
                col.var = "#2E9FDF"# Variables color
                col.ind = "#696969"  # Individuals color
                )
2f41ae1f-fb79-40b6-b562-7a9e8e5e2005.png

現在,使用 iris.pca 輸出,讓我們:
  • 制作觀測量和變量的雙重圖;

  • 按組更改觀測量顏色:col.ind = iris$Species

  • 僅顯示變量的標簽:label = "var"或使用geom.ind = "point"


fviz_pca_biplot(iris.pca,
                # 觀測量顏色
                col.ind = iris$Species, palette = "jco",
                # 添加橢圓
                addEllipses = TRUE, label = "var",
                # 線條顏色
                col.var = "black", repel = TRUE,
                legend.title = "Species")
6fc5a630-764b-49f1-8844-d0ff08e7d23b.png

在下面的示例中,我們希望按組為觀測量和變量着色。訣竅是對各個觀測點使用pointshape = 21。可以使用參數fill.ind通過顏色填充此特定點形狀。使用col.inds設置各個點的邊框線顏色設置為 "black"。使用參數col.var按組對變量着色。要自定義個體和變量顏色,我們使用輔助函數fill_palette()color_palette()[ggpubr包]。

fviz_pca_biplot(iris.pca,
                # Fill individuals by groups
                geom.ind = "point",
                # 點的形狀
                pointshape = 21,
                # 點的大小
                pointsize = 2.5,
                # 按照組類特定形狀
                fill.ind = iris$Species,
                col.ind = "black",
                # Color variable by groups
                # 顏色
                col.var = factor(c("sepal""sepal""petal""petal")),
                # 標題
                legend.title = list(fill = "Species", color = "Clusters"),
                repel = TRUE        # Avoid label overplotting
             )+
  ggpubr::fill_palette("jco")+      # Indiviual fill color
  ggpubr::color_palette("npg")      # Variable colors
12bffabe-845b-463a-a750-26c505186219.png

另一個復雜的例子是按組(離散顏色)和變量對主要成分(漸變顏色)的貢獻對個體進行着色。另外,我們將使用參數alpha.var通過貢獻率來改變變量的透明度。

fviz_pca_biplot(iris.pca,
                # Individuals
                geom.ind = "point",
                fill.ind = iris$Species, col.ind = "black",
                pointshape = 21, pointsize = 2,
                palette = "jco",
                addEllipses = TRUE,
                # Variables
                alpha.var ="contrib", col.var = "contrib",
                gradient.cols = "RdYlBu",

                legend.title = list(fill = "Species", color = "Contrib",
                                    alpha = "Contrib")
                )
8f5d6492-2e73-4049-ae1a-528112443534.png
8. 過濾結果
如果您有許多個體/變量,則可以使用參數 select.indselect.var 僅顯示其中一些觀測量/變量。 select.ind, select.var為選擇要繪制的個體/變量。允許的值為 NULL 或包含參數 name,cos2 或 contrib 的列表:
  • name:是一個包含要繪制的個體/變量名稱的字符向量;

  • cos2:如果 cos2 在 [0,1] 中,例如:0.6,則繪制 cos2>0.6 的觀測量/變量;

  • if cos2 > 1,例如:5,然后繪制具有最高 cos2 的前 5 個活動觀測量/變量;

  • contrib:如果 contrib>1,例如:5,則繪制具有最高貢獻的前 5 個觀測量/變量。

具體使用如下:

# Visualize variable with cos2 >= 0.6
# 可視化cos2>0.6
fviz_pca_var(res.pca, select.var = list(cos2 = 0.6))
05231705-d71d-47e5-8895-33f9af9b5ffb.png
# Select by names
# 根據名字顯示
name <- list(name = c("Long.jump""High.jump""X100m"))
fviz_pca_var(res.pca, select.var = name)
5035ce7e-d6d9-41fb-b91d-d5ed6293cc54.png
# 根據前五貢獻
# top 5 contributing individuals and variable
fviz_pca_biplot(res.pca, select.ind = list(contrib = 5),
               select.var = list(contrib = 5),
               ggtheme = theme_minimal())
b015e0a6-871a-478c-95fd-1f3b2a801319.png

3.3.2 導出結果

1. 將圖表導出為PDF/PNG文件

factoextra包生成基於ggplot2的圖形。要保存任何 ggplots,標准 R 代碼如下:

pdf("myplot.pdf")
print(myplot)
dev.off()

在以下示例中,我們將向您展示如何將不同的圖表保存為 pdf 或 png 文件。

  1. 創建您想要的圖作為 R 對象:

# Scree plot
scree.plot <- fviz_eig(res.pca)
# Plot of individuals
ind.plot <- fviz_pca_ind(res.pca)
# Plot of variables
var.plot <- fviz_pca_var(res.pca)
  1. 將這些圖導出為單個 pdf 文件,放入同一個 pdf 文件:
# Create a new pdf device 創建新的pdf文件
pdf("PCA.pdf")
print(scree.plot)
print(ind.plot)
print(var.plot)
# Close the pdf device 關閉文件
dev.off()
  1. 要將每個繪圖打印到特定的 png 文件,R 代碼如下所示:
# Scree plot
scree.plot <- fviz_eig(res.pca)
# Plot of individuals
ind.plot <- fviz_pca_ind(res.pca)
# Plot of variables
var.plot <- fviz_pca_var(res.pca)
2. 將結果導出到 txt/csv 文件

PCA 的所有輸出(個體/變量坐標,貢獻等)可以使用函數write.infile()[FactoMineR包 ] 中一次導出到 TXT/CSV 文件中:

# Export into a TXT file
write.infile(res.pca, "pca.txt", sep = "\t")
# Export into a CSV file
write.infile(res.pca, "pca.csv", sep = ";")

4. 總結

本文我們描述了如何執行和解釋主成分分析(PCA)。我們使用PCA()函數 [FactoMineR包] 計算 PCA 。接下來,我們使用factoextraR 包來生成基於ggplot2的 PCA 結果可視化。無論你決定使用什么函數,在上面的列表中,factoextra包可以處理輸出以創建漂亮的圖,類似於我們在FactoMineR的前面部分中描述的三個函數:

fviz_eig(res.pca)     # Scree plot
fviz_pca_ind(res.pca) # Graph of individuals
fviz_pca_var(res.pca) # Graph of variables

當然R語言還有其他 PCA 函數具體見:

  1. PCA 使用 prcomp 和 princomp

  2. PCA 使用 ade4 和 factoextr



猜您喜歡 往期精選▼

1. 聚類分析和主成分分析 

2. R 語言中 X11 相關的一些問題

3. R 語言關於 SSL 證書異常處理筆記

4. 使用鏡像加速 Rtools 下載與安裝

5. R 語言柱狀圖示例筆記

6. R 語言畫圖中英文字體解決方案

7. R 語言常用操作與函數匯總

8. R EnhancedVolcano 繪制火山圖


e644e976-d64e-4fbf-8fb4-1bf83e188912.png

本文分享自微信公眾號 - 生信科技愛好者(bioitee)。
如有侵權,請聯系 support@oschina.cn 刪除。
本文參與“OSC源創計划”,歡迎正在閱讀的你也加入,一起分享。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM