R语言cox,生存分析生信

R语言:生存分析 Cox回归分析 survival analys

2020-03-26  本文已影响0人  生信频道

Cox模型是干什么的?

Cox模型的目的是同时评估几个因素对生存的影响。换句话说,它使我们能够检查特定因素在特定时间点如何影响特定事件(例如,感染,死亡)的发生率。这个速度通常被称为危险率。预测变量(或因子)在生存分析文献中通常被称为协变量。
Cox模型由h(t)表示的危险函数表示。简而言之,危险函数可以解释为在时间t死亡的风险。可以估计如下:

h(t)=h0(t)×exp(b1 x1+b2x2+...+bpxp)

Cox模型的一个关键假设是,观察组(或患者)的危险曲线应该是成比例的并且不能交叉。
因此,考克斯模型是一个比例 - 危险模型:任何一组中事件的危险性是其他危险的常数倍数。这一假设意味着,如上所述,各组的危险曲线应该是成比例的,不能交叉。
换句话说,如果一个人在某个初始时间点有死亡风险,是另一个人的两倍,那么在所有的晚些时候,死亡风险仍然是两倍。

怎么用R来实现Cox回归模型?

没有包先装包:

if(!require(devtools)) install.packages("devtools")
devtools::install_github("kassambara/survminer", build_vignettes = TRUE)

装完包,载入包

library("survival")
library("survminer")

cox模型用到的function就是:coxph()[in survival package],主要语法结构如下:

coxph(formula, data, method)

载入数据

这两个包里自带了示例数据,载入示例数据演示一下:

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

Cox模型可以分为单变量和多变量,单变量就是单独看每一个变量的关联。

单变量Cox回归 Univariate Cox regression

res.cox <- coxph(Surv(time, status) ~ sex, data = lung)
res.cox

Call:
coxph(formula = Surv(time, status) ~ sex, data = lung)
coef exp(coef) se(coef) z p
sex -0.531 0.588 0.167 -3.18 0.0015
Likelihood ratio test=10.6 on 1 df, p=0.00111
n= 228, number of events= 165
The function summary() for Cox models produces a more complete report:

summary(res.cox)
# summary() 结果:
Call:
coxph(formula = Surv(time, status) ~ sex, data = lung)
  n= 228, number of events= 165 
       coef exp(coef) se(coef)      z Pr(>|z|)   
sex -0.5310    0.5880   0.1672 -3.176  0.00149 **
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
    exp(coef) exp(-coef) lower .95 upper .95
sex     0.588      1.701    0.4237     0.816
Concordance= 0.579  (se = 0.022 )
Rsquare= 0.046   (max possible= 0.999 )
Likelihood ratio test= 10.63  on 1 df,   p=0.001111
Wald test            = 10.09  on 1 df,   p=0.001491
Score (logrank) test = 10.33  on 1 df,   p=0.001312

Cox回归结果可以解释如下:

有多个单因素,想一次性跑完?没问题,看这里:

# 把你想跑的单因素都放到这个vector里
covariates <- c("age", "sex",  "ph.karno", "ph.ecog", "wt.loss")
# 用sapply创建一个循环,把每个因素的公式写好
univ_formulas <- sapply(covariates,
                        function(x) as.formula(paste('Surv(time, status)~', x)))

# 循环运行上一步写好的所有公式
univ_models <- lapply( univ_formulas, function(x){coxph(x, data = lung)})
# Extract data 
univ_results <- lapply(univ_models,
                       function(x){ 
                          x <- summary(x)
                          p.value<-signif(x$wald["pvalue"], digits=2)
                          wald.test<-signif(x$wald["test"], digits=2)
                          beta<-signif(x$coef[1], digits=2);#coeficient beta
                          HR <-signif(x$coef[2], digits=2);#exp(beta)
                          HR.confint.lower <- signif(x$conf.int[,"lower .95"], 2)
                          HR.confint.upper <- signif(x$conf.int[,"upper .95"],2)
                          HR <- paste0(HR, " (", 
                                       HR.confint.lower, "-", HR.confint.upper, ")")
                          res<-c(beta, HR, wald.test, p.value)
                          names(res)<-c("beta", "HR (95% CI for HR)", "wald.test", 
                                        "p.value")
                          return(res)
                          #return(exp(cbind(coef(x),confint(x))))
                         })

# 这个例子还很贴心的把所有结果给你搞成一个dataframe:
res <- t(as.data.frame(univ_results, check.names = FALSE))
as.data.frame(res)

看看最后的结果吧,很工整有木有:

           beta HR (95% CI for HR) wald.test p.value
age       0.019            1 (1-1)       4.1   0.042
sex       -0.53   0.59 (0.42-0.82)        10  0.0015
ph.karno -0.016      0.98 (0.97-1)       7.9   0.005
ph.ecog    0.48        1.6 (1.3-2)        18 2.7e-05
wt.loss  0.0013         1 (0.99-1)      0.05    0.83

多变量Cox回归分析 Multivariate Cox regression analysis

现在,我们想描述这些因素如何共同影响生存。 为了回答这个问题,我们将进行多变量Cox回归分析。 由于变量ph.karno在单变量Cox分析中不显着,我们将在多变量分析中跳过它。 我们将3个因素(性别,年龄和ph.ecog)纳入多变量模型。

res.cox <- coxph(Surv(time, status) ~ age + sex + ph.ecog, data =  lung)
summary(res.cox)

#summary()结果:
Call:
coxph(formula = Surv(time, status) ~ age + sex + ph.ecog, data = lung)
  n= 227, number of events= 164 
   (1 observation deleted due to missingness)
             coef exp(coef)  se(coef)      z Pr(>|z|)    
age      0.011067  1.011128  0.009267  1.194 0.232416    
sex     -0.552612  0.575445  0.167739 -3.294 0.000986 ***
ph.ecog  0.463728  1.589991  0.113577  4.083 4.45e-05 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
        exp(coef) exp(-coef) lower .95 upper .95
age        1.0111     0.9890    0.9929    1.0297
sex        0.5754     1.7378    0.4142    0.7994
ph.ecog    1.5900     0.6289    1.2727    1.9864
Concordance= 0.637  (se = 0.026 )
Rsquare= 0.126   (max possible= 0.999 )
Likelihood ratio test= 30.5  on 3 df,   p=1.083e-06
Wald test            = 29.93  on 3 df,   p=1.428e-06
Score (logrank) test = 30.5  on 3 df,   p=1.083e-06

森林图作图

分析完了,来张图可视化一下吧

ggforest(res.cox,main="hazard ratio",cpositions=c(0.02,0.22,0.4),fontsize=0.8,refLabel="reference",noDigits=2)
forest plot

survival analysis 可视化

# 建立一个表达式
fit <- survfit(Surv(time, status) ~  ph.ecog, data =  lung)
# 画图
ggsurvplot(fit)
生存曲线

想看更多请关注公众号:bioinfo-c

想看更多请关注
上一篇 下一篇

猜你喜欢

热点阅读