26  生存分析

The fact that some people murder doesn’t mean we should copy them. And murdering data, though not as serious, should also be avoided.

— Frank E. Harrell 1

生存分析可以用于用户流失分析,注册、激活、活跃。 分析次日留存、7日留存、15日留存。有学生来上体验课,多久来付费上课。 有一个人医院看病之后,多久办理住院。 最早,生存分析用于研究飞机出去之后,有多少返回的。还是要回归到原始文献去了解基本概念,及其背后的思考和应用

以一个问题提出本章主题,讲述和展示一个数据集。建立模型,拟合模型,结果解释。

26.1 问题背景

急性粒细胞白血病生存数据

library(survival)
data(cancer, package = "survival")
str(aml)
'data.frame':   23 obs. of  3 variables:
 $ time  : num  9 13 13 18 23 28 31 34 45 48 ...
 $ status: num  1 1 0 1 1 0 1 1 0 1 ...
 $ x     : Factor w/ 2 levels "Maintained","Nonmaintained": 1 1 1 1 1 1 1 1 1 1 ...

26.2 模型拟合

R 软件内置了 survival 包,它是实现生存分析的核心 R 包 (Terry M. Therneau 和 Patricia M. Grambsch 2000)

leukemia.surv <- survfit(Surv(time, status) ~ x, data = aml)
library(ggplot2)
library(ggfortify)
autoplot(leukemia.surv, data = aml) +
  theme_minimal()
图 26.1: 急性粒细胞白血病生存数据
library(ggsurvfit)

拟合模型

fit_mod_surv <- survfit2(Surv(time, status) ~ x, data = aml)

模型输出

fit_mod_surv
Call: survfit(formula = Surv(time, status) ~ x, data = aml)

                 n events median 0.95LCL 0.95UCL
x=Maintained    11      7     31      18      NA
x=Nonmaintained 12     11     23       8      NA
ggsurvfit(fit_mod_surv, linewidth = 1) +
  add_confidence_interval() +
  add_risktable() +
  add_quantile(y_value = 0.6, color = "gray50", linewidth = 0.75) +
  scale_y_continuous(label = scales::percent_format()) +
  labs(y = "生存百分比", title = "从手术到随机化的复发时间") 
图 26.2: 比例风险回归

26.3 Cox-Box 比例风险回归与生存分析的关系

Box-Cox 变换 (Box 和 Cox 1964)、Cox 回归模型

26.4 Tobit regression 与生存分析的关系

Tobit (Tobin’s Probit) regression 起源于计量经济学中的 Tobit 模型,James Tobin 提出的,用于截尾数据,生存分析中的一种加速失效模型 (accelerated failure model) (Tobin 1958)

  • VGAM::vglm(family = tobit(Upper = 800)) 依赖少,稳定,推荐使用
  • VGAM 包的扩展包 VGAMdata 和 VGAMextra
  • AER::tobit() 依赖多

26.5 Logit, Probit and Tobit Regression

  • 逻辑回归,响应变量是无序的分类变量,假定服从二项、多项分布,拟合函数 glm()nnet::multinom()
  • Probit 回归,响应变量是有序的分类变量,拟合函数 MASS::polr()
  • Tobit 回归,响应变量是有删失/截尾的