主成分分析-PCA圖的優(yōu)化(R語言)

R語言的主成分分析(PCA)詳解和帶聚類的PCA圖繪制

最近有個老師在整理文章數(shù)據(jù)曲楚,由于分組較多棕所,想展示PCA圖瀑踢,說明不同分組的差異擂啥,公司默認給出的PCA圖比較樸素哄陶,想做的好看一些,怎么來做呢啤它。自然難不倒小編奕筐,以下幾種展示方法,讓文章圖表更炫酷(前提是樣品多变骡,分組多离赫,如果2組3重復(fù),是不夠的)塌碌。
在RNA-seq中渊胸,主成分分析(PCA)是最常見的多元數(shù)據(jù)分析類型之一√ㄗ保基因表達定量后獲得了各樣本中所有基因的表達值信息翎猛,隨后我們通常會期望比較樣本之間在基因表達值的整體相似性或者差異程度〗邮#基因數(shù)量成千上萬切厘,肯定不能對每個基因的表達都作個比較,這時候就要用到“降維”算法懊缺,PCA分析因此派上用場疫稿。PCA設(shè)法將N維(N=基因數(shù)量)的表達矩陣降維成只有少數(shù)幾個主成分的形式,這幾個主成分就可以代表所有基因的整體表達格局,進而據(jù)此描述樣本差異遗座。

例如這是文獻中的一些PCA分析圖舀凛。

PCA圖中,如果兩個樣本間整體基因表達值更為相似途蒋,那么它們的距離就接近猛遍;反之若整體基因表達值差異很大,則它們的距離就會更遠号坡。據(jù)此懊烤,我們就可以從中評估,不同組間樣本的基因表達是否相差更為明顯筋帖,組內(nèi)樣本的基因表達是否均勻或一致性較高奸晴,哪些處理組之間引起了相似的基因表達變化趨勢,等等日麸。

本篇教程就讓我們來學習如何使用R語言進行PCA分析。示例數(shù)據(jù)和R代碼等逮光,可添加微信公眾號”獲取代箭。

1 示例數(shù)據(jù)

“PCA.data.txt”為基因表達值矩陣。其中第一列“ensembl_id”為基因名稱涕刚,這里以ensembl id作為指代嗡综;其余各列為各樣本的名稱,記錄了RNA-seq獲得的各基因在各樣本中的表達值信息杜漠。

“group.txt”則為樣本分組文件极景,記錄了樣本所屬的不同分組。對于示例數(shù)據(jù)而言驾茴,共包含兩組盼樟,即對照組(control)和處理組(treat),每組各5個樣本锈至。

接下來晨缴,就以基因表達值矩陣文件作為輸入,展示如何進行PCA分析的一般過程峡捡。

2 R語言執(zhí)行主成分分析(PCA)

首先击碗,需要根據(jù)基因表達值進行樣本間的PCA分析,確定樣本在PCA圖中的位置们拙。

將上述基因表達值矩陣讀入到R中進行計算稍途。R語言中能夠執(zhí)行PCA分析的方法有很多,不過它們的算法都是統(tǒng)一的砚婆,隨便使用任何一個R包就可以械拍,例如這里選擇使用FactoMineR包中的PCA方法。

#讀取基因表達值矩陣
#推薦使用 log 轉(zhuǎn)化后的基因表達值,降低不同基因表達水平數(shù)量級相差過大的問題
gene <- read.delim('PCA.data.txt', row.names = 1, sep = '\t')
?
#將基因表達值矩陣作個轉(zhuǎn)置殊者,使行為樣本与境,列為基因
gene <- t(gene)
?
#我們使用 FactoMineR 包中的方法,實現(xiàn) PCA 分析和聚類添加
library(FactoMineR)
?
#樣本中基因表達值的 PCA 分析
gene.pca <- PCA(gene, ncp = 2, scale.unit = TRUE, graph = FALSE)
plot(gene.pca)  #PCA 簡圖

這樣猖吴,PCA分析結(jié)果就初步得到了摔刁。從結(jié)果中我們可以看出,處理組和對照組的基因表達值整體差異還是非常明顯的海蔽,因為兩組的樣本能夠在PCA圖中區(qū)分很開共屈。

3 可視化PCA圖

上一步獲得了PCA分析結(jié)果,并觀察到明顯的組間差異党窜。但如果想把結(jié)果往文章中擺放拗引,上圖肯定是不行的,起碼要讓它好看一些幌衣。因此接下來矾削,繼續(xù)展示如何繪制一個好看的PCA圖。

例如這里選擇使用ggplot2包美化PCA圖豁护,它是一款非常出名的R語言作圖包哼凯。不過在使用ggplot2作圖之前,需要事先在上述PCA分析結(jié)果中將關(guān)鍵信息提取出楚里,例如樣本點在PCA圖中的位置信息断部,以及PCA軸的貢獻度等。

#提取樣本在 PCA 前兩軸中的坐標
pca_sample <- data.frame(gene.pca$ind$coord[ ,1:2])
head(pca_sample)
?
#提取 PCA 前兩軸的貢獻度
pca_eig1 <- round(gene.pca$eig[1,2], 2)
pca_eig2 <- round(gene.pca$eig[2,2],2 )

