比如你筛选了某个基因,或者某个因素,突然审稿人跟你说要你做单因素和多因素的Cox分析,让你评估是否是某个危险因素的独立影响因素,这个可以在survival包里实现。

关于单因素Cox回归分析,很好理解,只要挖掘处p<0.05的因素就行,但是对于多因素Cox分析,有的文献说是要挑选p<0.05的因素,有的文献说要挑选p<0.2的因素,这个其实都是可以设置的。。。

我们以survival包自带的lung数据进行演示

data<-survival::lung #加载示例数据

我们查看一下这个数据的前几个示例

inst time status age sex ph.ecog ph.karno pat.karno meal.cal wt.loss
3 306 2 74 1 1 90 100 1175 NA
3 455 2 68 1 0 90 90 1225 15
3 1010 1 56 1 0 90 90 NA 15
5 210 2 57 1 1 90 60 1150 11
1 883 2 60 1 0 100 90 NA 0
12 1022 1 74 1 1 50 80 513 0

在运行之前,我们需要加载这几个包

library(dplyr)
library(survival)
library(plyr)

单因素Cox回归

我们可以先单独看某一个因素的结果,比如说sex是否对生存有影响,可以这样

surv<-Surv(time = data$time,event = data$status)
data$surv<-with(data,surv) #添加一列
sexCox<-coxph(surv~sex,data = data) #计算sex的Cox
sexSum<-summary(sexCox) #总结一下
sexSum$coefficients #检索出HR和P值
##           coef exp(coef)  se(coef)         z    Pr(>|z|)
## sex -0.5310235 0.5880028 0.1671786 -3.176385 0.001491229
sexSum$conf.int #检索出HR饿95%CI
##     exp(coef) exp(-coef) lower .95 upper .95
## sex 0.5880028   1.700672 0.4237178 0.8159848
round(sexSum$conf.int[,3:4],2) #设置小数点两位数
## lower .95 upper .95 
##      0.42      0.82
CI<-paste0(round(sexSum$conf.int[,3:4],2),collapse = "-") #将95%CI合并
Pvalue<-round(sexSum$coefficients[,5],3) #提取小数点三位数的p值
HR<-round(sexSum$coefficients[,2],2)#提取小数点两位数的HR值

### 查看一下结果
Unicox<-data.frame("Characteristics"="sex","Hazard Ratio"=HR,
                   "CI95"=CI,
                   "P value"=Pvalue)

我们看一下sex的单因素结果,见表 1

Table 1: sex的单因素Cox结果
Characteristics Hazard.Ratio CI95 P.value
sex 0.59 0.42-0.82 0.001

然而,对于多个因素,我们就可以设置一个函数,可以把所有的因素都算进去

#添加多个参数,定义函数
UniCox<-function(x){
    FML<-as.formula(paste0("surv~",x))
    Cox<-coxph(FML,data = data) 
    Sum<-summary(Cox)
    CI<-paste0(round(Sum$conf.int[,3:4],2),collapse = "-") 
    Pvalue<-round(Sum$coefficients[,5],3)
    HR<-round(Sum$coefficients[,2],2)
    Unicox<-data.frame("Characteristics"=x,
                       "Hazard Ratio"=HR,
                       "CI95"=CI,
                       "P value"=Pvalue)
    return(Unicox)
}

#如查看sex
UniCox("sex")
##   Characteristics Hazard.Ratio      CI95 P.value
## 1             sex         0.59 0.42-0.82   0.001
varNames<-colnames(data) [c(4:10)] #[]里代表需要的列数
UniVar<-lapply(varNames, UniCox)
UniVar<-ldply(UniVar,data.frame)

我们看一下所有统计的结果,见表 2

Table 2: 单因素Cox结果
Characteristics Hazard.Ratio CI95 P.value
age 1.02 1-1.04 0.042
sex 0.59 0.42-0.82 0.001
ph.ecog 1.61 1.29-2.01 0.000
ph.karno 0.98 0.97-1 0.005
pat.karno 0.98 0.97-0.99 0.000
meal.cal 1.00 1-1 0.593
wt.loss 1.00 0.99-1.01 0.828

我们还可以筛选一下所有p值小于0.05的因素

