TCGA數(shù)據(jù)的一致性聚類實戰(zhàn)和可視化

通過不同的聚類算法损话,依據(jù)不同的基因或指標給樣本聚類赛不,是數(shù)據(jù)挖掘文章里面經(jīng)常出現(xiàn)的操作咯窟蓝。接下來要寫寫不同聚類方法的介紹和代碼實現(xiàn)啦摩瞎。

1.輸入數(shù)據(jù)

目前從網(wǎng)上找到的代碼大多是幫助文檔的示例數(shù)據(jù)ALL纹笼,是個log過后的表達芯片數(shù)據(jù)纹份,作者取了mad最大的5000個基因,并且把每個基因的表達量減去了中位數(shù)廷痘,使數(shù)據(jù)分布范圍在0上下蔓涧。

芯片數(shù)據(jù),就照這個樣子處理笋额。那RNA-seq數(shù)據(jù)呢元暴,是應該用log2后的FPKM、TPM這些鳞陨,是直接使用還是也需要減一下中位數(shù)呢昨寞。我查了R包的幫助文檔、使用手冊厦滤、github援岩、文章,都沒有提出明確的輸入數(shù)據(jù)要求啊掏导,已發(fā)表的文章里面也大多沒有給出具體的說明享怀。其實也不只是可以用基因表達量,已發(fā)表的文章里也有拿蛋白表達數(shù)據(jù)去聚類趟咆。 那…就自由發(fā)揮咯添瓷,如果以后有了更新梅屉,我會在這里補充出來。

幫助文檔的示例代碼如下

rm(list = ls())
library(ALL)
data(ALL)
df <- exprs(ALL)
dim(df)
## [1] 12625   128
df[1:4,1:4]
##              01005    01010    03002    04006
## 1000_at   7.597323 7.479445 7.567593 7.384684
## 1001_at   5.046194 4.932537 4.799294 4.922627
## 1002_f_at 3.900466 4.208155 3.886169 4.206798
## 1003_s_at 5.903856 6.169024 5.860459 6.116890
mads <- apply(df,1,mad)
df <- df[rev(order(mads))[1:5000],]
par(mfrow = c(1,2))
boxplot(df[,1:20],main = "before")
df <-  sweep(df,1, apply(df,1,median,na.rm=T))
boxplot(df[,1:20],main = "after")

這里我就采用TCGA的KIRC-fpkm數(shù)據(jù)鳞贷,來做做這個聚類坯汤,順便把KM-plot和PCA、t-SNE樣本聚類做一下搀愧。
TCGA-KIRC.htseq_fpkm.tsv.gz和TCGA-KIRC.survival.tsv是從xena下載的KIRC矩陣和生存信息惰聂。

rm(list = ls())
library(tinyarray)
# 表達矩陣
dat = read.table("TCGA-KIRC.htseq_fpkm.tsv.gz",
                 header = T,
                 row.names = 1,
                 check.names = F)
# 樣本篩選,只要tumor
exp = dat[,make_tcga_group(dat)=="tumor"]
# 基因篩選
exp = exp[apply(exp, 1, function(x)sum(x==0) < 0.5 *ncol(exp)),]
mads = apply(exp, 1, mad)
exp = exp[tail(order(mads),5000),]
# 生存信息
meta = read.table("TCGA-KIRC.survival.tsv",header = T,row.names = 1)
k2 = meta$OS.time>=30;table(k2)
## k2
## FALSE  TRUE 
##    20   959
meta = meta[k2,]

patient = intersect(colnames(exp),rownames(meta))
exp = exp[,patient]
meta = meta[patient,]

exp = as.matrix(exp)
identical(rownames(meta),colnames(exp))
## [1] TRUE
df <-  sweep(exp,1, apply(exp,1,median,na.rm=T))

2.完成聚類

ConsensusClusterPlus這個包確實簡單咱筛,一個函數(shù)N張圖搓幌,真棒O(∩_∩)O

library(ConsensusClusterPlus)
maxK <-  6 #最多分成幾組
results <-  ConsensusClusterPlus(df,
                                 maxK = maxK,
                                 reps = 500,
                                 pItem = 0.8,
                                 pFeature = 1,
                                 clusterAlg = "pam",
                                 seed = 102,
                                 title="test",
                                 innerLinkage="complete",
                                 plot="pdf")

icl = calcICL(results,
              title="test",
              plot="pdf")

大佬推薦使用innerLinkage=“complete”,不推薦用默認的“average”迅箩,其他參數(shù)的意思可以看幫助文檔溉愁。(這里提到的大佬就是下面PAC方法的作者)

此時工作目錄下的test文件夾里已經(jīng)有一個consensus.pdf和一個ici.pdf,里面各有多張圖了饲趋。

結果就不全部貼出來了拐揭,結合下面的篩選標準貼一部分。

3.篩選最佳聚類數(shù)

也就是公式里的K值篙贸,即最終把這些樣本聚成幾類投队。

