生存分析利器:Python 中的 Kaplan-Meier Fitter 类详解

news2024/11/26 22:43:53

KaplanMeierFitterlifelines库中用于计算生存分析的一个类。使用KaplanMeierFitter类,我们可以对我们的数据进行不同组之间的生存分析,比如根据年龄、性别、治疗手段等分类变量进行分组分析。

该类包含许多方法和属性,其中最常用的是fit()方法和plot()方法。

  • fit(): 该方法根据输入的时间和截尾数据来估计生存函数,返回一个KaplanMeierFitter对象。
  • plot(): 根据估计的生存函数绘制Kaplan Meier曲线,并可以通过传递参数来自定义曲线的颜色、标签等属性。

简单案例

例如,以下代码块展示了如何使用KaplanMeierFitter类对数据进行分组生存分析并绘制生存曲线:

from lifelines import KaplanMeierFitter

kmf = KaplanMeierFitter()

# 分组后的时间和截尾数据
T1 = df.loc[df['Stage_group'] == 1, 'Time']
E1 = df.loc[df['Stage_group'] == 1, 'Censor']

T2 = df.loc[df['Stage_group'] == 2, 'Time']
E2 = df.loc[df['Stage_group'] == 2, 'Censor']

# 对两组数据分别进行生存分析
kmf.fit(T1, event_observed=E1, label='Stage III')
kmf.fit(T2, event_observed=E2, label='Stage IV')

# 绘制两条生存曲线
kmf.plot()

在上面的代码中,我们首先创建一个KaplanMeierFitter对象,并使用fit()方法对两组数据分别进行生存分析。然后,我们通过plot()方法绘制了两条生存曲线。

其中,生存曲线下方的阴影部分是95%置信区间,可以帮助我们评估估计值的精度。

KaplanMeierFitter类中的fit()用法

KaplanMeierFitter类中的fit()方法可以根据输入的时间和截尾数据来估计生存函数。该方法有以下几个参数:

  • durations: 表示各个事件的时间数列,可以是一个numpy数组或一个pandas的Series。
  • event_observed: 表示事件是否被观察到,也就是截尾信息的数列,可以是一个numpy数组或一个pandas的Series。该数列中1表示事件被观察到,0表示事件未被观察到。
  • timeline: 表示需要计算生存函数的时间点,可以是一个numpy数组或一个pandas的Series。如果不指定,则默认使用所有时间点。
  • entry: 表示入组时间,也就是开始观测的时间点,可以是一个numpy数组或一个pandas的Series。如果不指定,则默认所有样本的入组时间均为0。

下面是一个具体使用fit()方法的示例:

from lifelines import KaplanMeierFitter
import pandas as pd

# 读取数据
data = pd.read_csv('survival_data.csv')

# 创建KaplanMeierFitter对象
kmf = KaplanMeierFitter()

# 对数据进行生存分析
kmf.fit(durations=data['Time'], event_observed=data['Event'])

在上面的代码中,我们首先使用pandas库读取了名为’survival_data.csv’的数据集,然后创建了一个KaplanMeierFitter对象。接着,我们调用fit()方法对数据进行生存分析,其中传入了时间和截尾数据。

fit()方法中,我们可以使用label参数来为当前分析添加标签(label),方便与其他分析结果区分。例如:

kmf.fit(durations=T1, event_observed=E1, label='Group 1') # 添加标签'Group 1'

此外,KaplanMeierFitter类还提供了许多方法和属性,详细使用方法可以参见官方文档:

常见的属性及其使用方法示例:

在执行完fit()方法后,我们可以通过许多属性来查看估计的生存函数。例如:

  • survival_function_: 包含估计的生存函数。
  • cumulative_hazard_: 包含估计的累积危险函数。
  • confidence_interval_: 包含估计的生存函数的置信区间。
  • median_survival_time_: 表示中位生存时间。

具体展开讲

  • survival_function_: 返回一个pandas DataFrame,表示估计的生存函数,其中index是时间,columns是生存率,例如:

    print(kmf.survival_function_)
    

    输出结果如下:

    timeline         KM_estimate
                       
    0.0                  1.000000
    7.0                  0.985714
    8.0                  0.971429
    9.0                  0.957143
    10.0                 0.942857
    11.0                 0.928571
    14.0                 0.914286
    16.0                 0.900000
    18.0                 0.885714
    ...                       ...
    

在上面的示例中,survival_function_属性返回了一个DataFrame,其index是时间点,columns是生存率,即在该时间点之前尚存活的患者占全部患者的比例。我们可以使用Pandas的数据处理方法对其进行进一步的操作和可视化。

  • cumulative_hazard_:返回一个pandas DataFrame,表示累积危险函数的估计值,例如:

    print(kmf.cumulative_hazard_)
    

    输出结果如下:

                       KM_estimate
    timeline                     
    0.0                  0.000000
    7.0                  0.015152
    8.0                  0.030303
    9.0                  0.045455
    10.0                 0.060606
    11.0                 0.075758
    14.0                 0.090909
    16.0                 0.106061
    18.0                 0.121212
    ...                       ...
    

    在上面的示例中,cumulative_hazard_属性返回了一个DataFrame,其index是时间点,columns是累积危险函数的估计值。使用该属性可以进一步计算和可视化危险函数。

  • confidence_interval_: 返回一个pandas DataFrame,表示生存函数的置信区间,例如:

    print(kmf.confidence_interval_)
    

    输出结果如下:

                          KM_estimate_lower_0.95  KM_estimate_upper_0.95
    timeline                                                            
    0.0                                 1.000000                 1.000000
    7.0                                 0.940789                 0.998414
    8.0                                 0.882671                 0.997766
    9.0                                 0.828292                 0.996916
    10.0                                0.772771                 0.995863
    11.0                                0.724301                 0.994594
    14.0                                0.677130                 0.992959
    16.0                                0.632644                 0.990914
    18.0                                0.586813                 0.988317
    ...                                       ...                      ...
    

    在上面的示例中,confidence_interval_属性返回了一个DataFrame,其index是时间点,columns是置信区间的上限和下限。可以使用该属性对生存函数进行统计分析。

  • median_survival_time_: 返回一个float值,表示中位生存时间,例如:

    print(kmf.median_survival_time_)
    

    输出结果如下:

    369.0
    

    在上面的示例中,median_survival_time_属性返回了一个float值,表示中位生存时间。可以使用该属性进行中位数分析。

KaplanMeierFitter类中的plot()用法

在生存分析中,KaplanMeierFitter类的plot()方法是可视化生存分析结果的重要工具。该方法可以绘制 Kaplan-Meier 生存曲线和其他一些统计信息,例如置信区间、中位生存时间等。下面详细解释kmf.plot()的用法和参数:

  • at_risk_counts: bool类型参数,默认值为 False,表示是否在图表中显示每个时间点处的“风险人数”,即仍然有可能发生事件的患者数量。若指定该参数为 True,则在图表顶部会出现黑色竖线,代表当前时刻有多少患者仍在观察中。

  • show_censors: bool类型参数,默认值为 False,表示是否在图表中显示被审查数据,即发生在患者失去随访前的事件。若指定该参数为 True,则在事件曲线上会出现垂直的标记。

  • cumulative_events: bool类型参数,默认值为 False,表示是否在图表中显示累积事件数。若指定该参数为 True,则除了 Kaplan-Meier 生存曲线外,还会绘制事件曲线,显示事件数随时间的增加情况。

  • legend: bool类型参数,默认值为 True,表示是否在图表中显示图例。若指定该参数为 False,则将不会显示图例。如果我们手动创建绘图,该参数可能会很有用。

  • ylabel: str类型参数,默认值为“生存概率”,表示y轴上的标签。可以更改为其他自定义标签,例如“累积生存率”。

  • ax: matplotlib.axes.Axes类型对象,默认值为 None,表示在哪个Matplotlib Axes对象上绘制。如果没有指定该参数,则将在新的图表中创建Axes对象并进行绘制。

此外,kmf.plot()还返回了一个matplotlib.axes.Axes类型对象,它可以进一步被修改或可视化。

下面是一个示例:

from lifelines import KaplanMeierFitter
import pandas as pd
import matplotlib.pyplot as plt

# 读取数据
data = pd.read_csv('data.csv')

# 处理数据
T = data['T']   # 时间列
E = data['E']   # 事件列

# 创建 Kaplan-Meier Fitter 对象
kmf = KaplanMeierFitter()

