仅仅是改变了统计学显著性呢?还是说改变了其本性
然后很多粉丝留言说,如果并不是按照表达量中位值或者平均值分组,而是取巧使用了surv_cutpoint这样的函数,得到的结果并不好解释,认为这样的的数据处理方式简直是黑白颠倒!
我看到了这样的留言,确实思考了一下,使用了surv_cutpoint这样的函数是仅仅是改变了统计学显著性指标呢?还是说,确实有可能造成黑白颠倒呢?风险因子会变成保护因子???
布置它为学徒作业吧
前面自己把表达量矩阵和临床信息准备好,得到 exprSet这个表达量矩阵,以及 meta 这个临床信息,然后就可以使用了surv_cutpoint这样的函数对指定基因做生存分析啦,代码如下所示:
library(survival)
library(survminer)
gs=c('BCL2','BCL2L1','MCL1')
splots <- lapply(gs, function(g){
meta$gene = t(exprSet[g,])
sur.cut <- surv_cutpoint(meta, time= 'time',
event = 'event' ,
variables = 'gene' )
sur.cat <- surv_categorize(sur.cut)
sfit1=survfit(Surv(time, event)~gene, data=sur.cat)
ggsurvplot(sfit1,pval =TRUE, data = meta)
})
arrange_ggsurvplots(splots, print = TRUE,
ncol = 2, nrow = 2, risk.table.height = 0.4)
如下所示;
这个 surv_cutpoint 函数确实效果给力,基本上没有它搞不定的统计学显著性。
表达量矩阵和临床信息的准备过程
需要自己去tcga所在的ucsc的xena网站 ,去下载 TCGA.LGG.sampleMap_HiSeqV2.gz 文件以及 TCGA.LGG.sampleMap_LGG_clinicalMatrix 文件,然后下面的代码就可以复制粘贴直接运行啦!
1.准备数据
rm(list = ls())
library(stringr)
exp = read.table('../TCGA.LGG.sampleMap_HiSeqV2.gz',header = T,row.names = 1,check.names = F)
exp = as.matrix(exp)
clinical = data.table::fread('../TCGA.LGG.sampleMap_LGG_clinicalMatrix')
dim(exp)
#> [1] 20530 530
clinical[1:4,1:4]
#> sampleID _INTEGRATION _PATIENT _cohort
#> 1: TCGA-CS-4938-01 TCGA-CS-4938-01 TCGA-CS-4938 TCGA Lower Grade Glioma (LGG)
#> 2: TCGA-CS-4941-01 TCGA-CS-4941-01 TCGA-CS-4941 TCGA Lower Grade Glioma (LGG)
#> 3: TCGA-CS-4942-01 TCGA-CS-4942-01 TCGA-CS-4942 TCGA Lower Grade Glioma (LGG)
#> 4: TCGA-CS-4943-01 TCGA-CS-4943-01 TCGA-CS-4943 TCGA Lower Grade Glioma (LGG)
2.数据过滤
#过滤一下
dim(exp)
#> [1] 20530 530
table(str_sub(colnames(exp),14,15))
#>
#> 01 02
#> 516 14
# 01肿瘤,02复发,11正常
group_list = ifelse(as.numeric(str_sub(colnames(exp),14,15)) < 10,'tumor','normal')
group_list = factor(group_list,levels = c("normal","tumor"))
table(group_list)
#> group_list
#> normal tumor
#> 0 530
#这里是根据较小样本(normal)取值,当然可以有别的取值
exp = exp[apply(exp, 1, function(x) sum(x > 1) > 0), ]
dim(exp)
#> [1] 19713 530
exp[1:4,1:4]
#> TCGA-E1-5319-01 TCGA-HT-7693-01 TCGA-CS-6665-01 TCGA-S9-A7J2-01
#> ARHGEF10L 10.1208 11.8084 10.1872 10.9576
#> HIF3A 10.4506 10.5173 3.6466 4.8099
#> RNF17 0.0000 0.0000 0.0000 0.4657
#> RNF10 11.2171 11.8974 11.5369 11.2675
#save(exp,group_list,clinical,file = '../data/01TCGA-LGG.Rdata')
3.生存分析前准备
这里可以选取自己需要的列,
### 1.简化临床信息,选出要用的列
tmp = data.frame(colnames(clinical))
#colnames(clinical)
#write.csv(clinical,file = 'clinical.csv')
clinical = clinical[,c(
'bcr_patient_barcode',
'vital_status',
"days_to_last_followup" ,
'days_to_death',
'days_to_birth'
)]
dim(clinical)
#> [1] 530 5
#rownames(clinical) <- NULL
clinical = clinical[!duplicated(clinical$bcr_patient_barcode),]
rownames(clinical) <- clinical$bcr_patient_barcode
clinical[1:4,1:4]
#> bcr_patient_barcode vital_status days_to_last_followup days_to_death
#> 1: TCGA-CS-4938 LIVING 3574 NA
#> 2: TCGA-CS-4941 DECEASED NA 234
#> 3: TCGA-CS-4942 DECEASED NA 1335
#> 4: TCGA-CS-4943 DECEASED 481 1106
meta = clinical
exprSet=exp[,group_list=='tumor']
table(group_list)
#> group_list
#> normal tumor
#> 0 530
exprSet = log2(edgeR::cpm(exprSet)+1)
#简化meta的列名
colnames(meta)=c('ID','event','last_followup','death','age')
#空着的值改为NA
meta[meta==""]=NA
### 2.实现表达矩阵与临床信息的匹配
# 以病人为中心,表达矩阵按病人ID去重复
k = !duplicated(str_sub(colnames(exprSet),1,12));table(k)
#> k
#> FALSE TRUE
#> 14 516
exprSet = exprSet[,k]
exprSet = as.data.frame(exprSet)
#调整meta的ID顺序与exprSet列名一致
exprSet = exprSet[,str_sub(colnames(exprSet),1,12) %in% meta$ID]
meta=meta[match(str_sub(colnames(exprSet),1,12),meta$ID),]
identical(meta$ID,str_sub(colnames(exprSet),1,12))
#> [1] TRUE
4.整理生存分析输入数据
#1.1计算生存时间(月)
meta$time = ifelse(meta$event=="LIVING",
meta$last_followup,
meta$death)
meta$time = as.numeric(meta$time)/30
#1.2 根据生死定义event,活着是0,死的是1
meta$event=ifelse(meta$event=='LIVING',
0,
1)
table(meta$event)
#>
#> 0 1
#> 389 126
#1.3 年龄和年龄分组
meta$age=ceiling(abs(as.numeric(meta$age))/365)
meta$age_group=ifelse(meta$age>median(meta$age,na.rm = T),'older','younger')
table(meta$age_group)
#>
#> older younger
#> 246 268
#save(meta,exprSet,file = "../data/TCGA-LGG_sur_model.Rdata")
得到 exprSet这个表达量矩阵,以及 meta 这个临床信息,后续的全部生存分析相关,都是依赖于它哦!
作业
对全部的基因,首先使用表达量中位值进行分组后,批量进行 cox 分析,拿到HR值和P值,输出成为表格。
然后对基因根据surv_cutpoint函数进行分组后,再批量cox分析,拿到HR值和P值,输出成为表格。
比较两个表格,看看是否有基因的HR值的方向冲突了,还是说,仅仅是统计学指标的改变。