R - 生存分析:初学者指南

你好,有抱负的数据科学家们!今天,我们将使用R语言开启一段激动人心的生存分析之旅。如果你之前从未编写过一行代码,也不用担心 - 我会在每一步中作为你的友好向导。让我们开始吧!

R - Survival Analysis

什么是生存分析?

在开始编码之前,我们先来了解一下生存分析是什么。想象你是一名医生,研究患者在某种治疗后能活多久。或者你可能是一名商业分析师,研究客户在取消订阅之前会持续多久。这时,生存分析就派上用场了!

生存分析帮助我们回答以下问题:

  • 事件发生需要多久?
  • 哪些因素影响事件发生的时间?
  • 不同的群体在生存时间上如何比较?

现在,让我们动手写一些R代码!

安装和加载必要的包

首先,我们需要安装和加载所需的包。在R中,包就像包含特定任务有用函数的工具箱。

# 安装 'survival' 包
install.packages("survival")

# 加载包
library(survival)

如果你在运行这些命令时看到一些消息出现,不用担心。只要没有红色的错误消息,你就没问题!

加载和探索数据

在这个教程中,我们将使用一个名为 'lung' 的内置数据集,它来自生存分析包。这个数据集包含了晚期肺癌患者的信息。

# 加载 lung 数据集
data(lung)

# 查看前几行数据
head(lung)

# 获取数据集的摘要
summary(lung)

当你运行这些命令时,你会看到数据的快照。花点时间熟悉变量。我们将使用:

  • 'time':生存时间(天数)
  • 'status':审查状态(1=审查,2=死亡)
  • 'age':患者年龄
  • 'sex':患者性别(1=男性,2=女性)

创建生存对象

现在,让我们创建一个生存对象。这是一个特殊的R对象,它结合了生存时间和事件状态。

# 创建生存对象
surv_object <- Surv(time = lung$time, event = lung$status == 2)

# 打印前几个条目
head(surv_object)

你会看到一系列带有 '+' 符号的数字。'+' 表示审查观察(在研究结束时仍然存活的患者)。

Kaplain-Meier 生存曲线

生存分析中最常见的可视化之一是Kaplain-Meier曲线。它显示了随时间的生存概率。

# 拟合 Kaplain-Meier 曲线
km_fit <- survfit(surv_object ~ 1, data = lung)

# 绘制曲线
plot(km_fit, main = "Kaplain-Meier 生存曲线",
xlab = "时间(天)", ylab = "生存概率")

太棒了!你刚刚创建了你的第一个生存曲线。y轴显示生存概率,x轴显示天数。曲线每次事件(死亡)发生时都会下降。

比较组别:男性和女性

让我们比较男性和女性的生存曲线。

# 根据性别拟合 Kaplain-Meier 曲线
km_sex <- survfit(surv_object ~ sex, data = lung)

# 绘制曲线
plot(km_sex, col = c("blue", "red"), main = "按性别划分的生存曲线",
xlab = "时间(天)", ylab = "生存概率")
legend("topright", c("男性", "女性"), col = c("blue", "red"), lty = 1)

现在你有两条曲线:蓝色代表男性,红色代表女性。你能看到有什么区别吗?

Cox 比例风险模型

最后,让我们拟合一个Cox比例风险模型。这个模型帮助我们理解不同因素如何影响生存。

# 拟合 Cox 比例风险模型
cox_model <- coxph(surv_object ~ age + sex, data = lung)

# 打印摘要
summary(cox_model)

不要被输出结果吓到!以下是要注意的内容:

  • 'coef' 列显示每个变量的效果。
  • 'exp(coef)' 列更容易解释:值 > 1 表示风险增加,< 1 表示风险减少。
  • 'Pr(>|z|)' 列显示 p 值。小值(< 0.05)表示具有统计学意义。

结论

恭喜你!你刚刚完成了在R中的第一次生存分析。我们涵盖了从创建生存对象到拟合复杂模型的很多内容。记住,熟能生巧。尝试着玩转代码,更改变量,看看会发生什么。

以下是我们使用的主要函数的总结:

函数 用途
Surv() 创建生存对象
survfit() 拟合生存曲线
plot() 可视化生存曲线
coxph() 拟合 Cox 比例风险模型

继续探索,继续学习,最重要的是,玩转R语言和生存分析,享受其中的乐趣!

Credits: Image by storyset