大数跨境
0
0

R语言统计分析|批量单变量Cox回归分析

R语言统计分析|批量单变量Cox回归分析 R语言数据分析指南
2023-01-05
2

上一节介绍了如何使用单基因Cox的分析结果通过「ggplot2」来绘制森林图,那么本节来介绍如何使用R语言进行Cox回归分析。本次使用R包内置的公共数据,希望对各位有所帮助

有需要学习数据可视化案例的朋友欢迎购买小编2023的VIP文档可以到「淘宝店铺进行下单」「初始价格依然是99元」付费后小编会分享文档链接,小编每次更新后会同步内容。绘图代码不存在时效性因此购买了小编2022年VIP文档的各位观众老爷请认真学习完2022年260多篇文档后再考虑是否需要继续观看小编的新的绘图案例,小编2022年的文档有需要的朋友依然可以购买总共约260篇文档价格149元「期待大家都能真正掌握R语言数据分析及可视化的能力」

淘宝店铺个性化绘图服务

有需要找小编做个性化绘图的朋友欢关注「淘宝店铺(R语言数据分析指南)」 有需求者可咨询下单。

Cox分析是一种常用的生存分析方法,可以用来评估因变量对生存时间的影响。在进行单变量Cox分析时,可以使用R语言的coxph()函数来拟合Cox比例风险模型。在此我们使用「Survival」包内置的Lung数据集来进行实际展示,先来了解一下该数据:

lung数据集是一个经典的时间到事件数据集,用于对单变量时间到事件数据进行Cox比例风险回归。这个数据集包含了肺癌患者的生存信息,包括以下变量:

  • age: 年龄
  • sex: 性别(1 = 男,2 = 女)
  • ph.ecog: 患者的ECOG评分(0-5,其中0表示完全正常,5表示严重不适)
  • ph.karno: 患者的Karnofsky评分(0-100,其中100表示完全健康,0表示死亡)
  • pat.karno: 患者的Karnofsky评分的百分比(0-100)
  • meal.cal: 患者的日膳食卡路里数(卡)
  • wt.loss: 患者体重损失的百分比(%)
  • status: 生存状态(1 = 生存,2 = 死亡)
  • time: 生存时间(天)

加载R包

library(survival)
library(survminer)
library(tidyverse)

单变量Cox回归分析

result.cox <- coxph(Surv(time, status) ~ sex, data =  lung)
summary(result.cox)
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.021 )
Likelihood ratio test= 10.63  on 1 df,   p=0.001
Wald test            = 10.09  on 1 df,   p=0.001
Score (logrank) test = 10.33  on 1 df,   p=0.001

上方是一个简单的单变量Cox回归分析,但是在实际的数据分析过程中我们遇到的往往是需要用到多个变量来进行Cox分析,因此就需要用到循环来批量进行每个变量的Cox分析,在此小编给出两种形式的循环代码供大家参考:

批量单变量Cox回归分析

使用for循环对每一个变量进行Cox分析最终将结果整合为一个数据框

data <- lung
covariates <- c("age""sex""ph.karno""ph.ecog""wt.loss")

results <- data.frame(covariate = character(0),
                      beta = numeric(0),
                      HR.confint.upper=numeric(0),
                      HR.confint.upper=numeric(0),
                      wald.test = numeric(0),
                      p.value = numeric(0))

for (covariate in covariates) {
  formula <- as.formula(paste("Surv(time, status) ~", covariate))
  model <- coxph(formula, data = data)
  summary <- summary(model)
  p.value <- signif(summary$wald["pvalue"], digits = 2)
  wald.test <- signif(summary$wald["test"], digits = 2)
  beta <- signif(summary$coef[1], digits = 2)
  HR.confint.lower <- signif(summary$conf.int[,"lower .95"], 2)
  HR.confint.upper <- signif(summary$conf.int[,"upper .95"], 2)
  results <- rbind(results, data.frame(covariate = covariate,
                                       beta = beta,
                                       HR.confint.lower=HR.confint.lower,
                                       HR.confint.upper=HR.confint.upper,
                                       wald.test= wald.test,
                                       p.value = p.value))
}

results
      covariate    beta HR.confint.lower HR.confint.upper wald.test p.value
test        age  0.0190             1.00             1.00      4.10 4.2e-02
test1       sex -0.5300             0.42             0.82     10.00 1.5e-03
test2  ph.karno -0.0160             0.97             1.00      7.90 5.0e-03
test3   ph.ecog  0.4800             1.30             2.00     18.00 2.7e-05
test4   wt.loss  0.0013             0.99             1.00      0.05 8.3e-01

上面使用了for循环的方式进行了批量处理,下面再介绍另一种方法使用「purrr」包来进行循环处理。

data <- lung

covariates <- c("age""sex""ph.karno""ph.ecog""wt.loss")

univ_models <- map(covariates, function(covariate) {
  formula <- as.formula(paste("Surv(time, status) ~", covariate))
  model <- coxph(formula, data = data)
  summary <- summary(model)
  p.value <- signif(summary$wald["pvalue"], digits = 2)
  wald.test <- signif(summary$wald["test"], digits = 2)
  beta <- signif(summary$coef[1], digits = 2)
  HR.confint.lower <- signif(summary$conf.int[,"lower .95"], 2)
  HR.confint.upper <- signif(summary$conf.int[,"upper .95"], 2)
  HR <- paste0(signif(exp(summary$coef[2]), digits = 2), " (", HR.confint.lower, "-", HR.confint.upper, ")")
  
  return(list(covariate = covariate,
              beta = beta,
              HR = HR,
              wald.test = wald.test,
              p.value = p.value))
})

为了将univ_models中的结果保存在results数据框中,可以有两种方法;其一是使用purrr包中的reduce函数;其二也可以使用「do.call」rbind函数,将univ_models中的结果合并到results数据框中。

results <- reduce(univ_models, rbind)
results <- do.call(rbind, univ_models)

总结

经过上面的两个案例,我们介绍了如何批量进行单变量Cox回归分析,但是此种分析还存在一种情况那就是变量内部存在分组。例如Sex有男女之分,年龄也有不同年龄段之分,那么如何对内部含有分组的变量进行Cox回归分析呢?这个我们在以后的文档中在做详细的介绍,那么本节介绍到此结束,喜欢的观众老爷欢迎分享转发。「有需要跟着小编继续学习数据分析及可视化的欢迎购买我的2023年度VIP文档,99元也许能解决就你的很多问题」「加小编微信请备注信息及来意,其它请勿扰」

小编微信

关注下方公众号下回更新不迷路


往期推荐

[会员专享] 再谈ggplot2绘制森林图

【声明】内容源于网络
0
0
R语言数据分析指南
R语言重症爱好者,喜欢绘制各种精美的图表,喜欢的小伙伴可以关注我,跟我一起学习
内容 1180
粉丝 0
R语言数据分析指南 R语言重症爱好者,喜欢绘制各种精美的图表,喜欢的小伙伴可以关注我,跟我一起学习
总阅读410
粉丝0
内容1.2k