關于這個呀。我翻閱了很多資料爵川,確定K值的指標簡直是五花八門的敷鸦,主要標準有:

  1. 一致性矩陣熱圖白色塊最干凈,盡量不摻雜藍色

  2. 累積分布曲線下降的坡度最平緩

  3. delta area 曲線的肘部點橫坐標

  4. 聚類一致性直方圖又高又平均


這些指標呢寝贡,又有可能并不指向同一個K值扒披,這時你就開始左右為難啦。

然后就有了大佬提供的PAC標準去篩選圃泡,拒絕選擇困難癥碟案。

Kvec = 2:maxK
x1 = 0.1; x2 = 0.9 # threshold defining the intermediate sub-interval
PAC = rep(NA,length(Kvec))
names(PAC) = paste("K=",Kvec,sep="") # from 2 to maxK

for(i in Kvec){
  M = results[[i]]$consensusMatrix
  Fn = ecdf(M[lower.tri(M)])
  PAC[i-1] = Fn(x2) - Fn(x1)
}#end for i

# The optimal K
optK = Kvec[which.min(PAC)]
optK
## [1] 2

PAC代碼出自:https://www.linkedin.com/pulse/how-use-pac-measure-consensus-clustering-yasin-%C5%9Fenbabao%C4%9Flu

針不戳,和上面的指標結果基本統(tǒng)一颇蜡,最佳聚類數(shù)是2价说。但是吶,這個方法也會失靈风秤,有的時候你maxK設置幾鳖目,最后結果就返回幾。這時就要對照一下前面的指標結果啦,它最佳聚類數(shù)返回10缤弦,你不能真聚成10類吧领迈。。。

4.亞型KM-plot

#聚類結果
library(tidyverse)
table(results[[optK]]$consensusClass)
## 
##   1   2 
## 283 235
Cluster = results[[optK]]$consensusClass
identical(names(Cluster),rownames(meta))
## [1] TRUE
meta$Cluster = Cluster
library(survival)
library(survminer)
sfit <- survfit(Surv(OS.time, OS) ~ Cluster,
               data = meta)
ggsurvplot(sfit,pval = T,palette = "jco")

5.PCA和t-SNE可視化

就是做一下樣本聚類狸捅,看看是否聚在一起衷蜓。

draw_pca(exp,Cluster,addEllipses = F)
library(Rtsne)
tsne_out = Rtsne(t(exp),perplexity = 30)
pdat = data.frame(tsne_out$Y,factor(Cluster))
colnames(pdat) = c("Y1","Y2","group")
head(pdat)
##                           Y1         Y2 group
## TCGA-B2-4101-01A   8.9694069   6.436323     1
## TCGA-BP-4342-01A   3.3333001  -2.952281     1
## TCGA-B0-4691-01A   4.5284118 -10.801060     1
## TCGA-BP-4167-01A   0.7638295 -10.804211     1
## TCGA-B8-4620-01A   1.3455857  -2.727872     1
## TCGA-BP-4769-01A -21.0383293   1.704198     1
library(ggplot2)
library(paletteer)
ggplot(pdat,aes(Y1,Y2))+
  geom_point(aes(Y1,Y2,fill = group),shape = 21,color = "black")+
  stat_ellipse(aes(color = group,fill = group),
               geom = "polygon",
               alpha = 0.3,
               linetype = 2)+
  scale_color_paletteer_d("RColorBrewer::Set3")+
  scale_fill_paletteer_d("RColorBrewer::Set3")+
  theme_classic()+
  theme(legend.position = "top")
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市尘喝,隨后出現(xiàn)的幾起案子磁浇,更是在濱河造成了極大的恐慌,老刑警劉巖瞧省,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扯夭,死亡現(xiàn)場離奇詭異,居然都是意外死亡鞍匾,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門骑科,熙熙樓的掌柜王于貴愁眉苦臉地迎上來橡淑,“玉大人,你說我怎么就攤上這事咆爽×禾模” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵斗埂,是天一觀的道長符糊。 經(jīng)常有香客問我,道長呛凶,這世上最難降的妖魔是什么男娄? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮漾稀,結果婚禮上模闲,老公的妹妹穿的比我還像新娘。我一直安慰自己崭捍,他們只是感情好尸折,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著殷蛇,像睡著了一般实夹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上粒梦,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天亮航,我揣著相機與錄音,去河邊找鬼谍倦。 笑死塞赂,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的昼蛀。 我是一名探鬼主播宴猾,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼圆存,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了仇哆?” 一聲冷哼從身側響起沦辙,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎讹剔,沒想到半個月后油讯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡延欠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年陌兑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片由捎。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡兔综,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狞玛,到底是詐尸還是另有隱情软驰,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布心肪,位于F島的核電站锭亏,受9級特大地震影響,放射性物質發(fā)生泄漏硬鞍。R本人自食惡果不足惜慧瘤,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望膳凝。 院中可真熱鬧碑隆,春花似錦、人聲如沸蹬音。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽著淆。三九已至劫狠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間永部,已是汗流浹背独泞。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留苔埋,地道東北人懦砂。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親荞膘。 傳聞我的和親對象是個殘疾皇子罚随,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

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