当前位置: 首页 > news >正文

看完不会来揍我 | 生存分析详解 | 从基础概念到生存曲线绘制 | 代码注释 + 结果解读

大名鼎鼎的生存分析来咯!今天我就不叭叭叭了,咱们直接开始冲!(字有点多,希望大家不要嫌弃!)

提前说一句,我们今天介绍的K-M曲线主要用于比较不同组别生存曲线之间的差异,如果你想评估不同变量对生存时间的影响,建议使用Cox比例风险回归模型,详见:看完还不会来揍/找我 | 构建 Cox 比例风险回归模型 | 绘制森林图 (forestplot) | 附完整代码 + 注释

生存分析是什么

看下面这张图!漂亮不啦!

今天咱们就一起来看看,如何才能得到它!

在临床研究中,我们常常关注一些重要的结局事件,比如死亡、疾病复发、症状消失、疾病痊愈等。由于研究的时间限制和患者的差异,我们无法追踪到所有结局事件的发生,同时我们也对事件发生的时间顺序感兴趣。

为了处理这种情况,我们可以使用一种叫做生存分析(Survival Analysis)的方法。生存分析不仅关注事件是否发生还关心事件发生的时间。这种方法被广泛用于研究患者生存、疾病进展、病情改善等情况。

要注意的是,在生存分析中,“生存”并非仅仅指生命存活与否,而是广义地表示研究对象是否经历了我们感兴趣的阳性终点事件。更普遍地说,生存结局可以是任何现象是否经历了失效事件

我们举几个小栗子!

  • 对于研究某种病治疗后的复发情况,复发就可视为“死亡”,而未复发则被视为“生存”。在这个情境下,复发是终点事件,生存分析主要关注与“复发”相关的医学规律。
  • 研究戒烟后复吸的影响因素,复吸可被看作“死亡”,而未复吸则被视为“生存”。在这个情况下,复吸是终点事件,生存分析主要关注与“复吸”有关的医学规律。

这种概念不仅仅局限于医学领域,而是在各个学科都有应用。

  • 在职业升迁的研究中,升迁可被看作“死亡”,而未升迁则被视为“生存”。这里升迁是终点事件,生存分析主要关注与“升迁”有关的规律。
  • 在工业生产中,分析设备或零部件的生存情况,破损可被视为“死亡”,而正常工作可被视为“生存”。我们可能会研究为何某些零部件会更容易“死亡”嘞!

所以,我们在学习生存分析时,最需要理解的是生存分析的终点事件,不要被“生存”两字所误导,生存不代表就是活着,死亡也不代表是噶了,我们可以把生存理解为阳性事件未发生,生存时间就是维持阴性状态的时间。

总的来说,生存分析并非仅仅涉及生死,而是关注任何一种状态是否经历了特定事件

生存数据有什么特点

生存数据不是只涉及“生存”与“死亡”,而是包含两个关键信息:是否经历了感兴趣的终点事件以及经历了多久。这样的数据非常有价值,因为它提供了比单一结局更为丰富的信息,可以帮助我们更深入地了解事件发生的动态过程,而不仅仅是一个静态的结果。

咱们举个大栗子!

比如我们要观察患者接受某种治疗后的生存情况。假设我们有一组癌症患者,我们想了解他们接受治疗后生存的时间。在这里,生存数据包括两个关键信息:

  1. 是否经历了感兴趣的终点事件: 终点事件可以是患者死亡,也可以是癌症复发。如果患者在研究结束时还活着或者因为一些原因失访等等,我们称之为“删失(censoring)”(后续详细介绍),因为我们没有完整的观察到事件的发生。所以,数据中包含了死亡的信息,也包含了活着并在观察期末的信息。

    观察期末是指在研究中规定的、对参与者进行观察的时间段的结束时点。在生存分析或临床研究中,观察期通常是指研究开始后一段时间内观察参与者的时间范围。

    当研究设计包括对参与者进行一定时期的观察时,观察期末的到达意味着研究人员停止了对参与者的观察。这可能是由于研究计划中规定的观察时间到期,或者是由于研究目的已经达到,不再需要对参与者进行观察。

    在生存分析中,观察期末的重要性在于它标志着数据截止点。对于那些在观察期内未经历感兴趣事件(比如死亡)的参与者,其生存时间可能会被视为截尾,因为我们无法得知他们在观察期结束后的命运。

  2. 经历了多久: 对于那些经历了终点事件的患者,我们知道他们在研究中生存了多久。如果患者截尾,我们知道他们在观察期内还存活,但我们不知道在观察期结束后会发生什么。

所以,生存数据会有以下特点:

  • 同时考虑两个变量:生存时间和生存结局;
  • 通常含有删失数据(下面详细介绍删失数据到底是个啥);
  • 生存时间的分布通常不服从正态分布,通常是右偏的,即大多数个体在观察期内未经历事件。

什么是删失数据

在研究结束时,一些研究对象经历了研究外的其他事件或者有了不同于研究终点事件的生存结局,导致我们无法明确从观察开始到终点事件发生的生存时间。这类数据被称为删失数据(censoring data)

  • left censored(左删失):只知道实际生存时间小于观察到的生存时间。
  • right censored(右删失):只知道实际生存时间大于观察到的生存时间。
  • interval censored(区间删失):只知道实际生存时间在某个时间区间范围内。

删失的本质就是数据的缺失,这使得我们无法对所有观察对象计算“死亡速度”,难以准确地探讨人群的平均生存时间以及比较不同组人群的生存情况。

删失数据可能由多种原因引起,包括但不限于:

  1. 随访截止,终点事件仍未发生;
  2. 中途失访,无法明确观察的研究对象是否经历了终点事件以及具体的发生时间;
  3. 研究对象由于不配合等其他原因,提前退出研究,导致无法继续进行随访;
  4. 研究对象死于其他事件,例如由于其他疾病导致死亡。

这些情况都会导致我们失去了关键的生存时间信息,这些观察对象虽然不能为我们提供完全的信息,但仍有一定的价值,毕竟在删失发生之前,它们也是队伍中重要的一员,也会为我们提供大量的信息!因为它们提供了部分生存时间,所以我们称其观察值为不完全生存时间或者截尾值(censored value),常用符号“+”表示(其实很多时候,我们拿到的数据并没有标注是完全生存时间还是不完全生存时间,一般也不影响我们分析啦,大家按照同样的步骤进行即可)。

所以,生存数据涵盖了两个关键信息,通过两个变量进行表示:第一个变量是生存时间,第二个变量是是否发生阳性事件(或是否发生删失)。

生存数据实质上是关于生存时间的资料,这些生存时间资料是带有结局信息的,或者说是具有截尾值的。在英文中,这种数据通常被称为"time-to-event"资料。

几个生存相关概念

这些都可以用于绘制生存曲线哟!

  • 总体生存期(Overall Survival, OS):任何原因导致的死亡,只关心是否死亡,不考虑死亡的具体原因。用于评估患者在治疗或研究中的总体生存情况,我们一般见到的5年生存率、10年生存率等都是基于OS的。
  • 无进展生存期(Progression-Free Survival, PFS):疾病经过治疗后没有出现进一步恶化的生存期,结局指标是发生疾病进展或死亡。PFS相比OS包含了恶化这个概念,可用于评估治疗的临床效益,也就是对疾病进展的影响,要求对疾病进展的标准进行明确的定义。
  • 无病生存期(Disease-Free Survival, DFS):从随机分组开始至疾病复发或由于疾病进展导致患者死亡的时间。不考虑因何种原因死亡,只关心疾病复发或进展。用于评估治疗对疾病复发或进展的影响,常用于根治性手术治疗或放疗后的辅助治疗,比如乳腺癌术后内分泌疗法等,要求对复发的标准进行明确的定义。
  • 疾病进展时间(Time to Progress, TTP):从开始到肿瘤发生任意进展或者进展前死亡的时间。TTP相比PFS只包含了肿瘤的恶化,不包含死亡。
  • 疾病特异性生存期(Disease-Specific Survival, DSS):结局指标为由特定疾病导致的死亡,只关心特定疾病引起的死亡,而不考虑其他原因。反映特定疾病的临床获益,但患者的死因可能不容易明确。
  • 无事件生存期(Event Free Survival, EFS):指从开始到发生任何事件的时间,这里的事件包括肿瘤进展、死亡、治疗方案的改变、致死副作用等(主要用于病程较长的恶性肿瘤或该实验方案危险性高等情况下)。

