滴水穿石

种一棵树最好的时间是十年前,其次是现在

0%

生存分析(未完)

生存分析学习以及在R中的实现。

生存分析(survival analysis)

生存分析是对一个或多个非负随机变量进行统计推断,研究生存现象和响应时间数据及其统计规律的一门学科。它是一种既考虑结果又考虑生存时间的统计方法,并可充分利用截尾数据所提供的不完全信息,对生存时间的分布特征进行描述,对影响生存时间的主要因素进行分析。生存分析不同于其它多因素分析的主要区别点:生存分析考虑了每个观测出现某一结局的时间长短。

生存分析可用于许多领域,例如:

  • 用于患者生存时间分析的癌症研究,如,研究某种药物的疗效,手术后的存活时间,某件机器的使用寿命等。
  • 社会学研究中的“事件-历史分析”,如,出狱犯人第一次犯罪,失业人员第一次找到工作,
  • 工程学中用于“故障-时间分析”,如,产品的失效。
    以上内容都可以被转换为“生存资料”;对生存资料的分析称为生存分析。所谓生存资料就是描述寿命或者一个发生时间的数据。更详细的说一个人的生存时间的长短与许多因素有联系的,研究因素与生存时间的联系有无及程度大小,称为生存分析。

在癌症研究中,典型的研究问题如下:

  • 某些临床特征对患者生存的影响是什么?
  • 一个人生存3年的概率是多少?
  • 两组患者的生存率是否存在差异?

目录

  • 几个概念
  • 研究内容
  • Kaplan-Meier图可视化生存曲线
  • 对数秩检验以比较两组或更多组的生存曲线间是否存在差异。
  • 用Cox比例风险回归描述变量对生存的影响
  • R代码实现

几个概念

事件包括起始事件和失效事件。

  • 起始事件:反应生存时间起始特征的事件,如疾病确诊、某种疾病治疗开始等。
  • 失效事件(Failure Event):常被简称为事件,研究者规定的终点结局,医学研究中可以是患者死亡,也可以是疾病的发生、某种治疗的反应、疾病的复发等。与之对应的起始事件可以是疾病的确诊、某种治疗的开始等。也称之为死亡事件、终点事件。
  • 生存时间(Survival Time):广义上指某个起点事件开始到某个终点事件发生所经历的时间,度量单位可以是年、月、日、小时等,常用符号t所示。

根据研究对象的结局,生存时间数据可分为两种类型:

  • 完全数据(Completed Data):从观察起点到发生死亡事件所经历的时间。
  • 不完全数据(Incomplete Data):生存时间观察过程的截止不是由于死亡事件,而是由其他原因引起的。不完全数据分为:删失数据(censored Data),截断数据。常见原因有失访、患者退出试验、事件发生是由于非研究性疾病(如研究病人发生脑卒中后的生存时间,结果病人因为车祸死亡)、研究结束时研究对象仍未发生失效事件。删失数据的生存时间为起始事件到截尾点所经历的时间。常在截尾数据的右上角放一个“+”表示其实该对象可能活的更久。
  • 变量:生存分析的变量有两个:生存时间t和结局变量(0-1)。其中结局变量1表示死亡事件,0表示截尾。
  • 生存曲线:以生存时间为横轴、生存率为纵轴绘制一条生存曲线。
  • 中位生存时间(Median Survival Time)/平均生存时间(Mean Survival Time):中位生存时间又称半数生存期,表示恰好一半个体未发生失效事件的时间,生存曲线上纵轴50%对应的时间。平均生存时间则表示生存曲线下的面积。

生存和风险函数

  • 生存函数,也被称为幸存者函数S(t),是从时间起源(例如诊断癌症)到指定的未来时间t内仍然处于生存状态,未发生终点事件的概率。
  • 风险函数,h(t)是在时间t内被观察的个体在该时间发生事件的概率。

    请注意,生存函数侧重于没有事件发生,相反,风险函数着重于事件发生。

从分析的因素上看,有单因素分析和多因素分析。正如“连续资料的单因素分析常用t检验、方差分析,对应的多因素分析是多重线性回归”、“分类资料的单因素分析方法卡方分析,对应的多因素分析有logistic回归”一样,生存分析的常用单因素(或少数因素)的分析有Life Tables/寿命表法Kaplan-Meier法,对应的多因素模型则常用Cox回归模型(Cox风险比例模型)。从采取的分析方法上看,生存分析有非参数法(如Wilcoxon法、Log-rank法)、参数法(如Weibull回归、lognormal回归等)和半参数分析(Cox回归)。

