使用coxph 回歸和logrank test對TCGA數(shù)據(jù)做批量生存分析

### Create: Jianming Zeng
### Date: 2019-04-02 21:59:01
### Email: jmzeng1314@163.com

### https://github.com/jmzeng1314/GEO/blob/master/GSE11121/step5-surivival.R

rm(list=ls())
options(stringsAsFactors = F)

Rdata_dir='../Rdata/'
Figure_dir='../figures/'
# 加載上一步從RTCGA.miRNASeq包里面提取miRNA表達矩陣和對應的樣本臨床信息产阱。
load( file = 
        file.path(Rdata_dir,'TCGA-KIRC-miRNA-example.Rdata')
)
dim(expr)
dim(meta)
# 可以看到是 537個病人朋譬,但是有593個樣本,每個樣本有 552個miRNA信息。
# 當然绷雏,這個數(shù)據(jù)集可以下載原始測序數(shù)據(jù)進行重新比對窗轩,可以拿到更多的miRNA信息

# 這里需要解析TCGA數(shù)據(jù)庫的ID規(guī)律桩撮,來判斷樣本歸類問題雷绢。
group_list=ifelse(as.numeric(substr(colnames(expr),14,15)) < 10,'tumor','normal')

table(group_list)
exprSet=na.omit(expr)

library(survival)
library(survminer)

# 這里做生存分析,已經(jīng)不需要正常樣本的表達矩陣了课梳,所以需要過濾距辆。
# 而且臨床信息余佃,有需要進行整理。
### survival analysis only for patients with tumor.
if(F){
  exprSet=na.omit(expr)
  exprSet=exprSet[,group_list=='tumor']
  
  head(meta)
  colnames(meta)
  meta[,3][is.na(meta[,3])]=0
  meta[,4][is.na(meta[,4])]=0
  meta$days=as.numeric(meta[,3])+as.numeric(meta[,4])
  meta=meta[,c(1:2,5:9)]
  colnames(meta)
  colnames(meta)=c('ID','event','race','age','gender','stage',"days")
  # R里面實現(xiàn)生存分析非常簡單跨算!
  
  # 用my.surv <- surv(OS_MONTHS,OS_STATUS=='DECEASED')構建生存曲線咙冗。
  # 用kmfit2 <- survfit(my.surv~TUMOR_STAGE_2009)來做某一個因子的KM生存曲線。
  # 用 survdiff(my.surv~type, data=dat)來看看這個因子的不同水平是否有顯著差異漂彤,其中默認用是的logrank test 方法。
  # 用coxph(Surv(time, status) ~ ph.ecog + tt(age), data=lung) 來檢測自己感興趣的因子是否受其它因子(age,gender等等)的影響灾搏。
  
  library(survival)
  library(survminer)
  meta$event=ifelse(meta$event=='alive',0,1)
  meta$age=as.numeric(meta$age)
  library(stringr) 
  meta$stage=str_split(meta$stage,' ',simplify = T)[,2]
  table(  meta$stage)
  boxplot(meta$age)
  meta$age_group=ifelse(meta$age>median(meta$age),'older','younger')
  table(meta$race)
  meta$time=meta$days/30
  phe=meta
  
  head(phe)
  phe$ID=toupper(phe$ID) 
  phe=phe[match(substr(colnames(exprSet),1,12),phe$ID),]
  head(phe)
  exprSet[1:4,1:4]
  
  save(exprSet,phe,
       file = 
         file.path(Rdata_dir,'TCGA-KIRC-miRNA-survival_input.Rdata')
  )
}
# 上面被關閉的代碼挫望,就是在整理臨床信息和生存分析的表達矩陣。
# 整理好的數(shù)據(jù)狂窑,直接加載即可
load(  file = 
         file.path(Rdata_dir,'TCGA-KIRC-miRNA-survival_input.Rdata')
)
head(phe)
exprSet[1:4,1:4]


library(survival)
library(survminer)

批量生存分析 使用 coxph 回歸方法

# http://www.sthda.com/english/wiki/cox-proportional-hazards-model
colnames(phe)
mySurv=with(phe,Surv(time, event))
# 對五百多個miRNA基因進行批量運行cox媳板,需要一點點時間。
# 如果是mRNA-seq的表達矩陣泉哈, 通常耗時更長蛉幸。
# 注意,如果是某些基因表達量為恒定丛晦,比如在所有樣本為0奕纫,這個代碼會爆倉
# 需要去除這樣的基因,沒有分析的必要性烫沙。

cox_results <-apply(exprSet , 1 , function(gene){
  # gene= exprSet[1,]
  group=ifelse(gene>median(gene),'high','low') 
  survival_dat <- data.frame(group=group,stage=phe$stage,age=phe$age,
                             gender=phe$gender,
                             stringsAsFactors = F)
  m=coxph(mySurv ~ gender + age + stage+ group, data =  survival_dat)
  
  beta <- coef(m)
  se <- sqrt(diag(vcov(m)))
  HR <- exp(beta)
  HRse <- HR * se
  
  #summary(m)
  tmp <- round(cbind(coef = beta, se = se, z = beta/se, p = 1 - pchisq((beta/se)^2, 1),
                     HR = HR, HRse = HRse,
                     HRz = (HR - 1) / HRse, HRp = 1 - pchisq(((HR - 1)/HRse)^2, 1),
                     HRCILL = exp(beta - qnorm(.975, 0, 1) * se),
                     HRCIUL = exp(beta + qnorm(.975, 0, 1) * se)), 3)
  return(tmp['grouplow',])
  
})
cox_results=t(cox_results)
table(cox_results[,4]<0.05)
cox_results[cox_results[,4]<0.05,]
cox_results