# 计算生存分析
kmf.fit(T, event_observed=E)

# 绘制 Kaplan-Meier 生存曲线
fig, ax = plt.subplots()
kmf.plot(ax=ax)

# 设置标签和标题
plt.xlabel('Time (days)')
plt.ylabel('Cumulative Survival Probability')
plt.title('Kaplan-Meier Plot')

# 显示图形
plt.show()

输出类似下面这个
注意:库的版本不同,参数有细微差别
在这里插入图片描述

文章持续更新,可以关注微信公众号【医学图像人工智能实战营】获取最新动态,一个关注于医学图像处理领域前沿科技的公众号。坚持已实践为主,手把手带你做项目,打比赛,写论文。凡原创文章皆提供理论讲解,实验代码,实验数据。只有实践才能成长的更快,关注我们,一起学习进步~

我是Tina, 我们下篇博客见~

白天工作晚上写文,呕心沥血

觉得写的不错的话最后,求点赞,评论,收藏。或者一键三连
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/533773.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FPGA复位信号设计讨论

复位概述 复位作为电子系统中最常见的信号同时也是最重要的信号,它对工程师整体的设计表现有着极大的影响。复位信号可能深刻影响设计的性能表现,功耗,面积等等。对于一个优秀的系统设计,很难不把复位信号当成一个关键信号来设计。…

【车载基础软件 |ASF中间件 系列二】— 国产汽车生态平台ASF的生态框架

本文主要介绍国产基础软件开发平台架构下基于ASF的生态框架。 背景信息 随着E/E架构演进,从最初传统的分布式架构,由独立功能的ECU通过CANLIN等高实时性 总线通讯。诼渐演进到当前分域集中式结合车联网功能的结构,车载以大网逐渐步入了整车电子电器架构之中,除了高实时性…

【AIGC使用教程】论文阅读神器 SciSpace 从注册到体验

欢迎关注【AIGC使用教程】 专栏 【AIGC使用教程】论文阅读神器 SciSpace 从注册到体验 【AIGC使用教程】Microsoft Edge/Bing Chat 注册使用完全指南 【AIGC使用教程】GitHub Copilot 免费注册及在 VS Code 中的安装使用 【AIGC使用教程】GitHub Copilot 免费注册及在 PyCharm …

golang第一个简单项目实战+源码(gin+gorm)

创建项目并新建包 点击file->settings->GOPATH,把当前项目加进GOPATH目录中,然后点击apply, 点击加号完成之后,在左边选择go build 新建数据库 编写配置信息 这里将数据的信息都写在了配置文件里面 dns的内容为&#x…

二叉树概念结构,以及画图加代码分析二叉树遍历,创建,销毁,层序遍历,判断是否完全二叉树等等

二叉树 树的概念及结构树的概念树的相关概念树的表示 二叉树的概念及结构概念特殊的二叉树二叉树性质二叉树的存储结构 二叉树的实现二叉树顺序结构的实现二叉树链式结构的实现二叉树的遍历前序遍历中序遍历后序遍历 二叉树结点数量叶子结点数量求树高求k层结点数量 二叉树创建…

SpringMVC第一阶段:SpringMVC的介绍和使用

1、SpringMVC的概述 Spring MVC框架是一个开源的Java平台,为开发强大的基于JavaWeb应用程序提供全面的基础架构支持,并且使用起来非常简单容易。 Spring web MVC框架提供了MVC(模型 - 视图 - 控制器)架构,用于开发灵活和松散耦合的Web应用程…

【原创】创建Vue3 ts项目

文章目录 创建Vue3 ts项目工作空间创建vue 项目进入项目目录启动项目 & 停止项目访问成功 创建Vue3 ts项目 工作空间 进入工作空间目录:D:\workspace\vue 创建vue 项目 vue create vt #创建vt项目vue test 选择手动进行配置: 选中下面几个核心…

利用 Mybatis-Plus 的动态数据源实现多数据源配置

目录 一、导入依赖 二、Application.yaml配置文件 三、切换数据源 四、其他方法 4.1 配置多个数据源 4.2 定义Datasource和EntityManager 4.3 在需要使用数据源的地方注入不同的EntityManager 官网:https://baomidou.com/pages/a61e1b/#dynamic-datasource …

vue2实现路由跳转后隐藏底部固定导航栏Tabber的一种方式

在使用vue路由的时候,跳转到某些页面上是不需要展示底部固定的导航栏的,所以在某些特定的页面跳转时候,就需要隐藏底部的导航栏 这里用了一种方式去解决这个问题 1、前提 这里我把底部导航栏做了一个组件的封装,然后在App.vue里…

玩转 LLMs 之基础设施「利刃出鞘」

LLMs 时代已经到来,这个由 ChatGPT 开始的全球化技术浪潮,所经之处,风起云涌。LLMs 之于当下,更像是 iOS 、Android 之于移动互联网时代。开发者沸腾,投资机构争抢,与赛道相关的基础设施建设自然也成为整个…

IOC容器中的核心容器ApplicationContext

文章目录 1 环境准备2 容器2.1 容器的创建方式2.2 Bean的三种获取方式2.3 容器类层次结构2.4 BeanFactory的使用 前面已经完成bean与依赖注入的相关知识学习,接下来我们主要学习的是IOC容器中的核心容器。 这里所说的核心容器,大家可以把它简单的理解为…

聊聊我在三家IT公司的工作经历,C++程序员都在做什么?

我想分享一些关于C程序员工作的经验。我先自我介绍一下:我是一名毕业于普通985大学的程序员,已经工作了5年,但是我曾在三家互联网公司工作过,这些公司都还算是比较有名的互联网公司。 好了,不多说了,进入正…

真题详解(自顶向下)-软件设计(七十六)

真题详解(传引用)-软件设计(七十五)https://blog.csdn.net/ke1ying/article/details/130695214 计算机软件著作权,正确的是_____。 非法进行拷贝、发布或更改软件的人被称为软件盗版者 循环冗余CRC校验,设数据位为k位…

KVM网络管理-创建桥接网络

KVM网络管理-创建桥接网络 分类 网络: nat isolated 接口: bridge 虚拟交换机: linux-bridge(linux) ovs(open-Vswitch) NAT网络拓扑图 仅主机模式网络拓扑图 桥接模式网络拓扑图 在Linux主机上开启vm1,从交换机上把…

第五章 面向对象-6.内部类

内部类 内部类分为: 成员内部类、静态嵌套类、匿名内部类(直接new 抽象类,直接new 接口)$1 $2。 如果是函数式接口,可以使用lambda表达,这样可以避免new 接口产生内部匿名类 内部类仍然是一个独立的类,在…

接口测试要测试什么?怎么测?我来告诉你

目录 本文主要分为两个部分: 第一部分: 第二部分: 备注: 本文主要分为两个部分: 第一部分:主要从问题出发,引入接口测试的相关内容并与前端测试进行简单对比,总结两者之前的区别与…

SGI STL(四)——_S_chunk_alloc函数解析

情况一&#xff1a;内存池剩余空间的大小不满足需要分配的内存空间 假设调用为 _S_chunk_alloc(8, 20), 即希望分配8个20B的内存小块构成的chunk块 代码如下 template <bool __threads, int __inst> char* __default_alloc_template<__threads, __inst>::_S_chu…

Ansible 自动化运维工具(二)——Ansible 的脚本(playbook 剧本)

文章目录 一、playbooks 概述以及实例操作1、playbooks 的组成2、操作示例一&#xff1a;3、操作实例二&#xff1a;定义、引用变量4、操作示例三&#xff1a;指定远程主机sudo切换用户5、操作示例四&#xff1a;when条件判断6、操作示例:五&#xff1a;迭代 二、playbook的模块…

怎么把视频压缩变小一点,必须收藏的方法

怎么把视频压缩变小一点&#xff1f;我们发现现在视频在工作中的占比也很大的。当我们拍摄了很多视频后&#xff0c;当然是需要进行后续的编辑和传输啦。但是我们发现视频的进行传输的时候最大的问题就是&#xff0c;视频太大导致无法发送或是发送的时间很慢。现今许多平台都对…

5springboot

SpringBoot 1.SpringBoot是什么 我们知道&#xff0c;从 2002 年开始&#xff0c;Spring 一直在飞速的发展&#xff0c;如今已经成为了在Java EE&#xff08;Java Enterprise Edition&#xff09;开发中真正意义上的标准&#xff0c;但是随着技术的发展&#xff0c;Java EE使…