#筛选p<0.05
UniVar$Characteristics[UniVar$P.value<0.05]
## [1] "age"       "sex"       "ph.ecog"   "ph.karno"  "pat.karno"

多因素Cox分析

提取出p<0.05的元素以后,我们可以对所有p<0.05的因素再次进行多因素的Cox回归分析,如果说普通的多因素Cox,我们用+号选择需要的因素进行计算,比如下面这样:

MultiCox<-coxph(surv~age+sex+ph.ecog+ph.karno,data =data) #查某几个因素就使用+

但是,我们我们需要所有单因素Cox结果里面p<0.05的因素,我们就可以用函数批量计算
我们先定义函数,然后整合到一个表里

#定义p<0.05的函数
fml<-as.formula(paste0("surv~",paste0( UniVar$Characteristics[UniVar$P.value<0.05],collapse = "+")))

multicox<-coxph(fml,data = data) #定义所有p<0.05的参数
multisum<-summary(multicox) #提取结果

multiname<-as.character(UniVar$Characteristics[UniVar$P.value<0.05])
mCIL<-round(multisum$conf.int[,3],2)
mCIU<-round(multisum$conf.int[,4],2)
mCI<-paste0(mCIL, "-",mCIU) 
#或者这样 mCI<-paste0(round(multisum$conf.int[,3:4],2),collapse = "-") 
mPvalue<-round(multisum$coefficients[,5],3)
mHR<-round(multisum$coefficients[,2],2)
# 把所有结果导入到一个mulcox的表格里
mulcox<-data.frame("Characteristics"=multiname,"Hazard Ratio"=mHR,
                   "CI95"=mCI,
                   "P value"=mPvalue)

这样,我们生存一个叫mulcox的多因素Cox回归结果的表格,见表 3

Table 3: 多因素Cox结果
Characteristics Hazard.Ratio CI95 P.value
age age 1.01 0.99-1.03 0.231
sex sex 0.57 0.41-0.8 0.001
ph.ecog ph.ecog 1.76 1.22-2.54 0.002
ph.karno ph.karno 1.02 1-1.04 0.108
pat.karno pat.karno 0.99 0.98-1 0.142

单因素和多因素的整合

我们分别获得了单因素和多因素Cox回归的结果,最后我们需要把两个结果合并到一个表格里面,这里我们就可以用到merge()函数,见表 4

Final<-merge.data.frame(UniVar,mulcox,by="Characteristics",all = T,sort = T)
Table 4: 单因素和多因素Cox整合结果
Characteristics Hazard.Ratio.x CI95.x P.value.x Hazard.Ratio.y CI95.y P.value.y
age 1.02 1-1.04 0.042 1.01 0.99-1.03 0.231
meal.cal 1.00 1-1 0.593 NA NA NA
pat.karno 0.98 0.97-0.99 0.000 0.99 0.98-1 0.142
ph.ecog 1.61 1.29-2.01 0.000 1.76 1.22-2.54 0.002
ph.karno 0.98 0.97-1 0.005 1.02 1-1.04 0.108
sex 0.59 0.42-0.82 0.001 0.57 0.41-0.8 0.001
wt.loss 1.00 0.99-1.01 0.828 NA NA NA

这样一个代表所有单因素和多因素Cox回归生存分析的表格就自动合成了,学会了吗?如果想导出成excel格式就可以输入下面的代码:

write.csv(Final,"coxreg.csv", row.names = FALSE)
write.csv(Final,"coxreg.csv",row.names = F,showNA=F ) #不显示NA值

作者简介

欧阳松石河子大学医学院第一附属医院泌尿外科主治医师、讲师、医学博士。 擅长泌尿及男性生殖系统常见疾病的诊疗,对男性生殖医学疾病具有较深研究熟悉各种泌尿男科手术及腔镜微创诊疗技术, 同时擅长R语言在生物信息方面的研究。

欧阳松 (2021). R做单因素和多因素Cox生存分析. 欧阳松的博客. https://swcyo.rbind.io/course/cox-survival-analysis/

BibTeX citation

@misc{
  title = "R做单因素和多因素Cox生存分析",
  author = "欧阳松",
  year = "2021",
  journal = "欧阳松的博客",
  note = "https://swcyo.rbind.io/course/cox-survival-analysis/"
}
.. ... ...
本站总访问量次; 本站访客数人次; 本文总阅读量次;