生存分析的主要方法

  1. 参数法:
    • 特点: 假设知道生存时间的分布模型,然后通过观察数据来估计模型的参数,最终利用分布模型计算生存率。
    • 示例: 常见的参数法包括根据数据估计的指数分布、Weibull分布等。
  2. 非参数法:
    • 特点: 不需要事先知道生存时间的分布,而是根据样本中观察到的生存时间数据的统计量来估计生存率。
    • 示例: Kaplan-Meier法(乘积极限法)和寿命法是常见的非参数法,它们用于计算生存曲线和估计生存概率。
  3. 半参数法:
    • 特点: 不需要知道生存时间的分布,但最终是通过引入一个模型来评估影响生存率的因素。常用的方法是Cox回归模型,Cox回归也就是比例风险回归。有兴趣的小伙伴们可以查看:看完还不会来揍/找我 | 构建 Cox 比例风险回归模型 | 绘制森林图 (forestplot) | 附完整代码 + 注释
    • 示例: Cox回归模型允许考察多个协变量对生存时间的影响,而无需假设生存时间的具体分布。

这三类方法各有优劣,选择取决于研究问题、数据的性质以及我们的假设。参数法适用于对生存时间分布有先验了解的情况,非参数法在分布不明确时提供了一种弹性的估计方法,而半参数法在考虑协变量因素的情况下能够更全面地分析生存数据。

生存曲线是什么

生存曲线是生存分析中的一种图形工具,用于描述群体中个体随时间变化的生存状况。

生存分析的核心就是构建生存曲线。

生存曲线就是将每个时间点的生存率连接在一起形成的曲线。以时间为横轴,生存率为纵轴,直观地展示在不同时间点上生存率的变化。这有助于比较不同组别之间的生存差异,并评估潜在的预后因素。曲线平滑则说明高生存率,反之则低生存率;中位生存期越长,则说明预后较好。

生存时间,一般可采用中位生存时间来描述。

中位生存时间(Median Survival Time):也称半数生存期,表示恰有50%的个体存活的时间,即生存率为50%时对应的生存时间,是描述集中趋势的指标(它不是生存时间中位数)。中位生存期越长,表示人群平均生存时间越长。

最常用的生存曲线是Kaplan-Meier曲线,前面我们提到的Kaplan-Meier法就是用它来描述生存过程的。Kaplan-Meier法估计的生存率是一个累积的生存率,或者说是一个条件生存率,前面的条件再乘以当前的生存率(比如三年生存率则是第1-3年每年存活概率的乘积)。

这里要注意的是:

**生存曲线并不仅限于Kaplan-Meier曲线,还有其他形式的生存曲线。**不同的生存分析方法可能采用不同的曲线绘制方式。以下是一些常见的生存曲线类型:

  1. Kaplan-Meier 曲线: 是咱们最常用的啦!今天咱们就主要介绍它!
  2. Nelson-Aalen 曲线: 这是另一种非参数生存曲线,它绘制的是累积风险(cumulative hazard)函数随时间的变化。累积风险函数是生存函数的互补,它直接反映了事件发生的累积风险。
  3. Cumulative Incidence Function (CIF) 曲线: 用于描述在竞争性风险情境下的生存情况。在这种情况下,个体可能经历多种类型的事件,而不仅仅是单一类型的事件。CIF 曲线显示了各个事件类型的发生率随时间的累积情况。
  4. Smoothed Survival Curves: 有时也使用平滑的生存曲线,以减少由于数据中的噪音或小样本效应引起的不稳定性。这可以通过使用核密度估计等方法进行平滑处理。
  5. Restricted Mean Survival Time (RMST) 曲线: 用于描述特定时间段内的平均生存时间,而不是整个生存时间的曲线。

每种生存曲线的选择取决于研究问题、数据类型和个人偏好等等。Kaplan-Meier 曲线是最常见和广泛应用的,但我们也要根据具体情况,或许有时候选择其他曲线形式更合适哟!

接下来,咱们详细介绍一下 Kaplan-Meier 曲线的基本原理和绘制步骤!

Kaplan-Meier 曲线

基本原理

