個人理解:
雖然很多介紹PCA的文章,但大多基於PCA的矩陣原理,沒有與實際應用相結合的解釋。而且,我也一直困惑在R中應用PCA的輸入和輸出的設置。所以我寫了下文。
主要參考此文檔:http://strata.uga.edu/software/pdf/pcaTutorial.pdf,並結合自己的數據整理了下面內容。此文檔淺顯易懂,特別好。
1. 坐標旋轉:rotating the data

轉換后的坐標軸,稱為:new vector, or axes。主成分(PC)的坐標軸一般不與原始變量的坐標軸重合。
PCA(Principal Components Analysis):通過坐標旋轉來降維的方法。
PC:對original variable的線性組合產生的坐標軸axes,稱為PC。
對我的啟發:將多維與坐標軸的概念聯系起來,維度可以看做是坐標軸。比如,gene expression中的gene可看做維度、坐標軸,gene expression是上面概念中的original variable。
2. PC的計算、與original variable的關系。
數據:p個variable ×n個sample的矩陣。下式中,X1,X2,..., Xp,表示original variable,即gene個數、描述花朵特征的個數。
PC計算過程:
PC1: Y1=a11X1 + a12X2 +...+ a1pXp, 或:用矩陣的形式表示:Y1=a1X
PC2: Y2=a21X1 + a22X2 +...+ a2pXp
....
PC的講解:
最多有p個主成分,與original variable的數目一致。
比如:參考數據1有4個變量,有4個主成分;參考數據3中有32個變量,主成分最多就是32個。即:有多少個變量,最多就有多少個主成分(PC1,PC2,...);有多少個樣本,每個主成分PC1(PC2...)就有多少個值。
對主成分個數的理解:當Cumulative Proportion值為1時,主成分就終止了。因為此時,用PC1,PC2,...就能夠涵蓋所有的樣本了。
對每個主成分的值(比如,參考數據1的PC1有150個值),應該怎么理解呢?PCA圖為什么展示這些值呢?
特征向量:
從original variable —> PC之間的變換,可以表示為:Y = XA。 A:特征向量矩陣Sx。每一列是一個特征向量。A中的元素aij,稱為權重。該矩陣即為loadings,或下面R輸出結果中的rotation。
3.scores。即:prcomp執行后的x。
每個observation在PC的坐標系統中的位置,稱為scores。它由original variable和權重aij的線性組合計算得出。
比如:第r個sample在第k個PC上的score,計算如下:
Yrk = a1k*xr1 + a2k*xr2 + ... + apk*xrp
比如:樣本1在m個基因下有m個值,根據這m個值,可計算得出樣本1分別在在PC1,PC2,...下面的值(scores)。經常看到的PC1和PC2的散點圖就是用這個數據畫的。比如:df_pca$x
PC1 PC2 PC3 PC4
1 -2.684125626 -0.319397247 0.027914828 0.0022624371
2 -2.714141687 0.177001225 0.210464272 0.0990265503
......
我的問題:對於兩個樣本的150個差異表達基因,能做PCA分析嗎?基於此問題,做了下面的調查分析。
![]()
1. R中應用PCA:
df_pca <- prcomp(test_dt[,2:3], scale. = T)
數據:
test_dt
gene sample_1 sample_2 1 2-Mar 89.76800 165.58500 2 A2M 5.65995 1.61144
...
轉置test_dt:
[,1] [,2] [,3] [,4] [,5] ...
sample1 5.65995 4.47988 3.13712 27.02620 2.074420 ...
sample2 1.61144 1.45420 1.11561 6.32818 0.643795 ...
結果:
df_pca
Standard deviations:
[1] 1.187434e+01 1.380454e-14
Rotation:
PC1 PC2
[1,] -0.08421519 0.990887087
[2,] -0.08421519 -0.014023869
[3,] -0.08421519 -0.002650131
...
[141,] -0.08421519 -0.008337000
df_pca$x:
PC1 PC2 sample1 -8.396428 7.677019e-15 sample2 8.396428 -7.534771e-15
2. 結果分析:
summary(df_pca):
Importance of components:
PC1 PC2
Standard deviation 11.87 1.38e-14
Proportion of Variance 1.00 0.00e+00
Cumulative Proportion 1.00 1.00e+00
由此可以看到:
141個變量,2個樣本的數據,得到了兩個主成分:PC1和PC2。PC1的Cumulative Proportion是1,說明用一個主成分PC1就可以區分這兩個樣本。
rotation的值中,PC1的權重值都一樣-0.08421519,說明由:PC1=aX1+aX2+...+aX141。此處的X1,...是一個矩陣,是兩個樣本在141個變量上的值的矩陣。
pca$x得到4個值,如果畫PC1和PC2的圖,則圖中只有兩個點。且,這兩個是對角線的關系。(這樣的圖不可以)
PC1的方差值很大。
結論:兩個樣本的141個變量,無法進行主成分分析。
從PCA的原理來看,它是想要進行降維,將多個變量描述的事情,降維為幾個新變量就可以描述。一般樣本數大於變量數。
PCA的缺點:
1. 對維度進行的是線性變化,對於不能應用線性變化的數據不適用;
2. 對於降維后的坐標系,不容易解釋。
問題(內容與上面有重復):
問題1:PCA輸入的行和列數據的設置問題。
解決:參考https://www.biostars.org/p/13011/
如果想查看在樣本之間哪些gene的差異最大,那么,行是sample,列是gene。You want to see which genes that mean the most for the differences between the samples, and therefore your samples should be in the rows and your genes should be in the columns.
所以,對於上面的數據,我應該轉置變為下面的數據,然后再利用prcomp函數,即:prcomp(t(test_dt)):
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] ... sample1 89.768 5.65995 34.7021 26.3499 2.31851 27.3431 8.88269 42.4083 27.3434 32.7261 21.1033 12.3434 ... sample2 165.585 1.61144 60.9142 42.8840 1.07268 45.9556 16.95460 70.6224 45.4109 78.1433 45.4268 20.5639 ...
同時,參考PCA的原理,它處理的是:m個(樣本)n維(gene表達值)數據。一般,n行×m列。即:每一列表示一個向量。
從這個角度來看,每一列表示的是一個向量(一個樣本的數據),每一行表示的是描述這個樣本(或這個向量)的信息。
參考:https://blog.csdn.net/daaikuaichuan/article/details/53444639
如此一來,這兩種看法是矛盾的。該如何解決?
我認為在R中用prcomp函數進行PCA分析時,行是sample名,列是特征值。參考R中的數據例子,解釋如下:
數據1——數據iris,行:不同類型的花或同一種花的不同朵,列:花屬性的數據(如:花瓣、花萼的特征)。
> iris[1:3,1:5] Sepal.Length Sepal.Width Petal.Length Petal.Width Species 1 5.1 3.5 1.4 0.2 setosa 2 4.9 3.0 1.4 0.2 setosa 3 4.7 3.2 1.3 0.2 setosa
...
數據——參考2的數據decathlon2,行:遠動員,列:運動員的特征
## X100m Long.jump Shot.put High.jump X400m X110m.hurdle
## SEBRLE 11.0 7.58 14.8 2.07 49.8 14.7
## CLAY 10.8 7.40 14.3 1.86 49.4 14.1
## BERNARD 11.0 7.23 14.2 1.92 48.9 15.0
## YURKOV 11.3 7.09 15.2 2.10 50.4 15.3
## ZSIVOCZKY 11.1 7.30 13.5 2.01 48.6 14.2
## McMULLEN 10.8 7.31 13.8 2.13 49.9 14.4
...
數據——數據3:1000行,32列的數據
[,1] [,2] [,3] [,4] [,5] [,6] ......[,32] [1,] -1.01500872 -1.5419889 -1.5330842 -1.2930589 -0.51541855 -0.7001724
[2,] -0.07963674 -0.2751422 -0.8037817 -0.9519072 -1.57334512 -0.7366414
...
以上前兩個數據,調用prcomp函數時,如下:prcomp(iris),prcomp(decathlon2)
參考:
https://www.jianshu.com/p/f15625700b3b
http://www.sthda.com/english/articles/31-principal-component-methods-in-r-practical-guide/112-pca-principal-component-analysis-essentials/#pca-data-format
問題2:PCA輸出結果的解釋。
> df_pca(參考數據1的輸出) Standard deviations: //主成分的標准方差。與summary(df_pca)中的Standard deviation一致。 [1] 3.807887e-01 3.925231e-17 Rotation: //變量負荷矩陣。列是特征向量。我理解:每個變量(行)對特征向量的貢獻度。 用princomp函數時,用loadings表示。在prcomp中,用rotation表示。
// 即:由四個變量怎么得出PC1~PC4的。即original variable的權重的矩陣。 每一列是一個特征向量。
//PC1 = 0.36138659×Sepal.Length + -0.08452251×Sepal.Width + 0.85667061×Petal.Length
PC1 PC2 PC3 PC4 Sepal.Length 0.36138659 -0.65658877 0.58202985 0.3154872 Sepal.Width -0.08452251 -0.73016143 -0.59791083 -0.3197231 Petal.Length 0.85667061 0.17337266 -0.07623608 -0.4798390 Petal.Width 0.35828920 0.07548102 -0.54583143 0.7536574
> summary(df_pca)(參考數據1的輸出) Importance of components: //這一部分的解釋參照下面的例子。因為此例子的主成分太少,不好解釋。 PC1 PC2 Standard deviation 0.3808 3.925e-17 Proportion of Variance 1.0000 0.000e+00 Cumulative Proportion 1.0000 1.000e+00 //這說明用PC1就能區分所有的樣本。
> summary(pZ) (參考數據3的輸出) Importance of components: PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8 PC9 PC10 PC11 PC12 PC13 PC14 Standard deviation 3.6415 2.7178 1.8447 1.3943 1.10207 0.90922 0.76951 0.67490 0.60833 0.51638 0.49048 0.44452 0.40326 0.3904 Proportion of Variance 0.4352 0.2424 0.1117 0.0638 0.03986 0.02713 0.01943 0.01495 0.01214 0.00875 0.00789 0.00648 0.00534 0.0050 Cumulative Proportion 0.4352 0.6775 0.7892 0.8530 0.89288 0.92001 0.93944 0.95439 0.96653 0.97528 0.98318 0.98966 0.99500 1.0000
// Proportion of Variance:每個主成分在區分樣本方面,做的貢獻度。此行的累積值,就是下一行數據的值。
// Cumulative Proportion:表示用這14個主成分區分樣本時,可以完全區分每一個樣本。如果用3個主成分,可以區分78.9%的樣本。它是上一行數據的累加值。
問題3:如何畫圖,圖的含義?
畫圖函數:
plot(df_pca$x[,1], df_pca$x[,2])
參考:https://mp.weixin.qq.com/s/1f-0DdRH7WU2hAbGRqrECg
圖的含義:
n個樣本的觀察值在新坐標系(PC1,PC2,...)下的位置。比如,樣本1在m個基因下有m個值,根據這m個值,可計算得出樣本1在PC1,PC2,...下面的值(scores)。比如:
df_pca$x
PC1 PC2 PC3 PC4 1 -2.684125626 -0.319397247 0.027914828 0.0022624371 2 -2.714141687 0.177001225 0.210464272 0.0990265503 3 -2.888990569 0.144949426 -0.017900256 0.0199683897 4 -2.745342856 0.318298979 -0.031559374 -0.0755758166 5 -2.728716537 -0.326754513 -0.090079241 -0.0612585926 6 -2.280859633 -0.741330449 -0.168677658 -0.0242008576 7 -2.820537751 0.089461385 -0.257892158 -0.0481431065 8 -2.626144973 -0.163384960 0.021879318 -0.0452978706
......
150 1.390188862 0.282660938 -0.362909648 -0.1550386282 原始數據有150個樣本,4個變量。PCA之后,得到4個主成分。每個樣本在這四個主成分下的值為該表。(散點圖就是用這些數據畫的圖)
問題4:如何用ggplot畫PCA的圖呢?
step1:將prcomp的輸出值轉成data.frame。
df_pcs<-data.frame(df_pca$x,Species=iris$Species) 或者不用后面Species...也可以。(參考https://www.jianshu.com/p/f15625700b3b)

step2:用ggplot操作df_pcs即可。
參考資料:
PCA是進行降維用的。比如:
檢測m個樣本的n個基因的表達值,用m個基因的表達值描述這n個樣本。即m是屬性。
但是,我用n維度的數據(也叫變量。比如基因表達值)去描述、區分這m個樣本,太復雜了。我想用3個特征來區分這m個樣本。比如:給出3個特征,有90%的樣本在這3個特征上都不同。這3個特征就是PC1,PC2和PC3(也叫:主要特征、關鍵特征、主要變量)。
一般情況下,並不能直接找出這樣的主要特征。這時,我們可以用原有維度數據的線性組合(即PC1,PC2,PC3)來表示事物(m個樣本)的主要特征, PCA 就是這樣一種分析方法。
參考:https://www.biomart.cn/experiment/430/590/597/58034.htm在基因表達數據分析中,使用PCA。
總結:這個總結,真是太好了:
PCA是一種著名的數據降維算法,它應用的條件是數據/特征之間具有明顯的線性相關性,它的兩個主要的指導思想是抓主要矛盾和方差即信息,它的基本應用是數據降維,以此為基礎還有數據可視化、數據壓縮存儲、異常檢測、特征匹配與距離計算等。從數學上理解,它是一種矩陣分解算法;從物理意義上理解,它是線性空間上的線性變換。
————————————————
版權聲明:本文為CSDN博主「Chen_Tianyang」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/ctyqy2015301200079/java/article/details/85325125
PCA樣本數的問題。解決:https://www.biostars.org/p/217101/
PCA能否用於差異基因分析中?解決:https://support.bioconductor.org/p/56483/
PCA算法原理:https://blog.csdn.net/daaikuaichuan/article/details/53444639
individual&variable的圖:http://www.sthda.com/english/articles/31-principal-component-methods-in-r-practical-guide/118-principal-component-analysis-in-r-prcomp-vs-princomp/#access-to-the-pca-results
