百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

一文带您了解生存分析(Survival Analysis):python 示例

toyiye 2024-08-10 21:40 26 浏览 0 评论

生存分析(Survival Analysis)是一种统计分析方法,用于研究时间至一个或多个事件发生的预期持续时长,这些事件可以包括各种感兴趣的情况,如心脏病发作、癌症缓解或死亡等。这个方法也被称为持续时间分析(Duration Analysis)或持续时间建模(Duration Modelling)、时间至事件分析(Time-to-Event Analysis)、可靠性分析(Reliability Analysis)和事件历史分析(Event History Analysis)。与其他类型的分析不同,生存分析具有独特的特点,因此需要不同的统计技术。

在这个上下文中,"生存"并不总是指死亡,而是指随着时间的推移而发生的各种事件。例如,员工的离职就是这种事件类型,可以利用生存分析的技术来分析员工流动率,为管理和招聘提供决策支持。这种分析有助于理解事件发生的时间模式,从而为组织提供更有效的人力资源策略和管理方法。

从lifelines的示例开始

lifelines 是一个用于建模和分析生存数据的 Python 库。它提供了多种生存分析工具,包括 Kaplan-Meier 生存曲线、Cox 比例风险模型、Aalen 加法风险模型等。

  • Kaplan-Meier 生存曲线是一种非参数方法,用于估计生存概率。它适用于分析诸如患者存活时间等生存数据。使用 KaplanMeierFitter 类拟合生存曲线,通过 fit 方法拟合数据,然后使用 plot 方法绘制生存曲线图。
  • Cox 比例风险模型是一种半参数方法,用于分析生存数据。它可以研究不同因素对生存时间的影响。使用 CoxPHFitter 类拟合 Cox 比例风险模型,通过 fit 方法拟合模型,然后进行参数估计和假设检验。
  • Aalen 加法风险模型是一种考虑时间依赖性的生存分析方法,适用于具有时间相关危险率的数据。使用 AalenAdditiveFitter 类拟合 Aalen 加法风险模型,通过 fit 方法拟合模型,然后进行参数估计和假设检验。

lifelines 还提供了一系列生存分析统计量,例如中位生存时间、生存概率、累积危险函数等,用于描述生存数据的特征。

lefelines 示例数据集中包含163个观察结果,包含三列:

  • T代表min(T, C),其中T为死亡时间,C为观测截止时间。
  • E代表是否观察到“死亡”,1代表观测到了,0代表未观测到,即生存分析中的删失数据,共7个。
  • group代表是否存在病毒, miR-137代表存在病毒,control代表为不存在即对照组,根据统计,存在miR-137病毒人数34人,不存在129人。

Kaplan-Meier 估计

估计生存函数的最简单方法是使用 Kaplan-Meier 估计量。其方程如下所示。基本上是计算每个时间点有多少人死亡/存活。其中,di 表示时间 ti 发生的死亡事件数,ni 表示时间 ti 时有生存风险的人数。

举个例子,我们有 21 个数据点。在时间 33,21 人中有 1 人死亡。因此,时间 33 的生存率计算为 1?1/21。在时间 54,剩下的 20 人中有 2 人死亡。在时间 61,剩下的 18 人中有 9 人死亡。在时间 67,我们只剩下 7 人,其中 6 人已经死亡。可以看出,Kaplan-Meier 估计是非常容易理解和计算的,即使是手动计算也很容易。

在 lifelines 中使用 KaplanMeierFitter,我们会得到相同的结果。除了下面的函数之外,我们还可以从 kmf.event_table 获取事件表,从 kmf.median_survival_times 获取中位生存时间(50% 的人口死亡的时间),以及从 kmf.confidence_interval_ 获取生存估计的置信区间。

from lifelines.datasets import load_waltons
df = load_waltons()
T = df['T']
E = df['E']
from lifelines import KaplanMeierFitter
kmf = KaplanMeierFitter()
kmf.fit(T, event_observed=E)
#print(kmf.survival_function_)
kmf.plot_survival_function()

Nelson-Aalen 估计

Nelson-Aalen 估计量首先通过以下方程估计危险率。其中,di 表示时间ti 发生的死亡事件数,ni 表示时间 ti 时有死亡风险的人数。我们可以通过下面的简单计算获得所有的危险率。

from lifelines import NelsonAalenFitter
naf = NelsonAalenFitter(nelson_aalen_smoothing=False)
naf.fit(T, event_observed=E)
naf.cumulative_hazard_
naf.plot_cumulative_hazard()

Kaplan-Meier 和 Nelson-Aalen 估计都是非参数的。它们易于解释,但没有功能形式,因此我们无法用它来建模分布函数。

指数模型(Exponential model)生存函数

指数分布基于泊松过程,其中事件以恒定的事件发生率 连续且独立地发生。指数分布模拟了事件发生前需要多长时间,其概率密度函数为 ()=xp(?),累积分布函数为 ()=(≤)=1?xp(?)。指数模型的累积分布函数表示了在时间 t 之后未生存的概率,但生存函数则相反。因此,对于生存函数:

  • ()=1?()=exp(?)
  • ?()=
  • ()=
from lifelines import ExponentialFitter
exf=ExponentialFitter().fit(T,E,label='Exponential model')
exf.plot_survival_function()


威布尔模型(Weibull model)生存函数

指数分布是威布尔分布的特例:x~exp()~威布尔分布 (1/,1)。威布尔分布的累积分布函数为 ()=1?exp(?(/))。

  • 当 < 1 时:失效率随时间降低
  • 当 = 1 时:失效率保持恒定(指数分布)
  • 当 > 1 时:失效率随时间增加

同样,我们可以将生存函数写作 1-F(t):

  • ()=exp(?(/))
  • ?()=/(/)^(?1)
  • ()=(/)
from lifelines import WeibullFitter
wbf=WeibullFitter().fit(T,E,label='Weibull model')
wbf.plot_survival_function()


Cox 比例风险模型

Cox 比例风险模型是指当 0 变为 (0()) 时,基线风险是时间的函数。

?(|)=0()(∑)

其中:

  • ?() 表示风险
  • 0() 表示基线风险,随时间变化
  • (∑) 表示部分风险,与时间无关
  • xi 通常以均值为中心
from lifelines import CoxPHFitter
from lifelines.datasets import load_rossi
rossi_dataset = load_rossi()
cph = CoxPHFitter()
cph.fit(rossi_dataset, duration_col='week', event_col='arrest')
#cph.print_summary()
cph.plot()
#cph.plot_partial_effects_on_outcome()
#'plot', 'plot_covariate_groups', 'plot_partial_effects_on_outcome'

Aalen 加法风险模型(Aalen’s additive model)

h(tx)=b0(t)+b1(t)x1+...+bN(t)xN

from lifelines import AalenAdditiveFitter

df = pd.DataFrame({
    'T': [5, 3, 9, 8, 7, 4, 4, 3, 2, 5, 6, 7],
    'E': [1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0],
    'var': [0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2],
    'age': [4, 3, 9, 8, 7, 4, 4, 3, 2, 5, 6, 7],
})

aaf = AalenAdditiveFitter()
aaf.fit(df, 'T', 'E')
aaf.predict_median(df)
aaf.print_summary()

生存分析是一种重要的统计分析方法,用于研究事件发生的持续时间,无论这些事件是什么。它不仅限于分析死亡事件,还适用于各种其他情况,如疾病缓解、员工离职等。这种分析方法为研究人员提供了深入了解事件发生时间模式的途径,从而可以制定有效的战略和管理措施。

无论是医疗领域对患者治疗效果的研究,还是企业对员工留存率的分析,生存分析都发挥着关键作用。这种方法帮助我们深入了解事件发生的规律,从而为未来制定决策和规划提供支持。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码