批量生存分析 使用 logrank test 方法

mySurv=with(phe,Surv(time, event))
log_rank_p <- apply(exprSet , 1 , function(gene){
  # gene=exprSet[1,]
  phe$group=ifelse(gene>median(gene),'high','low')  
  data.survdiff=survdiff(mySurv~group,data=phe)
  p.val = 1 - pchisq(data.survdiff$chisq, length(data.survdiff$n) - 1)
  return(p.val)
})
log_rank_p
require("VennDiagram")
VENN.LIST=list(cox=rownames(cox_results[cox_results[,4]<0.05,]),
             log=names(log_rank_p[log_rank_p<0.05]))
venn.plot <- venn.diagram(VENN.LIST , NULL, 
                          fill=c("darkmagenta", "darkblue"), 
                          alpha=c(0.5,0.5), cex = 2, 
                          cat.fontface=4,  
                          main="overlap of coxph and log-rank test")
# 可以看到兩種生存分析挑出來的基因重合度尚可匹层。
grid.draw(venn.plot) 

save(log_rank_p,cox_results ,
     file = 
       file.path(Rdata_dir,'TCGA-KIRC-miRNA-survival_results.Rdata')
)
venn.plot
library(pheatmap)
choose_gene=rownames(cox_results[cox_results[,4]<0.05,])
choose_matrix=expr[choose_gene,]
choose_matrix[1:4,1:4] 
n=t(scale(t(log2(choose_matrix+1))))  #scale()函數(shù)去中心化和標準化
#對每個探針的表達量進行去中心化和標準化
n[n>2]=2 #矩陣n中歸一化后,大于2的項锌蓄,賦值使之等于2(相當于設置了一個上限)
n[n< -2]= -2 #小于-2的項升筏,賦值使之等于-2(相當于設置了一個下限)
n[1:4,1:4]

## http://www.bio-info-trainee.com/1980.html
annotation_col = data.frame( group_list=group_list  )
rownames(annotation_col)=colnames(expr)

pheatmap(n,show_colnames = F,annotation_col = annotation_col,
         filename = 'cox_genes.heatmap.png')

library(ggfortify)
df=as.data.frame(t(choose_matrix))
df$group=group_list
png('cox_genes.pca.png',res=120)
autoplot(prcomp( df[,1:(ncol(df)-1)] ), data=df,colour = 'group')+theme_bw()
dev.off()
cox_genes.heatmap

cox_genes.pca
## 也可以嘗試其它主成分分析的R包
library("FactoMineR")
library("factoextra")  

參考來源:生信技能樹

友情鏈接:

課程分享
生信技能樹全球公益巡講
https://mp.weixin.qq.com/s/E9ykuIbc-2Ja9HOY0bn_6g
B站公益74小時生信工程師教學視頻合輯
https://mp.weixin.qq.com/s/IyFK7l_WBAiUgqQi8O7Hxw
招學徒:
https://mp.weixin.qq.com/s/KgbilzXnFjbKKunuw7NVfw

歡迎關注公眾號:青島生信菜鳥團

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瘸爽,隨后出現(xiàn)的幾起案子您访,更是在濱河造成了極大的恐慌,老刑警劉巖剪决,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灵汪,死亡現(xiàn)場離奇詭異,居然都是意外死亡昼捍,警方通過查閱死者的電腦和手機识虚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妒茬,“玉大人担锤,你說我怎么就攤上這事≌ё辏” “怎么了肛循?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵铭腕,是天一觀的道長。 經(jīng)常有香客問我多糠,道長累舷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任夹孔,我火速辦了婚禮被盈,結果婚禮上,老公的妹妹穿的比我還像新娘搭伤。我一直安慰自己只怎,他們只是感情好,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布怜俐。 她就那樣靜靜地躺著身堡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拍鲤。 梳的紋絲不亂的頭發(fā)上贴谎,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音季稳,去河邊找鬼擅这。 笑死,一個胖子當著我的面吹牛绞幌,可吹牛的內(nèi)容都是我干的蕾哟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼莲蜘,長吁一口氣:“原來是場噩夢啊……” “哼谭确!你這毒婦竟也來了?” 一聲冷哼從身側響起票渠,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤逐哈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后问顷,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昂秃,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年杜窄,在試婚紗的時候發(fā)現(xiàn)自己被綠了肠骆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡塞耕,死狀恐怖蚀腿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤莉钙,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布廓脆,位于F島的核電站,受9級特大地震影響磁玉,放射性物質(zhì)發(fā)生泄漏停忿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一蚊伞、第九天 我趴在偏房一處隱蔽的房頂上張望席赂。 院中可真熱鬧,春花似錦时迫、人聲如沸氧枣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扎谎,卻和暖如春碳想,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背毁靶。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工胧奔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人预吆。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓龙填,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拐叉。 傳聞我的和親對象是個殘疾皇子岩遗,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

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