PCA主成分分析實(shí)戰(zhàn)和可視化 | 附R代碼和測(cè)試數(shù)據(jù)

一文看懂PCA主成分分析中介紹了PCA分析的原理和分析的意義(基本簡介如下凳怨,更多見博客)瑰艘,今天就用數(shù)據(jù)來實(shí)際操練一下。

image.png

在生信寶典公眾號(hào)后臺(tái)回復(fù)“PCA實(shí)戰(zhàn)”肤舞,獲取測(cè)試數(shù)據(jù)紫新。

一、PCA應(yīng)用

# 加載需要用到的R包library(psych)
library(reshape2)
library(ggplot2)
library(factoextra)

1. 數(shù)據(jù)初始化

# 基因表達(dá)數(shù)據(jù)
exprData <- "ehbio_salmon.DESeq2.normalized.symbol.txt"
# 非必須
sampleFile <- "sampleFile"

2. 數(shù)據(jù)讀入

 # 為了保證文章的使用李剖,文末附有數(shù)據(jù)的新下載鏈接芒率,以防原鏈接失效
 data <- read.table(exprData, header=T, row.names=NULL,sep="\t")

 # 處理重復(fù)名字,謹(jǐn)慎處理篙顺,先找到名字重復(fù)的原因再?zèng)Q定是否需要按一下方式都保留
 rownames_data <- make.names(data[,1],unique=T)
 data <- data[,-1,drop=F]
 rownames(data) <- rownames_data
 data <- data[rowSums(data)>0,]

 # 去掉方差為0 的行偶芍,這些本身沒有意義,也妨礙后續(xù)運(yùn)算
 data <- data[apply(data, 1, var)!=0,]

3. 數(shù)據(jù)預(yù)處理(可選)

# 計(jì)算中值絕對(duì)偏差 (MAD, median absolute deviation)度量基因表達(dá)變化幅度
# 在基因表達(dá)中德玫,盡管某些基因很小的變化會(huì)導(dǎo)致重要的生物學(xué)意義匪蟀,
# 但是很小的觀察值會(huì)引入很大的背景噪音,因此也意義不大宰僧。
# 可以選擇根據(jù)mad值過濾材彪,取top 50, 500等做分析
mads <- apply(data, 1, mad)data <- data[rev(order(mads)),]
# 此處未選
# data <- data[1:500,]
dim(data)

4. PCA分析

# Pay attention to the format of PCA input 
# Rows are samples and columns are variables
data_t <- t(data)
variableL <- ncol(data_t)

if(sampleFile != "") {
  sample <- read.table(sampleFile,header = T, row.names=1,sep="\t")
  data_t_m <- merge(data_t, sample, by=0)
  rownames(data_t_m) <- data_t_m$Row.names
  data_t <- data_t_m[,-1]
}
# By default, prcomp will centralized the data using mean.
# Normalize data for PCA by dividing each data by column standard deviation.# Often, we would normalize data.
# Only when we care about the real number changes other than the trends,
# `scale` can be set to TRUE. 
# We will show the differences of scaling and un-scaling effects.
pca <- prcomp(data_t[,1:variableL], scale=T)

# sdev: standard deviation of the principle components.
# Square to get variance
# percentVar <- pca$sdev^2 / sum( pca$sdev^2)

# To check what's in pca
print(str(pca))

5. PCA結(jié)果展示

# PCA結(jié)果提取和可視化神器
# http://www.sthda.com/english/articles/31-principal-component-methods-in-r-practical-guide/112-pca-principal-component-analysis-essentials/
library(factoextra)

1. 碎石圖展示每個(gè)主成分的貢獻(xiàn)

# 如果需要保持琴儿,去掉下面第1,3行的注釋
#pdf("1.pdf")
fviz_eig(pca, addlabels = TRUE)
#dev.off()
image.png

2. PCA樣品聚類信息展示

# repel=T段化,自動(dòng)調(diào)整文本位置
fviz_pca_ind(pca, repel=T)   
image.png

3. 根據(jù)樣品分組上色

# 根據(jù)分組上色并繪制
fviz_pca_ind(pca, col.ind=data_t$conditions, mean.point=F, addEllipses = T, legend.title="Groups")
image.png