隨后班缎,加載ggplot2作圖包蝴光,根據(jù)提取出的樣本位置坐標以及PCA軸的貢獻度數(shù)值,繪制二維散點圖表示PCA結(jié)果达址。在同時蔑祟,我們也將樣本分組文件讀取到R中用于指定樣本的分組信息,以在圖中使用不同的顏色表示不同組的樣本苏携。

FactoMineR包也能用于繪制這類統(tǒng)計圖做瞪,以上述添加層次聚類的PCA繼續(xù)。

#讀取并合并樣本分組信息
group <- read.delim('group.txt', row.names = 1, sep = '\t', check.names = FALSE)
group <- group[rownames(pca_sample), ]
pca_sample <- cbind(pca_sample, group)
?
pca_sample$samples <- rownames(pca_sample)
head(pca_sample)  #作圖數(shù)據(jù)中包含了樣本坐標和分組信息
?
#ggplot2 繪制二維散點圖
library(ggplot2)
?
p <- ggplot(data = pca_sample, aes(x = Dim.1, y = Dim.2)) +
geom_point(aes(color = group), size = 3) +  #根據(jù)樣本坐標繪制二維散點圖
scale_color_manual(values = c('orange', 'purple')) +  #自定義顏色
theme(panel.grid = element_blank(), panel.background = element_rect(color = 'black', fill = 'transparent'), 
    legend.key = element_rect(fill = 'transparent')) +  #去除背景和網(wǎng)格線
labs(x =  paste('PCA1:', pca_eig1, '%'), y = paste('PCA2:', pca_eig2, '%'), color = '')  #將 PCA 軸貢獻度添加到坐標軸標題中
?
p
#標識樣本名稱右冻,使用 ggplot2 的拓展包 ggrepel 來完成
library(ggrepel)
?
p <- p + 
geom_text_repel(aes(label = samples), size = 3, show.legend = FALSE, 
    box.padding = unit(0.5, 'lines'))

p

樣式是不是比最初的好看很多装蓬?

再一次,能夠很清晰地從圖中觀察到纱扭,處理組和對照組的基因表達值整體差異是非常明顯的牍帚,因為兩組的樣本能夠在PCA圖中區(qū)分很開。

4 可選添加樣本聚類

繼續(xù)乳蛾,可以選擇在PCA圖中展示“樣本聚類”暗赶。方法大致分為兩種鄙币,一種是通過樣本點的坐標擬合置信橢圓,另一種是直接將各組的邊界區(qū)樣本點以多邊形連接蹂随。不過需要注意的是十嘿,這種方法并不是真正的聚類,而是一種用于在作圖時更好地區(qū)分不同組的方法岳锁。

#添加 95% 置信橢圓绩衷,可用于表示對象分類,但只能適用于各組樣本數(shù)大于 5 個的情況
p + stat_ellipse(aes(color = group), level = 0.95, show.legend = FALSE)
?
p + stat_ellipse(aes(fill = group), geom = 'polygon', level = 0.95, alpha = 0.1, show.legend = FALSE) +
scale_fill_manual(values = c('orange', 'purple'))
?
#多邊形連接同類別對象邊界的樣式激率,適用于各組樣本數(shù)大于 3 個的情況
library(plyr)
cluster_border <- ddply(pca_sample, 'group', function(df) df[chull(df[[1]], df[[2]]), ])
?
p + geom_polygon(data = cluster_border, aes(color = group), fill = NA, show.legend = FALSE)
?
p + geom_polygon(data = cluster_border, aes(fill = group), alpha = 0.2, show.legend = FALSE) +
scale_fill_manual(values = c('orange', 'purple'))

這樣咳燕,一個完整的PCA分析過程就完整地展示出來了,包括輸入文件準備乒躺,如何計算PCA招盲,以及PCA圖的可視化等,還是非常簡單的對嗎嘉冒?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末曹货,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子讳推,更是在濱河造成了極大的恐慌控乾,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娜遵,死亡現(xiàn)場離奇詭異,居然都是意外死亡壤短,警方通過查閱死者的電腦和手機设拟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來久脯,“玉大人纳胧,你說我怎么就攤上這事×弊” “怎么了跑慕?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長摧找。 經(jīng)常有香客問我核行,道長,這世上最難降的妖魔是什么蹬耘? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任芝雪,我火速辦了婚禮,結(jié)果婚禮上综苔,老公的妹妹穿的比我還像新娘惩系。我一直安慰自己位岔,他們只是感情好,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布堡牡。 她就那樣靜靜地躺著抒抬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪晤柄。 梳的紋絲不亂的頭發(fā)上擦剑,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音可免,去河邊找鬼抓于。 笑死,一個胖子當著我的面吹牛浇借,可吹牛的內(nèi)容都是我干的捉撮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼妇垢,長吁一口氣:“原來是場噩夢啊……” “哼巾遭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起闯估,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤灼舍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后涨薪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骑素,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年刚夺,在試婚紗的時候發(fā)現(xiàn)自己被綠了献丑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡侠姑,死狀恐怖创橄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情莽红,我是刑警寧澤妥畏,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站安吁,受9級特大地震影響醉蚁,放射性物質(zhì)發(fā)生泄漏畏梆。R本人自食惡果不足惜除破,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望茁影。 院中可真熱鬧薪韩,春花似錦确沸、人聲如沸捌锭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽观谦。三九已至,卻和暖如春桨菜,著一層夾襖步出監(jiān)牢的瞬間豁状,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工倒得, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泻红,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓霞掺,卻偏偏與公主長得像谊路,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子菩彬,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

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