Kaplan-Meier法

Kaplan-Meier(KM)方法是一种非参数方法,用于根据观察到的生存时间估算生存概率(Kaplan和Meier,1958年)。估计的生存概率(S(t))是针对时间点t的函数,每个时间点t都有自己的对应值。我们也可以计算生存概率的置信区间。

image-20201229141302703

  • S(ti-1) = 在ti-1还活着的概率
  • ni = 在ti不久之前还活着的患者人数
  • di = 在ti时间点发生的事件数
  • t0 = 0, S(0) = 1

Kaplan-Meier法,也称乘积极限法。【生存分析之Kaplan-Meier曲线都告诉我们什么】说明了KM曲线能告诉我们什么,以及乘积极限法的基本原理。
Kaplan-Meier曲线为我们描画了患者生存率随时间变化的特征。各个时间点的生存率值也被称为时点生存率。横轴是时间,纵轴是生存率。生存曲线呈现折线的样子,每一个“台阶”都对应着一个发生终点事件的时间点,每次有终点事件出现的时刻都会计算一次生存率,把他们用折线连接就构成了生存曲线。如何计算?

  • 在研究的起始处,生存率是100%;
  • 第一个事件出现:在这个事件发生时,共有12例患者处于观察中,其中一人出现终点事件,死亡1/12=0.0833;生存11/12=0.9167,生存率计算:91.67%;
  • 第二个点出现:在这个时段,共有11人坚持随访,其中一人发生终点事件,10人生存。故而生存概率为10/11=0.9091。由于这个时刻的生存情况实在上一个时间点的基础上产生的,所以这个时点的累积生存率也要基于上一个时间点生存率计算:0.9167X0.9091=83.33%;
  • 第三个点出现:第三个结局事件发生之前,已经有一例删失病例出现,所以到这时,仅余9人在随访过程中,其中一人发生终点事件,生存8/9=0.8889。同样的,基于前一时刻的生存率计算本时刻的累计生存率:0.8333X0.8889=74.07%;
  • 如上往复,我们可以获得完整的生存曲线。

Cox比例风险模型回归

Cox回归要求满足比例风险假定(proportional-hazards assumption)的前提条件。所谓比例风险假定,就是假定风险比(HR,Hazard Ratio)不随时间t变化而变化。

R代码实现

  • 环境搭建

    1
    2
    3
    4
    5
    6
    7
    # install.packages("survminer")
    # install.packages("survival")
    library(survival)
    library(ggplot2)
    library(ggpubr)
    library(survminer)
    library(dplyr)
  • 示例数据集
    使用survival包中提供的肺癌数据。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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

    inst:机构代码
    time:以天为单位的生存时间
    status:删失状态1 = 删失,2 = 出现失效事件
    age:岁
    sex:性别,男= 1女= 2
    ph.ecog:ECOG评分(0 =好,5 =死)
    ph.karno:医师进行的Karnofsky评分(0 = 差,100 = 好)
    pat.karno:患者自行进行的Karnofsky评分(0 = 差,100 = 好)
    meal.cal:用餐时消耗的卡路里
    wt.loss:最近六个月的体重减轻

  • 计算生存曲线:survfit()
    目标:按性别计算生存率。
    函数survfit()[在survival包中]可用于计算kaplan-Meier生存估计。主要论包括:
    使用Surv()函数创建的生存对象
    数据集中包含了数据内容。
1
2
3
4
5
6
fit <- survfit(Surv(time, status) ~ sex, data = lung)
print(fit)
Call: survfit(formula = Surv(time, status) ~ sex, data = lung)
n events median 0.95LCL 0.95UCL
sex=1 138 112 270 212 310
sex=2 90 53 426 348 550

默认情况下,函数print()显示生存曲线的简短统计内容。它输入了观察值,事件数,中位生存率和其置信区间。
如果要显示生存曲线的更完整统计内容,请键入以下内容:

1
2
3
summary(fit)
# 查看看完整的生存表格
summary(fit)$table

引用

参考文章如引起任何侵权问题,可以与我联系,谢谢。

-------- 本文结束 感谢阅读 --------
# 添加内容