4. 增加不同屬性的橢圓

  • “convex”: plot convex hull of a set o points.

  • “confidence”: plot confidence ellipses around group mean points as the function coord.ellipse() [in FactoMineR].

  • “t”: assumes a multivariate t-distribution.

  • “norm”: assumes a multivariate normal distribution.

  • “euclid”: draws a circle with the radius equal to level, representing the euclidean distance from the center. This ellipse probably won’t appear circular unless coord_fixed() is applied.

# 根據(jù)分組上色并繪制95%置信區(qū)間
fviz_pca_ind(pca, col.ind=data_t$conditions, mean.point=F, addEllipses = T, legend.title="Groups", ellipse.type="confidence", ellipse.level=0.95)
image.png

5. 展示貢獻(xiàn)最大的變量 (基因)

1) 展示與主坐標(biāo)軸的相關(guān)性大于0.99的變量 (具體數(shù)字自己調(diào)整)

# Visualize variable with cos2 >= 0.99
fviz_pca_var(pca, select.var = list(cos2 = 0.99), repel=T, col.var = "cos2", geom.var = c("arrow", "text") )
image.png
2)展示與主坐標(biāo)軸最相關(guān)的10個(gè)變量

# Top 10 active variables with the highest cos2
fviz_pca_var(pca, select.var= list(cos2 = 10), repel=T, col.var = "contrib")
image.png

3)展示自己關(guān)心的變量(基因)與主坐標(biāo)軸的相關(guān)性分布

# Select by names
# 這里選擇的是MAD值最大的幾個(gè)基因
name <- list(name = c("FN1", "DCN", "CEMIP","CCDC80","IGFBP5","COL1A1","GREM1"))
fviz_pca_var(pca, select.var = name)
image.png

6. biPLot同時(shí)展示樣本分組和關(guān)鍵基因

# top 5 contributing individuals and variable
 fviz_pca_biplot(pca,
            fill.ind=data_t$conditions,
            palette="joo",
            addEllipses = T, 
            ellipse.type="confidence",
            ellipse.level=0.95,
            mean.point=F,
            col.var="contrib",
            gradient.cols = "RdYlBu",
            select.var = list(contrib = 10),
            ggtheme = theme_minimal())
image.png

二、PCA分析注意事項(xiàng)

  1. 一般說來凤类,在PCA之前原始數(shù)據(jù)需要中心化(centering穗泵,數(shù)值減去平均值)。中心化的方法很多谜疤,除了平均值中心化(mean-centering)外佃延,還包括其它更穩(wěn)健的方法现诀,比如中位數(shù)中心化等。

  2. 除了中心化以外履肃,定標(biāo) (Scale, 數(shù)值除以標(biāo)準(zhǔn)差) 也是數(shù)據(jù)前處理中需要考慮的一點(diǎn)仔沿。如果數(shù)據(jù)沒有定標(biāo),則原始數(shù)據(jù)中方差大的變量對(duì)主成分的貢獻(xiàn)會(huì)很大尺棋。數(shù)據(jù)的方差與其量級(jí)成指數(shù)關(guān)系封锉,比如一組數(shù)據(jù)(1,2,3,4)的方差是1.67,而(10,20,30,40)的方差就是167,數(shù)據(jù)變大10倍膘螟,方差放大了100倍成福。

  3. 但是定標(biāo)(scale)可能會(huì)有一些負(fù)面效果,因?yàn)槎?biāo)后變量之間的權(quán)重就是變得相同荆残。如果我們的變量中有噪音的話奴艾,我們就在無形中把噪音和信息的權(quán)重變得相同,但PCA本身無法區(qū)分信號(hào)和噪音内斯。在這樣的情形下蕴潦,我們就不必做定標(biāo)。

  4. 一般而言俘闯,對(duì)于度量單位不同的指標(biāo)或是取值范圍彼此差異非常大的指標(biāo)不直接由其協(xié)方差矩陣出發(fā)進(jìn)行主成分分析潭苞,而應(yīng)該考慮對(duì)數(shù)據(jù)的標(biāo)準(zhǔn)化。比如度量單位不同真朗,有萬人此疹、萬噸、萬元蜜猾、億元秀菱,而數(shù)據(jù)間的差異性也非常大,小則幾十大則幾萬蹭睡,因此在用協(xié)方差矩陣求解主成分時(shí)存在協(xié)方差矩陣中數(shù)據(jù)的差異性很大衍菱。在后面提取主成分時(shí)發(fā)現(xiàn),只提取了一個(gè)主成分肩豁,而此時(shí)并不能將所有的變量都解釋到脊串,這就沒有真正起到降維的作用。此時(shí)就需要對(duì)數(shù)據(jù)進(jìn)行定標(biāo)(scale)清钥,這樣提取的主成分可以覆蓋更多的變量琼锋,這就實(shí)現(xiàn)主成分分析的最終目的。但是對(duì)原始數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化后更傾向于使得各個(gè)指標(biāo)的作用在主成分分析構(gòu)成中相等祟昭。對(duì)于數(shù)據(jù)取值范圍不大或是度量單位相同的指標(biāo)進(jìn)行標(biāo)準(zhǔn)化處理后缕坎,其主成分分析的結(jié)果與仍由協(xié)方差矩陣出發(fā)求得的結(jié)果有較大區(qū)別。這是因?yàn)閷?duì)數(shù)據(jù)標(biāo)準(zhǔn)化的過程實(shí)際上就是抹殺原有變量離散程度差異的過程篡悟,標(biāo)準(zhǔn)化后方差均為1谜叹,而實(shí)際上方差是對(duì)數(shù)據(jù)信息的重要概括形式匾寝,也就是說,對(duì)原始數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化后抹殺了一部分重要信息荷腊,因此才使得標(biāo)準(zhǔn)化后各變量在主成分構(gòu)成中的作用趨于相等艳悔。因此,對(duì)同度量或是取值范圍在同量級(jí)的數(shù)據(jù)還是直接使用非定標(biāo)數(shù)據(jù)求解主成分為宜女仰。

  5. 中心化和定標(biāo)都會(huì)受數(shù)據(jù)中離群值(outliers)或者數(shù)據(jù)不均勻(比如數(shù)據(jù)被分為若干個(gè)小組)的影響猜年,應(yīng)該用更穩(wěn)健的中心化和定標(biāo)方法。

  6. PCA也存在一些限制疾忍,例如它可以很好的解除線性相關(guān)乔外,但是對(duì)于高階相關(guān)性就沒有辦法了,對(duì)于存在高階相關(guān)性的數(shù)據(jù)一罩,可以考慮Kernel PCA袁稽,通過Kernel函數(shù)將非線性相關(guān)轉(zhuǎn)為線性相關(guān),關(guān)于這點(diǎn)就不展開討論了擒抛。另外,PCA假設(shè)數(shù)據(jù)各主特征是分布在正交方向上补疑,如果在非正交方向上存在幾個(gè)方差較大的方向歧沪,PCA的效果就大打折扣了。

參考資料

R統(tǒng)計(jì)和作圖

更多閱讀

畫圖三字經(jīng)生信視頻生信系列教程

心得體會(huì)癌癥數(shù)據(jù)庫LinuxPython

高通量分析在線畫圖測(cè)序歷史超級(jí)增強(qiáng)子

培訓(xùn)視頻PPTEXCEL文章寫作ggplot2

海哥組學(xué)可視化套路基因組瀏覽器

色彩搭配圖形排版互作網(wǎng)絡(luò)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子丧肴,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異肉微,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)昂勉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門浪册,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人岗照,你說我怎么就攤上這事村象。” “怎么了攒至?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵厚者,是天一觀的道長。 經(jīng)常有香客問我迫吐,道長库菲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任志膀,我火速辦了婚禮熙宇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘溉浙。我一直安慰自己烫止,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布戳稽。 她就那樣靜靜地躺著馆蠕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惊奇。 梳的紋絲不亂的頭發(fā)上互躬,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音颂郎,去河邊找鬼吼渡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛祖秒,可吹牛的內(nèi)容都是我干的诞吱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼竭缝,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼房维!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抬纸,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤咙俩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阿趁,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡膜蛔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了脖阵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片皂股。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖命黔,靈堂內(nèi)的尸體忽然破棺而出呜呐,到底是詐尸還是另有隱情,我是刑警寧澤悍募,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布蘑辑,位于F島的核電站,受9級(jí)特大地震影響坠宴,放射性物質(zhì)發(fā)生泄漏洋魂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一喜鼓、第九天 我趴在偏房一處隱蔽的房頂上張望副砍。 院中可真熱鬧,春花似錦庄岖、人聲如沸址晕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至启搂,卻和暖如春硼控,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胳赌。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工牢撼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人疑苫。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓熏版,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捍掺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子撼短,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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