Kaplan-Meier 方法通过在观察时间点上逐步考虑每个观察的生存状态(生存或死亡),以步骤性方式计算生存率。对于每个观察时间点,生存率计算为在该时间点之前仍然存活的个体数除以当时存活的总个体数。

生存率是通过对各个观察时间点的生存率进行累积乘积得到的。这样得到的生存率是在每个观察时间点上存活的概率,形成了生存曲线。

下面我们简要介绍一下Kaplan-Meier生存率的计算过程:

假设我们有 n n n 个观察对象,每个对象都有一个生存时间 t i ( i = 1 , 2 , . . . , n ) t_i(i = 1, 2, ..., n) tii=1,2,...,n和一个二元事件指示器 δ i δ_i δi1 表示发生事件,0 表示截尾或删失)。

  1. 排序观察时间: 将所有观察时间从小到大排序,得到排序后的观察时间序列 t 1 ≤ t 2 ≤ . . . ≤ t n t_1 ≤ t_2 ≤ ... ≤ t_n t1t2...tn

  2. 计算生存函数: 对于每个观察时间 t i t_i ti,计算在该时间点之前生存下来的个体数 n i n_i ni 和在该时间点发生事件的个体数 d i d_i di。生存率 S i S_i Si 可以通过以下公式计算:

    S i = S i − 1 × ( 1 − d i n i ) S_i = S_{i-1} \times \left(1 - \frac{d_i}{n_i}\right) Si=Si1×(1nidi)

    初始时 S 0 = 1 S_0 = 1 S0=1,即全部个体存活,然后根据每个观察时间点的事件发生情况进行逐步计算。

  3. 生存曲线绘制: 利用计算得到的生存率数据,在观察时间点上绘制 Kaplan-Meier 生存曲线。

这个过程会生成一个阶梯状的曲线,曲线上每个台阶的高度表示在相应的时间点上的生存率。曲线的下降代表事件的发生。

对于有多个组别的比较,可以计算每个组别的Kaplan-Meier生存曲线,并使用Log-Rank检验等方法进行生存曲线之间的比较。

绘制步骤

为了方便大家复现,数据我们使用的是survival包中提供的lung数据集(大家替换为自己的数据即可,记得与示例数据格式保持一致)。

# 加载包,没安装的记得安装一下哟!
library(survival)     # 估计生存曲线、计算生存率、进行生存分析的统计检验等
library(survminer)    # 可视化生存分析结果,绘制生存曲线sur_data <- lung
head(sur_data)
#   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:最近六个月的体重减轻

接下来,使用survival包中的survfit函数计算kaplan-Meier生存估计。

我们现在的目标是按性别计算生存率

# 使用survival包中的survfit函数计算kaplan-Meier生存估计
fit <- survfit(Surv(time, status) ~ sex, data = lung)

代码解读:

  1. Surv(time, status):这部分定义了生存数据的格式。Surv() 函数用于创建生存数据对象,其中 time 是表示生存时间的变量,status 是表示事件发生状态。
  2. ~ sex:这是 formula 的一部分,指定了模型中的解释变量。在这个例子中,sex 被认为是影响生存的因素。
  3. data = lung:这指定了数据集,即 lung 数据集,其中包含了 timestatussex 等变量。
  4. survfit():这个函数用于拟合生存曲线。通过传入生存数据对象和模型公式,它计算并返回生存曲线的估计值。
# 查看拟合结果
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

显示生存曲线的统计内容,包括观察值、事件数、中位生存率及其置信区间。

如果你想要显示生存曲线更完整的统计内容,请像下面这样:

# 查看更详细的统计内容
summary(fit)
# 太长我就不展示啦!自己看!# 查看完整的生存表格
summary(fit)$table
#       records n.max n.start events    rmean se(rmean) median 0.95LCL 0.95UCL
# sex=1     138   138     138    112 326.0841  22.91156    270     212     310
# sex=2      90    90      90     53 460.6473  34.68985    426     348     550

接下来,咱们就可以使用survminer包中的ggsurvplot函数进行生存曲线的绘制啦!

