生存分析只需要tumor數(shù)據(jù),不要normal,將其去掉,新表達(dá)矩陣數(shù)據(jù)命名為exprSet;GTEX可得到正常樣本做補(bǔ)充(xena將GTEX和TCGA數(shù)據(jù)對(duì)應(yīng)起來(lái)了)
clinical信息需要進(jìn)一步整理,成為生存分析需要的格式,新臨床信息數(shù)據(jù)命名為meta。
由于不同癌癥的臨床信息表格組織形式不同,這里的代碼需要根據(jù)實(shí)際情況修改。
rm(list=ls())
options(stringsAsFactors = F)
load("TCGA-CHOL_gdc.Rdata")
library(stringr)
1.簡(jiǎn)化臨床信息,選出要用的列
tmp = data.frame(colnames(clinical))#將clinical的列名組成一個(gè)數(shù)據(jù)框,以便于在閱覽視圖中找到它并復(fù)制
clinical = clinical[,c(
'bcr_patient_barcode',
'vital_status',
'days_to_death',
'days_to_last_followup',
'race_list',
'days_to_birth',
'gender' ,
'stage_event'
)]#只選關(guān)心的列
#其實(shí)days_to_last_followup應(yīng)該是找age_at_initial_pathologic_diagnosis,這表格里沒(méi)有,用days_to_birth計(jì)算一下年齡,暫且替代。
dim(clinical)
#> [1] 48 8
#rownames(clinical) <- NULL
rownames(clinical) <- clinical$bcr_patient_barcode#將clinical行名改為病人ID
clinical[1:4,1:4]
#> bcr_patient_barcode vital_status days_to_death
#> TCGA-W5-AA2Q TCGA-W5-AA2Q Alive
#> TCGA-W5-AA2O TCGA-W5-AA2O Dead 640
#> TCGA-W5-AA39 TCGA-W5-AA39 Dead 170
#> TCGA-W6-AA0S TCGA-W6-AA0S Alive
#> days_to_last_followup
#> TCGA-W5-AA2Q 50
#> TCGA-W5-AA2O
#> TCGA-W5-AA39
#> TCGA-W6-AA0S 352
meta = clinical
exprSet=exp[,Group=='tumor']#生存分析不需要正常樣本
exprSet = log2(edgeR::cpm(exprSet)+1)#取cpm,后面用cpm來(lái)做生存分析
#簡(jiǎn)化meta的列名
colnames(meta)=c('ID','event','death','last_followup','race','age','gender','stage')
#空著的值改為NA
meta[meta==""]=NA
2.實(shí)現(xiàn)表達(dá)矩陣與臨床信息的匹配
有的病人會(huì)有兩個(gè)或兩個(gè)以上的腫瘤樣本,就有重復(fù)。兩種可行的辦法:
(1)以病人為中心,對(duì)表達(dá)矩陣的列按照病人ID去重復(fù),每個(gè)病人只保留一個(gè)樣本。(本文檔)
(2)以樣本為中心,把meta里的病人ID替換成樣本ID,這樣同一個(gè)病人的兩個(gè)樣本就會(huì)有兩行完全一致的臨床信息。(在zz.R中)
# 以病人為中心,表達(dá)矩陣按病人ID去重復(fù)
k = !duplicated(str_sub(colnames(exprSet),1,12));table(k)
#> k
#> TRUE
#> 36
exprSet = exprSet[,k]#按邏輯值不重復(fù)的取一下
#調(diào)整meta的ID順序與exprSet列名一致
meta=meta[match(str_sub(colnames(exprSet),1,12),meta$ID),]
identical(meta$ID,str_sub(colnames(exprSet),1,12))
#> [1] TRUE
3.整理生存分析的輸入數(shù)據(jù)
#1.1由隨訪(fǎng)時(shí)間和死亡時(shí)間計(jì)算生存時(shí)間(月)(自己考慮生存月份特別少的數(shù)據(jù)是否要去掉)
meta$time = ifelse(meta$event=="Alive",
meta$last_followup,
meta$death)
meta$time = as.numeric(meta$time)/30
#1.2 根據(jù)生死定義event,活著是0,死的是1
meta$event=ifelse(meta$event=='Alive',
0,
1)#注意Alive的大小寫(xiě)
table(meta$event)
#>
#> 0 1
#> 20 16
#1.3 年齡和年齡分組
meta$age=ceiling(abs(as.numeric(meta$age))/365)#ceiling向上取整
meta$age_group=ifelse(meta$age>median(meta$age,na.rm = T),'older','younger')#看是否大于中位數(shù)判斷是older還是younger
table(meta$age_group)
#>
#> older younger
#> 18 18
#1.4 stage
library(stringr)
head(meta$stage)#版本不同,嚴(yán)謹(jǐn)?shù)奶崛》制跁r(shí)應(yīng)該按照TNM(T3N0M1部分)一個(gè)個(gè)的找
#> [1] "6thStage IVT3N0M1" "7thStage IIIT3N0M0" "7thStage IIT2bNXMX"
#> [4] "7thStage IT1N0M0" "7thStage IIT2N0M0" "7thStage IT1N0M0"
a = str_extract_all(meta$stage,"I|V");head(a)
#> [[1]]
#> [1] "I" "V"
#>
#> [[2]]
#> [1] "I" "I" "I"
#>
#> [[3]]
#> [1] "I" "I"
#>
#> [[4]]
#> [1] "I"
#>
#> [[5]]
#> [1] "I" "I"
#>
#> [[6]]
#> [1] "I"
b = sapply(a,paste,collapse = "");head(b)
#> [1] "IV" "III" "II" "I" "II" "I"
meta$stage = b
table(meta$stage)
#1.5 race
table(meta$race)
#>
#> ASIAN BLACK OR AFRICAN AMERICAN WHITE
#> 3 2 31
save(meta,exprSet,cancer_type,file = paste0(cancer_type,"_sur_model.Rdata"))
*生信技能樹(shù)課程筆記