R語言PCA分析教程 Principal Component Methods in R(代碼下載)
主成分分析Principal Component Methods(PCA)允許我們總結和可視化包含由多個相互關聯的定量變量描述的個體/觀察的數據集中的信息。每個變量都可以視爲不同的維度。如果數據集中包含3個以上的變量,那麼可視化多維超空間可能非常困難。
主成分分析用於從多變量數據表中提取重要信息,並將此信息表示爲一組稱爲主成分的新變量。這些新變量對應於原件的線性組合。主成分的數量小於或等於原始變量的數量。PCA的目標是識別數據變化最大的方向(或主成分)。換句話說,PCA將多變量數據的維度降低到兩個或三個主要成分,這些成分可以圖形化可視化,同時信息損失最小。PCA屬於機器學習降維方法質之一,但是僅僅對線性數據有用,非線性數據建議使用TSNE。
本文描述了PCA的基本概念,並演示瞭如何使用R軟件計算和可視化PCA。此外,我們將展示如何揭示解釋數據集變化的最重要變量。主要內容如下:
- 基礎
- 計算
- 實例
- 總結
1. 基礎
- 基礎概念
- 計算過程
1.1 基礎概念
瞭解PCA的細節需要線性代數的知識。在這裏,我們將僅通過簡單的數據圖形表示來解釋基礎知識。
在下圖1A中,數據在XY座標系中表示。通過識別數據變化的主要方向(稱爲主成分)來實現降維。PCA假設方差最大的方向是最“重要的”(即最主要的方向)。
在下圖1A中,PC1軸是樣本顯示最大變化的第一個主方向。PC2軸是第二個最重要的方向,它與PC1軸正交。通過將每個樣本投影到第一個主成分上,我們的二維數據的維數可以減少到一個維度(圖1B)。
從技術上講,每個主成分保留的方差量是通過所謂的特徵值來測量的。請注意,當數據集中的變量高度相關時,PCA方法特別有用。相關性表明數據存在冗餘。由於這種冗餘,PCA可用於將原始變量減少爲較少數量的新變量(= 主成分),解釋原始變量的大部分方差。
總的來說,主成分分析的主要目的是:
- 識別數據集中的隱藏模式;
- 通過消除數據中的噪聲和冗餘來降低數據的維度;
- 識別相關變量。
1.2 計算過程
目前很多書籍講PCA並不那麼通俗易懂。PCA是用來降低數據維度的,維度降低後的主成分和原來的變量不是一個東西。如果想獲得原來數據中重要的變量,刪除無關變量,請參考特徵工程。PCA計算過程很簡單,具體如下:
(1)數據處理
假設我們有這樣的2維數據:
其中行代表了樣例,列代表特徵,這裏有10個樣例可以認爲有10輛汽車,x是千米/小時的速度,y是英里/小時的速度。
通常x,y都是不同的變量,如果要放到一起來比較,一般都要進行數據標準化使得各個變量數據能夠放到一塊比較。這裏簡單一點,只減去平均值。分別求x和y的平均值,然後對於所有的樣例,都減去對應的均值。這裏x的均值是1.81,y的均值是1.91,那麼一個樣例減去均值後即爲(0.69,0.49),得到
(2) 計算特徵值
在現實情況下,我們需要通過計算數值矩陣的相關係數矩陣或者協方差矩陣來求得特徵值和特徵向量,進而獲得主要成分。相關係數矩陣和協方差矩陣能夠變量間相關性,主成分分析會刪除和其他變量相關性強的變量,留下更具有代表性的變量。相關係數矩陣相當於消除量綱的表示變量間相關性的一個矩陣,協方差係數矩陣是沒有消除量綱的表示變量間相關性的矩陣。相關係數矩陣是協方差係數矩陣的特例,通常在PCA中,如果數據量很少用相關係數矩陣,很多用協方差係數矩陣。
這裏主要計算協方差係數矩陣,因爲協方差係數更具有實際代表意義。主要計算過程網上都有。那麼我們能夠獲得矩陣的特徵值和特徵向量(這部分是線性代數的內容)。如下所示:
這裏特徵值0.049對應特徵向量爲;特徵值1.284對應特徵向量爲。
主成分分析降維的意思就是根據特徵值的大小挑選主成分變量,比如這裏我們要把二維數據降爲一維,就選取最大特徵值1.284對應的特徵向量計算主成分得分。計算公式如下:
PC1就是我們說的主成分得分,特徵向量(-0.677, -0.735)就是我們說得主成分系數。我們所獲得降維後的一維變量就是通過這個公式對每行數據通過上面公式獲得的。結果如下:
(3) 可視化描述
上述過程可以簡單用圖來描述,我們有一個經過歸一化的數據,這個數據各個樣本點都是分散的,無規律的。
如果我們將原數據降爲二維(這裏實際維度沒有變化,一維不好表示)。那麼結果如下:
可以看到現在各個樣本點分佈像一條直線,與x軸平行。樣本點的x座標就是第一主成分,第二主成分就是y座標。
其中貢獻率是表示投影后信息的保留程度的變量,計算公式就是前K個特徵值除以總的特徵值之和。計算公公式如下:
比如本文例子有兩個特徵值1.284和0.049,如果我們降爲一維主成分,那麼第一主成分貢獻率爲。
PCA詳細原理說明見:https://blog.csdn.net/LuohenYJ/article/details/78355954
2. 計算
- R包
- R代碼
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
我們將使用演示數據集decathlon2從factoextra包,數據集如下:
data(decathlon2)
head(decathlon2)
X100m | Long.jump | Shot.put | High.jump | X400m | X110m.hurdle | Discus | Pole.vault | Javeline | X1500m | Rank | Points | Competition | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
<dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <int> | <int> | <fct> | |
SEBRLE | 11.04 | 7.58 | 14.83 | 2.07 | 49.81 | 14.69 | 43.75 | 5.02 | 63.19 | 291.7 | 1 | 8217 | Decastar |
CLAY | 10.76 | 7.40 | 14.26 | 1.86 | 49.37 | 14.05 | 50.72 | 4.92 | 60.15 | 301.5 | 2 | 8122 | Decastar |
BERNARD | 11.02 | 7.23 | 14.25 | 1.92 | 48.93 | 14.99 | 40.87 | 5.32 | 62.77 | 280.1 | 4 | 8067 | Decastar |
YURKOV | 11.34 | 7.09 | 15.19 | 2.10 | 50.42 | 15.31 | 46.26 | 4.72 | 63.44 | 276.4 | 5 | 8036 | Decastar |
ZSIVOCZKY | 11.13 | 7.30 | 13.48 | 2.01 | 48.62 | 14.17 | 45.67 | 4.42 | 55.37 | 268.0 | 7 | 8004 | Decastar |
McMULLEN | 10.83 | 7.31 | 13.76 | 2.13 | 49.91 | 14.38 | 44.41 | 4.42 | 56.37 | 285.1 | 8 | 7995 | Decastar |
但我們只選擇部分數據進行計算,處理如下:
decathlon2.active <- decathlon2[1:23, 1:10]
head(decathlon2.active[, 1:6], 4)
X100m | Long.jump | Shot.put | High.jump | X400m | X110m.hurdle | |
---|---|---|---|---|---|---|
<dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | |
SEBRLE | 11.04 | 7.58 | 14.83 | 2.07 | 49.81 | 14.69 |
CLAY | 10.76 | 7.40 | 14.26 | 1.86 | 49.37 | 14.05 |
BERNARD | 11.02 | 7.23 | 14.25 | 1.92 | 48.93 | 14.99 |
YURKOV | 11.34 | 7.09 | 15.19 | 2.10 | 50.42 | 15.31 |
在主成分分析中,變量通常被縮放(即標準化)。當變量以不同的尺度(例如:千克,千米,釐米…)測量時,尤其建議這樣做; 否則,獲得的PCA輸出將受到嚴重影響。目標是使變量具有可比性。通常,變量被縮放爲具有標準偏差1和平均值爲零。數據標準化是在PCA和聚類分析之前廣泛用於基因表達數據分析的方法。當變量的平均值和/或標準偏差大不相同時,我們可能還希望縮放數據。縮放變量時,數據轉換公式如下:
這種方法是計算相關係數矩陣,默認是計算相關係數矩陣而不是協方差係數矩陣。請注意,默認情況下在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除以10等於0.4124,或者,通過該第一特徵值解釋約41.24%的變化。解釋的累積百分比是通過將所解釋的變化的連續比例相加以獲得運行總計來獲得的。例如,41.242%加上18.385%等於59.627%,依此類推。因此,大約59.627%的變化由前兩個特徵值一起解釋
可以使用函數fviz_eig()或fviz_screeplot() 生成scree圖。結果如下:
scree圖能夠表示各個主成分貢獻率,進而決定選擇多少主成分。目前沒有廣爲接受的客觀方法來決定有多少主成分就足夠了,這取決於具體的應用領域和具體的數據集。通過可以將主成分數量限制爲佔總方差的比例。例如上圖,數據中包含的87%的信息(差異)由前五個主要組成部分保留,我們就選擇前五個主成分。
3. 實例
- 變量分析
- 觀測值分析
- 圖表定製
3.1 變量分析
變量也就是樣本的屬性,在R語言中每列就是樣本集的單個屬性值。
3.1.1 變量基礎作圖
# 獲得數據
library("FactoMineR")
library("factoextra")
data(decathlon2)
decathlon2.active <- decathlon2[1:23, 1: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表示包含變量對主成分的貢獻(百分比)
接下來我們將介紹如何可視化這些變量並得出有關其相關性的結論。
相關曲線作圖
一個變量和一個主成分之間的關係的代表着在PC座標系裏面該變量的座標,對變量作圖我們可以用fviz_pca_var函數。
這張圖也可以稱爲變量相關圖,它展示了變量組內包括和主成分之間的關係,正相關的變量是彼此靠近的,負相關的變量師南轅北轍的,而從中心點到變量的長度則代表着變量在這個維度所佔的比例(也可以理解爲質量,quality)。這個圖根據coord獲得。
# Coordinates of variables
head(var$coord, 4)
# col.var設定線條顏色
fviz_pca_var(res.pca, col.var = "black")
Dim.1 | Dim.2 | Dim.3 | Dim.4 | Dim.5 | |
---|---|---|---|---|---|
X100m | -0.8506257 | -0.17939806 | 0.3015564 | 0.0335732 | -0.1944440 |
Long.jump | 0.7941806 | 0.28085695 | -0.1905465 | -0.1153896 | 0.2331567 |
Shot.put | 0.7339127 | 0.08540412 | 0.5175978 | 0.1284684 | -0.2488129 |
High.jump | 0.6100840 | -0.46521415 | 0.3300852 | 0.1445501 | 0.4027002 |
代表質量作圖
變量在PCA結果裏面的質量(quality)稱爲cos2,可以使用corrplot包在所有維度上可視化變量的cos2。 或者使用factoextra包的fviz_cos2()可視化,只是顯示效果相比前種方法弱。
head(var$cos2)
library("corrplot")
# is.corr表示輸入的矩陣不是相關係數矩陣
corrplot(var$cos2, is.corr=FALSE)
Dim.1 | Dim.2 | Dim.3 | Dim.4 | Dim.5 | |
---|---|---|---|---|---|
X100m | 0.7235641 | 0.0321836641 | 0.09093628 | 0.0011271597 | 0.03780845 |
Long.jump | 0.6307229 | 0.0788806285 | 0.03630798 | 0.0133147506 | 0.05436203 |
Shot.put | 0.5386279 | 0.0072938636 | 0.26790749 | 0.0165041211 | 0.06190783 |
High.jump | 0.3722025 | 0.2164242070 | 0.10895622 | 0.0208947375 | 0.16216747 |
X400m | 0.4922473 | 0.0842034209 | 0.08039091 | 0.1856106269 | 0.01079698 |
X110m.hurdle | 0.5838873 | 0.0006121077 | 0.20149984 | 0.0002854712 | 0.05027463 |
corrplot 0.84 loaded
# Total cos2 of variables on Dim.1 and Dim.2
# 在第一第二主成分是顯示結果(通過值的疊加顯示)
fviz_cos2(res.pca, choice = "var", axes = 1:2)
- 一個較高的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
)
當然,我們也可以通過改變變量的透明度 alpha.var來說明其重要性:
# Change the transparency by cos2 values
fviz_pca_var(res.pca, alpha.var = "cos2")
變量對主成分的貢獻作圖
變量在計算給定主成分變異性時的貢獻以百分比表示。與PC1(即Dim.1)和PC2(即Dim.2)相關的變量在解釋數據集的可變性時是最重要的。
與任何PCA無關或與最後維度相關的變量是具有低貢獻的變量,可能會被刪除以簡化整體分析。貢獻值越大,變量對主成分的貢獻越大。可以使用函數corrplot()[corrplot package]突出顯示每個維度的最大貢獻變量:
head(var$contrib, 4)
library("corrplot")
corrplot(var$contrib, is.corr=FALSE)
Dim.1 | Dim.2 | Dim.3 | Dim.4 | Dim.5 | |
---|---|---|---|---|---|
X100m | 17.544293 | 1.7505098 | 7.338659 | 0.1375524 | 5.389252 |
Long.jump | 15.293168 | 4.2904162 | 2.930094 | 1.6248594 | 7.748815 |
Shot.put | 13.060137 | 0.3967224 | 21.620432 | 2.0140727 | 8.824401 |
High.jump | 9.024811 | 11.7715838 | 8.792888 | 2.5498795 | 23.115504 |
函數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)
使用以下R代碼獲得對PC1和PC2的總貢獻。其中axes指示座標,top指示畫前多少個變量,紅色虛線代表着平均貢獻,高於平均值的可以被認爲算是重要變量。如果變量的貢獻是均勻的,則預期值將是1 /長度(變量)= 1/10 = 10%。對於給定的組件,貢獻大於此截止值的變量可以被認爲對組件的貢獻很重要。
fviz_contrib(res.pca, choice = "var", axes = 1:2, top = 10)
但是注意給定變量的總貢獻解釋由兩個主成分保留的變化,比如PC1和PC2不是簡單的貢獻率疊加,需要通過該公式計算得到contrib = [(C1 * Eig1)+(C2 * Eig2)] /(Eig1 + Eig2)。其中:
- C1和C2分別是變量在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")
)
請注意,還可以使用選項根據其contrib值更改變量的透明度alpha.var = “contrib”。例如,鍵入以下內容:
# Change the transparency by contrib values
fviz_pca_var(res.pca, alpha.var = "contrib")
3.1.2 變量自定義作圖
由自定義連續變量着色
在前面的部分中,我們展示瞭如何根據貢獻和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")
按組確定顏色
也可以通過定性/分類變量定義的組來更改變量的顏色,也可以factor在R術語中調用。由於我們的數據集中沒有任何分組變量用於分類變量,我們將創建它。在下面的演示示例中,我們首先使用kmeans聚類算法將變量分爲3組。接下來,我們使用kmeans算法返回的聚類來着色變量.請注意,要更改組的顏色,應使用參數調色板。要更改漸變顏色,應使用參數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")
維度說明
對於維度描述可以通過dimdesc(函數[在FactoMineR中]用於標識具有給定主成分的最顯着關聯變量。在輸出中,quant表示定量變量的結果。請注意,變量按相關性的p值排序。它可以用如下:
#proba用於表徵維度的顯着性閾值,
res.desc <- dimdesc(res.pca, axes = c(1,2), proba = 0.05)
# Description of dimension 1 第一主成分
res.desc$Dim.1
$quanti =
# 第二主成分
res.desc$Dim.2
$quanti =
3.2 觀測值分析
觀測值指的是樣本集中單個樣本數據,R語言中數據每一行代表一個樣本
3.2.1 觀測值基礎作圖
可以使用函數get_pca_ind()[ factoextra package] 提取個體的結果。與此類似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)
與變量一樣,也可以通過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)
)
Dim.1 | Dim.2 | Dim.3 | Dim.4 | Dim.5 | |
---|---|---|---|---|---|
SEBRLE | 0.007530179 | 0.49747323 | 0.081325232 | 0.001386688 | 0.2689026575 |
CLAY | 0.048701249 | 0.45701660 | 0.143628117 | 0.125791741 | 0.0507850580 |
BERNARD | 0.197199804 | 0.28996555 | 0.004294015 | 0.411819183 | 0.0007567259 |
YURKOV | 0.096109800 | 0.02382571 | 0.778230322 | 0.061812637 | 0.0202279796 |
ZSIVOCZKY | 0.001574385 | 0.57641944 | 0.239754152 | 0.001388216 | 0.0054654972 |
McMULLEN | 0.002175437 | 0.15219499 | 0.110137872 | 0.266486530 | 0.3892621478 |
你還可以通過pointsize和gradient.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)
)
要在圖上創建觀測量表示cos2的條形圖,您可以使用fviz_cos2()前面描述的變量函數,通過choice選擇類型,變量是var,觀測量是ind
fviz_cos2(res.pca, choice = "ind")
要想描繪觀測量對前兩個主要組成部分的貢獻,請鍵入:
# Total contribution on PC1 and PC2
fviz_contrib(res.pca, choice = "ind", axes = 1:2)
3.2.2 觀測值自定義作圖
在這裏,我們描述瞭如何按組對觀測量進行着色。此外,我們將展示如何按組添加濃度橢圓和置信橢圓。爲此,我們將使iris數據作爲演示數據集。iris數據集如下所示:
head(iris, 3)
Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
---|---|---|---|---|
<dbl> | <dbl> | <dbl> | <dbl> | <fct> |
5.1 | 3.5 | 1.4 | 0.2 | setosa |
4.9 | 3.0 | 1.4 | 0.2 | setosa |
4.7 | 3.2 | 1.3 | 0.2 | setosa |
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代碼中:參數habillage或col.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",
)
請注意,調色板的允許值包括:
- 灰色調色板的“grey”;
- brewer調色板例如“RdBu”,“Blues”,…; 要查看全部,請在R:中鍵入RColorBrewer::display.brewer.all()。
- 自定義調色板,例如c(“藍色”,“紅色”);
- 科學期刊調色板(來自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"
)
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和2上表示。例如,如果要在主成分2和3上可視化它們,則應指定參數axes = c(2, 3)。
# Variables on dimensions 2 and 3
fviz_pca_var(res.pca, axes = c(2, 3))
# Individuals on dimensions 2 and 3
fviz_pca_ind(res.pca, axes = c(2, 3))
繪圖元素:點,文本,箭頭
參數geom(對於幾何)和導數用於指定要用於繪圖的幾何元素或圖形元素。
- 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"))
- 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")
繪圖元素的大小和形狀
- 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)
橢圓的添加
正如我們在上一節中所描述的,當按組着色觀測值時,可以使用參數添加點集中橢圓addEllipses = TRUE。請注意,該參數ellipse.type可用於更改省略號的類型。可能的值是:
- “convex”:繪製一組凸包。
- “confidence”:將組平均點周圍的置信橢圓作爲函數coord.ellipse()[在FactoMineR中]。
- “t”:假設多變量t分佈。
- “norm”:假設多元正態分佈。
- “euclid”:繪製一個半徑等於水平的圓圈,表示距離中心的歐氏距離。除非coord_fixed()應用,否則此橢圓可能不會顯示爲圓形。
該參數ellipse.level也可用於以正常概率改變濃集中橢圓的大小。例如,指定ellipse.level = 0.95或ellipse.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"
)
軸線
該參數axes.linetype可用於指定軸的線型。默認爲“虛線”。允許的值包括“blank”,“solid”, “dotted”等。要查看所有可能的值,請ggpubr::show_line_types()在R中鍵入。要刪除軸線,請使用axes.linetype =“blank”.具體使用如下:
fviz_pca_var(res.pca, axes.linetype = "dotted")
圖形參數
要輕鬆更改任何ggplots的圖形,可以使用函數ggpar[ggpubr package]。可以使用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"
)
Biplot
Biplot爲主成分分析雙標圖。注意biplot圖可能僅在數據集中存在少量變量和觀測量時纔有用; 否則最終的情節將無法辨認。另請注意,觀察值和變量的座標不是在同一空間上構建的。因此,在biplot圖中,您應該主要關注變量的方向,而不是它們在圖上的絕對位置。粗略地說:biplot展示了兩方面內容:
- 根據前兩個主成分,每個觀測的得分;
- 根據前兩個主成分,每個變量的載荷。
其具體說明意義如下:
- 向量在橫座標的投影就是對主成分2的載荷(係數),在縱座標的投影就是對主成分1的載荷。(具體軸對應哪個變量看軸名)。但是這些都是近似,因爲座標軸有所不同;
- 點代表的是觀測值,點之間的距離,反映它們對應的樣本之間的差異大小,兩點相距較遠,對應樣本差異大;兩點相距較近,對應樣本差異小,存在相似性;
- 兩向量餘弦值的絕對值大小反映兩向量間的相關性大小,值越大表明兩個向量對應的屬性之間相關性越高。當兩個向量近似垂直時,兩個屬性之間相關性很弱,幾乎互不影響。
詳細解釋見:
- https://stats.stackexchange.com/questions/2038/interpretation-of-biplots-in-principal-components-analysis
- https://blog.bioturing.com/2018/06/18/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
)
現在,使用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")
在下面的示例中,我們希望按組爲觀測量和變量着色。訣竅是對各個觀測點使用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
另一個複雜的例子是按組(離散顏色)和變量對主要成分(漸變顏色)的貢獻對個體進行着色。另外,我們將使用參數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")
)
過濾結果
如果您有許多個體/變量,則可以使用參數select.ind和select.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))
# Select by names
# 根據名字顯示
name <- list(name = c("Long.jump", "High.jump", "X100m"))
fviz_pca_var(res.pca, select.var = name)
# 根據前五貢獻
# top 5 contributing individuals and variable
fviz_pca_biplot(res.pca, select.ind = list(contrib = 5),
select.var = list(contrib = 5),
ggtheme = theme_minimal())
3.3.2 導出結果
將圖表導出爲PDF / PNG文件
該factoextra包生成基於ggplot2的圖形。要保存任何ggplots,標準R代碼如下:
pdf("myplot.pdf")
print(myplot)
dev.off()
在以下示例中,我們將向您展示如何將不同的圖表保存爲pdf或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)
- 將這些圖導出爲單個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()
- 要將每個繪圖打印到特定的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)
將結果導出到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 。接下來,我們使用factoextra R包來生成基於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函數具體見:
本文主要參考文檔有: