单因素、多因素COX回归分析在R中的实现与常见问题解答

在生信分析的过程中,单因素、多因素COX回归分析常用来筛选与患者预后有关的因素,相信很多小伙伴对此并不陌生。那么,如何在R中进行单因素、多因素COX回归分析?COX回归分析与KM生存分析的区别在哪?做了单因素COX回归分析之后为什么还要做多因素COX回归分析呢?用于筛选变量的p值要设置为多少呢?这篇文章都会给你答案,快和小碗看下去吧!

话不多说,我们直接上代码:

首先,我们要养成良好的习惯,先设置一下环境,不仅能让代码看起来更加清晰,而且能为后续运行省去很多不必要的麻烦:

#清除工作空间中的所有对象

rm(list=ls())  

#清理内存

gc()  

#设置工作路径

setwd("..")

#加载包

library(survival)

#加载示例数据

load("rdata/示例数据.rdata")  

我们用str()函数看一下示例数据df的格式:


可以看到,示例数据df是一个数据框,有50个观测(行),102个变量(列)。

使用view()函数查看df:


可以看到,df的50个观察就是50个样本,从sample1到sample50;102个变量中的前两个分别是每个样本的生存状态和生存时间,从第三个到最后一个就是我们想要进行单因素、多因素COX回归分析的100个基因了。

接下来,开始正式进行分析:

###单因素COX回归分析----

#设置p值的阈值

pfilter <- 0.05   

#新建空白数据框

uniresult <- data.frame()  

#使用for循环对输入数据中的100个基因依次进行单因素COX分析

#单因素COX回归分析中p值<0.05的基因,其分析结果输入到之前新建的空白数据框uniresult中

for(i in colnames(df[,3:ncol(df)])){   

  unicox <- coxph(Surv(time = os_time, event = os_status) ~ df[,i], data = df)  

  unisum<- summary(unicox)   

  pvalue <- round(unisum$coefficients[,5],3)

  if(pvalue<pfilter){

    uniresult <- rbind(uniresult,

                       cbind(gene=i,

                             HR=unisum$coefficients[,2],

                             L95CI=unisum$conf.int[,3],

                             H95CI=unisum$conf.int[,4],

                             pvalue=unisum$coefficients[,5]

                       ))

  }

}   

#保存单因素COX回归分析结果

write.csv(uniresult,file = "result/单因素COX分析结果.csv",row.names = F)

在上述代码中,我们使用到了for循环对示例数据中的100个基因依次进行单因素COX分析,并将其中p<0.05的基因的基因名、HR值、HR的95%置信区间的低值与高值、p值提取出来保存到uniresult这个对象当中,我们来看一下uniresult:


也是一个数据框,有12行,说明通过单因素COX回归分析,我们从100个基因中筛选出了12个与病人生存有关的基因。

也可以使用view()函数查看一下uniresult,更加直观:


接着,我们就对这12个基因再进行多因素COX回归分析。我们要提取这12个基因在各个样本中的表达情况,并与各样本的生存状态和生存时间组成数据框,作为多因素COX回归分析的输入数据unigene。

#提取各样本的生存状态、生存时间、

#以及单因素COX回归分析中p值<0.05的基因在各样本中的表达情况,

#作为多因素COX回归分析的输入数据

unigene <- subset(df,select = c("os_status","os_time",uniresult$gene))

我们来看一下unigene:


可以看到unigene也是个数据框,有50个样本,14列(1、2列分别是生存状态、生存时间,3-14列是单因素COX筛选出的12个基因)。

使用view()函数查看一下:


和单因素COX回归分析的输入数据——示例数据df结构一致。

然后,就可以开始进行多因素COX回归分析了;

###多因素COX回归分析----

multicox <- coxph(Surv(time = os_time,event = os_status) ~ ., data = unigene)

multisum <- summary(multicox)

#提取所有基因的多因素COX回归分析结果至multiresult对象中

gene <- colnames(unigene)[3:ncol(unigene)]

HR <- multisum$coefficients[,2]

L95CI <- multisum$conf.int[,3]

H95CI <- multisum$conf.int[,4]

pvalue <- multisum$coefficients[,5]

multiresult <- data.frame(gene=gene,

                          HR=HR,

                          L95CI=L95CI,

                          H95CI=H95CI,

                          pvalue=pvalue)

multiresult <- multiresult[multiresult$pvalue<pfilter,]

#保存多因素COX回归分析结果

write.csv(multiresult,file = "result/多因素COX分析结果.csv",row.names = F)

多因素COX回归分析是同时分析多个元素(这里是12个基因)与样本的生存的关系,所以代码相对于单因素COX回归分析会更加简单,不用for循环,一行代码就搞定了,结果保存在multiresult这个对象当中,我们来看一下:


可以看到,multiresult是一个12行、5列的数据框。注意,multiresult中是全部进行分析的12个基因的基因名、HR值、HR的95%置信区间的低值与高值、p值,而不仅仅是p<0.05的基因。

用view()再看一下:


可以发现,很不凑巧,这12个基因经过多因素COX回归分析后p值均大于0.05。

以上呢,就是进行单因素、多因素COX回归分析的全部代码了。对于单因素、多因素COX回归分析的结果,我们可以绘制森林图来进行可视化,由于篇幅限制,森林图的代码我们后续再分享,请各位观众老爷点个关注,才不会迷路哦~

讲完代码,我们顺带来解释一下几个常见的问题:

①有没有小伙伴和小碗有过同样的疑问——KM生存分析、COX回归分析都是分析与病人预后有关的因素的方法,那它们两者之间有什么区别呢?

我们来回忆一下KM生存分析的一般流程是根据某种因素比如性别、肿瘤组织学分级、某个基因表达量的高低将样本分成几组,然后比较各个组别之间的生存的差别,计算p值。那就要求我们要分析的变量无论本身是分类变量也好,还是转化成分类变量也好,总之得是分类变量,这样才能对样本进行分组嘛,而且无论你是根据性别分为两组也好,还是根据组织学分级分为3-4组也好,KM生存分析一次只能分析一个变量对生存的影响,也就是说,KM生存分析本质也是一个单变量生存分析。

这样,把KM简单拉一遍之后,COX回归分析的优势就很明显了:首先它能同时分析多个因素与生存的关系,也就是多因素COX回归分析;其次,它能分析连续型变量对生存的影响,我们示例数据中分析的就是基因在样本中的表达情况(连续型变量)对样本生存的影响。

②KM生存分析是单变量分析,单因素COX分析也是单变量分析,那它们的分析结果一样吗?

小碗使用如下代码将示例数据中的100个基因一次进行了KM生存分析,也以p<0.05作为阈值筛选出了与病人生存有关的基因:


这部分代码不做讲解,感兴趣的同学可以自行学习。

我们来看一下KM生存分析、单因素COX回归分析筛选出的基因分别是km_gene、cox_gene:


可以看到KM生存分析共筛选出8个,而单因素COX回归分析筛选出12个,且它们并不完全相同。这是因为,虽然都是分析某个因素,但他们内部的算法是不同的,所以结果有出入也很正常。我们根据文献选择更适合自己研究的分析即可。

写到这里,留个问题给大家:基因表达量不是连续变量吗?怎么才能用KM生存分析呢?答案前面讲过哦。

③为什么大多数生信文章中都是先进行单因素COX回归分析再进行多因素COX回归分析?

我们进行单因素COX回归分析的时候一次只纳入一个变量,就不能排除有这么一种情况存在:变量a影响生存其实是通过影响变量b而导致的,也就是说变量a其实对生存没有直接的影响。那么,就需要将单因素COX 分析筛选出来的显著变量继续纳入多因素COX比例风险模型,从而排除掉类似变量a的这种混杂因素。单因素COX回归分析像是对变量的一个初步筛选,多因素COX回归分析筛选出来的才是独立预后因素。

好了,今天的分享到这里就结束啦,如果对你有帮助的话就给小碗一个免费的赞吧,我们下期再见!

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

推荐阅读更多精彩内容