TCGA Cox模型-训练集、内部验证集、外部验证集综合构建Cox风险模型①

2021.11.12 初版
2021.11.16 更新单因素COX输出结果,多了半边括号...
本系列主要用于通过使用训练集(train)、内部验证集(test1组)、外部验证集(test2)联合对感兴趣的基因进行Cox回归模型的构建,并用于预测患者的临床预后情况,通过生存曲线、ROC曲线、生存状态图对模型效能进行可视化


胡乱调侃,与正题无关,赶时间的友友直接刷掉哈~
误入BioInfor的大黄鸭 --一个喜欢把教程写着写着写成科普的本科临床医学生
大黄鸭自从误入了生信的大坑之后,也走了很多弯路(毕竟自己也只是个临床医学的苦逼大三生),花了很多钱不说,电脑游戏软件图标逐渐被Rstudio等软件给取代。。。甚至被舍友给逼问为啥不直接报计算机专业???诚然,,自学生信花的时间也太多了吧。。从R说起,卑微的我随后在淘宝上开了个小店(杂货铺?),以别人R语言报错改代码为生,就以这点微薄收入度日,主要不是为了挣钱,还是为了认识更多师兄师姐,而且帮别人改代码真的学到了很多很多,R语言水平也提升了很多很多(离谱的是还有人为了8块钱改个代码跟我讲过价。。。)之后就在想为啥不把这些经验分享给友友们,好让友友们学生信少走点弯路(嘻嘻有一说一,其实还是想让大家关注一下我,以后我修改代码的话也会实时在里面更新教程,有学员亲测看了我改代码过程一个月之后,他R语言啥报错再也没怕过,还说想把我微信给删了)
(本文第一次试水,多有不足,欢迎大家批评指正)


首先我们先来讲包和输入文件的准备

目录

  • 0.脑子的准备
  • 1.包的准备
  • 2.输入文件的准备
  • 3.分组
  • 4.单因素Cox分析
  • 5.LASSO回归
  • 6.多因素Cox回归(构建Cox模型)
  • 7.模型验证
  • 8.输出结果文件
  • 9.可视化

Cox回归模型介绍:参见百度百科

算了还是简单讲讲吧。。又是废话一通,请各位知道Cox回归模型是啥东西的大神自行略过。

在我们日常观看的电视电影里,经常看到此景:“医生,我父亲还能活几年啊?”,“10-15年”

为啥是10-15年呢?是医生随便说的,没有任何依据吗?我乱报个数,说20年行不行?

不是的。

这时Cox回归模型就开始刷它的存在感了

Cox模型是由英国统计学家D.R.Cox(1972)年提出的一种半参数回归模型,它以生存结局和生存时间为因变量,可同时分析众多因素对生存期的影响。在这里因素可以是临床因素,比如说肿瘤各种分期,年龄,患者体征,甚至可以是患者的生活习惯等,也可以是各种基因的表达量,可以纳入你所感兴趣的基因进行模型的构建,它是一个系数×表达量的公式,通过计算得出的风险值来预测患者的预后情况。本例以基因表达作为例子。


本例基本思路:

机器学习一般可将数据分为训练集(train)、内部验证集(test1组)、外部验证集(test2),在本教程中我们在TCGA获取的数据进行随机分组,随机分为训练集内部验证集,在ICGC数据库中我们获取数据对模型进行外部验证。训练集负责训练模型,而内部验证集我们用于对Cox模型的效能进行检验,随机分组则体现出数据的随机性及普遍性,而为了进一步说明模型的可用性,我们使用其他数据库中的数据,使用模型检验效果,数据的来源可以是其他数据库中的基因表达和临床数据,也可以使用我们自己实验中获得的患者基因表达和临床数据。

单因素Cox分析主要是分析其因素单独有没有对生存有影响,跟Kaplan-Meier生存曲线差不多,算法不一样


1.包的准备


install.packages("glmnet")
install.packages("caret")
install.packages("survival")
install.packages("survivalROC")
install.packages("survminer")

直接跑代码就完事了,后续我更新一个方便批量安装包的教程哦~(疯狂暗示-关注一波大黄鸭嘻嘻)

2.输入文件的准备

我们需要的数据文件是TCGA数据库中FPKM的表达数据文件,以及临床数据文件(包含患者生存状态及生存时间的),将其整理到一个文件中