# 绘制生存曲线
ggsurvplot(fit, surv.median.line = "hv",           # 同时显示中位生存时间的垂直和水平参考线pval = T,                          # 显示统计检验p值conf.int = T,                      # 显示置信区间risk.table = T,                    # 显示风险表格,展示每个时间点的风险数量risk.table.col = "strata",         # 风险表格按照性别着色xlab = "Time(days)",               # x轴标签ylab = "Survival Probability",     # y轴标签legend.title = "Sex",              # 图例标题legend.labs = c("male", "female"), # 图例标签ggtheme = theme_minimal(),         # 使用极简主题break.x.by = 100,                  # x轴刻度间隔,大家可以按照自己的数据特点自行调整,我这里设了每100天一个刻度palette = c("#bc5148", "#3090a1")) # 自定义颜色

图图解读:

图中显示了使用生存分析得到的性别(male、female)对生存曲线的影响。

横轴表示以天为单位的时间,纵轴表示生存的可能性或生存的人口比例。线代表两组/层(分别代表男性和女性)的生存曲线。曲线中的垂直下降表示事件发生。曲线上的十字叉表示此时患者删失。中位生存时间用水平和垂直线表示,统计检验的 p 值和置信区间也在图中有显示。图中还包含了一个风险表格(大家自行选择是否展示,其实我一般都不要它),显示了每个时间点的风险数量,并通过颜色区分了男性和女性。

咱们通过看图图可以知道:

  • 在起点时,生存概率为1.0(或100%的参与者还活着)。
  • 在时间250,性别 = 1,也就是男性(male)的存活概率约为0.55(或55%),性别 = 2,女性(female)的存活概率约为0.75(或75%)。
  • 男性的中位生存时间约为270天,女性的中位生存期约为426天,这表明女性生存期高于男性。

还记得不啦,咱们前面有提到过,可以用下面的代码获得每组的中位生存时间。

summary(fit)$table
#       records n.max n.start events    rmean se(rmean) median 0.95LCL 0.95UCL
# sex=1     138   138     138    112 326.0841  22.91156    270     212     310
# sex=2      90    90      90     53 460.6473  34.68985    426     348     550

看!median那列!就是中位生存时间啦!是不是和咱们上面肉眼估计的一样!果然,我的眼睛就是尺!!!

要注意!中位生存时间,千万不能简单地理解为“死亡人数到了一半”,因为有些受试者中途失访或随访结束也没有发生结局。严格来说就是累积生存率为0.5的时候所对应的时间t。

有时候中位生存时间估计不出来,因为发生“死亡”的人数太少,这个时候就报道为某个时间点的生存率(如1年生存率、5年生存率等),或者报道平均生存时间(如果数据不是很偏态的话)。

总的来说,这个图提供了生存曲线、中位生存时间、统计检验信息以及风险表格等多方面的信息,有助于我们深入理解性别对肺癌患者生存的影响!

注意注意!

我们可以使用ggsurvplot 函数中参数fun指定三个经常使用的转换,这个参数的目的是改变生存曲线的纵坐标刻度,以更好地展示不同的生存曲线特征。

以下是 fun 参数的几种选项:

  • "log":生存函数的对数转换。在图上应用对数转换,可以更容易看到生存率的细微差异。
  • "event":绘制累积事件,也称为累积发生率。这个选项的目的是直观地表示事件的累积概率,即 f ( y ) = 1 − S ( y ) f(y) = 1 - S(y) f(y)=1S(y)
  • "cumhaz":绘制累积风险函数,也称为累积危险函数。这个选项的目的是通过 f ( y ) = − log ⁡ ( S ( y ) ) f(y) = -\log(S(y)) f(y)=log(S(y)) 更直观地表示生存风险。

简单介绍一下累积事件和累积风险函数。

  • 累积事件(Cumulative Incidence Function, CIF):累积事件是指在给定时间点之前发生某个特定事件的累积概率。对于生存分析来说,通常表示特定类型的事件(例如死亡、疾病复发等)在某个时间点之前发生的概率。累积事件是一个累积概率函数,其值在 [0, 1] 的范围内。在时间 t 处的累积事件概率等于在该时间点之前发生事件的概率。
  • 累积风险函数(Cumulative Hazard Function, CHF):累积风险函数是指在给定时间点之前,累积发生某个特定事件的风险。风险通常通过危险比(Hazard Ratio)来表示,是事件发生的瞬时速率。累积风险函数是一个累积函数,它随时间递增。在时间 t 处的累积风险等于在该时间点之前发生事件的瞬时风险的累积。

关键区别:累积事件关注的是在给定时间点之前事件发生的概率,是一个概率累积函数;累积风险函数关注的是在给定时间点之前事件的累积风险,是一个风险的累积函数。

话不多说(虽然每次都叭叭叭好多)!咱们来瞅瞅它们长啥样吧!

绘制累积事件:

# 绘制累积事件
ggsurvplot(fit, surv.median.line = "hv",           # 同时显示中位生存时间的垂直和水平参考线pval = T,                          # 显示统计检验p值conf.int = T,                      # 显示置信区间# risk.table = T,                  # 显示风险表格,展示每个时间点的风险数量# risk.table.col = "strata",       # 风险表格按照性别着色xlab = "Time(days)",               # x轴标签ylab = "Survival Probability",     # y轴标签legend.title = "Sex",              # 图例标题legend.labs = c("male", "female"), # 图例标签ggtheme = theme_minimal(),         # 使用极简主题break.x.by = 100,                  # x轴刻度间隔,大家可以按照自己的数据特点自行调整,我这里设了每100天一个刻度palette = c("#bc5148", "#3090a1"), # 自定义颜色fun = "event")                     # 绘制累积事件

绘制累积风险函数:

# 绘制累积风险函数
ggsurvplot(fit, pval = T,                          # 显示统计检验p值conf.int = T,                      # 显示置信区间# risk.table = T,                  # 显示风险表格,展示每个时间点的风险数量# risk.table.col = "strata",       # 风险表格按照性别着色xlab = "Time(days)",               # x轴标签ylab = "Survival Probability",     # y轴标签legend.title = "Sex",              # 图例标题legend.labs = c("male", "female"), # 图例标签ggtheme = theme_minimal(),         # 使用极简主题break.x.by = 100,                  # x轴刻度间隔,大家可以按照自己的数据特点自行调整,我这里设了每100天一个刻度palette = c("#bc5148", "#3090a1"), # 自定义颜色fun = "cumhaz")                    # 绘制累积风险函数

前面我们有提到使用summary函数可以获得生存分析的详细统计内容,除了它,我们其实还可以使用survminer包中的surv_summary函数获取生存曲线的统计内容。与默认的summary函数相比,surv_summary会创建一个包含来自survfit结果的数据表,大家请看!

# 使用surv_summar查看生存分析的统计内容
sur_sum <- surv_summary(fit, data = sur_data)
head(sur_sum)
#   time n.risk n.event n.censor      surv    std.err     upper     lower strata sex
# 1   11    138       3        0 0.9782609 0.01268978 1.0000000 0.9542301  sex=1   1
# 2   12    135       1        0 0.9710145 0.01470747 0.9994124 0.9434235  sex=1   1
# 3   13    134       2        0 0.9565217 0.01814885 0.9911586 0.9230952  sex=1   1
# 4   15    132       1        0 0.9492754 0.01967768 0.9866017 0.9133612  sex=1   1
# 5   26    131       1        0 0.9420290 0.02111708 0.9818365 0.9038355  sex=1   1
# 6   30    130       1        0 0.9347826 0.02248469 0.9768989 0.8944820  sex=1   1# 简单介绍一下surv_summary返回包含的内容:
# 
# time: 曲线上的时间点
# n.riks: 在时间t处有风险的受试者人数
# n.event: 在时间t发生的事件数
# n.censor: 在时间t退出事件而不发生风险的删失者的数量
# surv: 估计等生存概率
# std.err: 生存概率的标准误
# lower, upper: 曲线的置信度上限和下限
# strata: 表示曲线估计的分层,strata的水平(一个因子)就是曲线的标签

surv_summary对象还有一个名为“table”的属性,其中包含有关生存曲线的信息,包括具有置信区间的生存中位数以及每条曲线中受试者的总数和事件数。要访问属性“table”,我们可以输入以下命令:

attr(sur_sum, "table")
#       records n.max n.start events    rmean se(rmean) median 0.95LCL 0.95UCL
# sex=1     138   138     138    112 326.0841  22.91156    270     212     310
# sex=2      90    90      90     53 460.6473  34.68985    426     348     550

啊!万万没想到,小小的生存分析居然介绍了这么多!实际使用起来其实一点都不复杂!就两行代码搞定一般!大家完全不用慌!我只是碎碎念补充了很多!不过,相信我!了解这些绝对没有坏处!这会帮助我们在进行生存分析时更加心中有数!

最后,再强调一句!咱们的数据中结局事件恰好为真的死亡,但,我们一定要注意!**生存分析,并不是只能分析生存与死亡!**不记得为啥的罚你动动小手滑到上面再看一次!

啊对!再提一嘴,我们今天介绍的K-M曲线主要用于比较不同组别生存曲线之间的差异,如果你想评估不同变量对生存时间的影响,建议使用Cox比例风险回归模型,详见:看完还不会来揍/找我 | 构建 Cox 比例风险回归模型 | 绘制森林图 (forestplot) | 附完整代码 + 注释


那今天的分享就到这里啦!我们下期再见哟!

最后顺便给自己推荐一下嘿嘿嘿!

如果我的分享对你有用的话,欢迎关注点赞在看转发分享阿巴阿巴阿巴阿巴巴巴!这可是我的第一原动力!

蟹蟹你们的喜欢和支持!!!

啊对!如果小伙伴们有需求的话,也可以加入我们的交流群:一定要知道 | 我们的生信交流群终于来啦!

还有兴趣的话,也可以看看我掏心掏肺的干货满满 | 给生信小白的入门小建议 | 掏心掏肺版!绝对干货满满!

后续这个链接可能会更新,如果小伙伴点开它之后发现,咦,怎么失效啦!不要慌!咱们辛苦一下动动小手去公众号主页的作者精选那里,会有一篇同名的文章,点进去就是啦!

参考资料
  1. https://mp.weixin.qq.com/s/KQj-GLTUq8quDelpCfMbdQ
  2. https://blog.csdn.net/weixin_44788825/article/details/105553495
  3. https://mp.weixin.qq.com/s/y7ejxowWt9yBwZtE0Z7Tzw
  4. https://mp.weixin.qq.com/s/9ZtE2erTvjvMX6s6Ppx2nw
  5. https://zhuanlan.zhihu.com/p/163316406
  6. http://www.sthda.com/french/

相关文章:

  • 什么是WhatsApp Business解决方案提供商?
  • docker-swarm集群管理命令
  • 数据结构从入门到精通——栈
  • docker使用笔记
  • [leetcode 189][轮转数组]
  • 【性能】JDK和Jmeter的安装与配置
  • NTFS安全权限
  • 手写分布式配置中心(四)增加实时刷新功能(长轮询)
  • 【李沐精读系列】GPT、GPT-2和GPT-3论文精读
  • 前端发起请求,后端模型需处理很久,怎样设置前端直接完成请求响应,后端计算完在返回结果给前端?
  • js【详解】event loop(事件循环/事件轮询)
  • 智能电视(如小米电视)安装应用(当贝市场、浏览器)、去开机广告
  • 数据库讲解(MySQL版)(超详细)【第一章】
  • 应用内存分析
  • STM32 | 零基础 STM32 第一天
  • 2017-09-12 前端日报
  • 2017前端实习生面试总结
  • Cookie 在前端中的实践
  • CSS实用技巧
  • input的行数自动增减
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JAVA_NIO系列——Channel和Buffer详解
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • 前端_面试
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • MyCAT水平分库
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • $ git push -u origin master 推送到远程库出错
  • $.each()与$(selector).each()
  • (0)Nginx 功能特性
  • (02)vite环境变量配置
  • (3)选择元素——(17)练习(Exercises)
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (二)springcloud实战之config配置中心
  • (附源码)计算机毕业设计ssm电影分享网站
  • (附源码)计算机毕业设计高校学生选课系统
  • (排序详解之 堆排序)
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (十六)一篇文章学会Java的常用API
  • (实战篇)如何缓存数据
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (原)Matlab的svmtrain和svmclassify
  • (转)Scala的“=”符号简介
  • (转)菜鸟学数据库(三)——存储过程
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • *p++,*(p++),*++p,(*p)++区别?
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .net core 控制台应用程序读取配置文件app.config
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)