表格样式为:

ID time status Gene1 Gene2 ... GeneN
TCGA样本名 生存时间(天) 生存状态(0/1 活着/死亡) Gene1exp Gene2exp ... GeneNexp

样本名用TCGA-XX-XXXX的格式,可以用Excel的(mid函数提取前12位)免得到时候再代码里删,因为后面的部分为样本的信息,前面的才是患者信息,如果遇到重复行名(rowname),需要在Excel上寻找两个一样的,删掉其中一个,生存时间一定要用年啊!以天为单位的要除以365,这些工作直接用Excel就完事了。可以用VLOOKUP函数,也可以手动整理,工作量一般般吧,或者等我后续更新的教程也行,关注大黄鸭我就完事了哈哈哈~

当然,train集和test1集都是在同一个表达矩阵中进行随机分组的,而test2集需要通过外部数据库(ICGC或GEO等)或者自己实验的数据(由于本例纳入计算的数据为TCGA和ICGC数据库的Fpkm值,其他的标准可能与模型不适用,建议还是以同一标准处理的RNA-Seq量作为外部验证组的验证(比如说用edgeR标准化的TCGA Counts矩阵就不能用Fpkm标准化矩阵进行外部验证))整理出另外一个矩阵

接下来就是读取数据啦,要记得更改工作路径哦~(setwd()走一波)

我们这文件保存为exp_time1.txt(train集和test1集),exp_time2.txt(test2集)(timeexp不好看。。两个e给整重叠了),使用代码读取:


exptime=read.table("expTime1.txt" , header=T , row.names=1 , sep="\t" , check.names=F)
test2=read.table("expTime2.txt" , header=T , row.names=1 , sep="\t" , check.names=F)

header,row.names表示设置表头和行名,sep的这个\t表示识别空格为分隔符。。毕竟俺们保存为txt的时候,每个词之间是变成空格的嘛,check.names这个如果不设置成F,到时候列名前面多个“X.”的话别来找我

3.分组

咱前面说了,这个TCGA得随机分组,也就是分成训练集和内部验证集,这一块有人55分的,也有人64分的,73分的都有,咱这用的是73分,就是训练集7份,内部验证集3份,当然怎么分还是得看您的心情哈哈哈

随机分组,结果不一定好啊,所以这里咱得用循环,结果不好的话就重新再随机分组,一直到出现好的结果就输出。所以,这里得弄个循环,凭咱电脑配置,咱这设置为最多循环800次,也够跑半天了,当然您电脑差点的话,稍微调低一点也行,咱也不敢反对,否则怕您到时候电脑出问题啥的,或者跑了半天也没出结果,来找我麻烦也不太好。如果您电脑是几颗锐龙3990x+128G多少频率的内存,调太高也不好,毕竟分组几万次才出个好结果,这也太侥幸了吧,太过违背随机原则了。


for(i in 1:800){
  ...
}

构建一个这样的循环,本文下面的所有代码都放到里面去就好了。

咱这用了createDataPartition这个函数,当然您用随机数生成的seed也行,只是这个函数专门为机器学习分组的,真的很香啊,他可以从我们样本中随机抽出train和test,死亡和存活的样本都有,而且比例不是很过分,而用随机数的话,假如倒霉,train组大部分抽到死亡的,test组大部分抽到生存的,就不好了。所以建议你们还是用这个函数,真的很方便机器学习这块。。当然随机数生成seed也行(毕竟那么倒霉的几率很小),这块还得友友们亲自去百度,后续如果我觉得价值大可能我也会更新。


grouplist<-createDataPartition(y=exptime[,2] , p=0.7 , list=F)
train<-exptime[grouplist,]
test1<-exptime[-grouplist,]

代码解析:y=exptime[,2]是为了以第二排作为判断分类的标准,生存0,死亡1,以免出现train组大部分抽到死亡的,test组大部分抽到生存的

p=0.7当然就是抽70%了

list=F是不输出为list这个数据类型(有点难用),直接输出为矩阵

下面就是生成train组,test1组矩阵了


本教程就先讲到这啦,后续随后更新,欢迎大家关注支持~大家关注一下我公众号:误入BioInfor的大黄鸭,回复“TCGACox”获取完整版的代码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容