python做生存分析

article/2025/10/26 20:56:53

这里跟大家分享一下生存分析,并且介绍一个用python做生存分析的包。

生存分析

应用场景

生存分析最早在生物医学中使用的最多,用来预估某个群体的存活时间,后来被推广到了更广泛的领域。一个做生物的专家可能通常会关心这样一个问题:这个群体的样本能活多久?这个问题我们通常会使用生存分析来回答。 这个群体可以理解为某个国家的人民,或者注射过某种药物的一些病人。

同样也可以推广到更一般的场景,公司的客户流失情况,一个用户开始接受他们的服务可以认为是一个样本的出生,一个客户的离开可以认为是一个样本的死亡。比如我去年办了一张移动电话卡,现在突然不想用了去注销掉了。用户流失情况分析等问题很多电商平台也十分关注。

截断

以样本的出生和死亡为例,我们观测一组样本的生存时间。然而我们观测和追踪他们是需要时间和金钱的成本的,不可能因为样本一直存活着,我们就一直将某个实验做下去。通常,专家只会对一组样本观测一段时间,例如,两年或者两个月。有些样本在观测期间触发了目标事件(death),而有些样本直到实验观测结束也没有触发目标事件,我们称没有触发目标事件的样本有右侧截断。

NOTE: 同样也存在左侧截断和中间截断,我们稍后再说。

一个常见的错误是人们可能在评估目标群体存活时间时会简单的忽略右侧截断,我们首先来看一下这会导致什么问题:

考虑这样一个例子:我们观测的目标人群实际上是来自两个不同的组(可以简单理解为患了不同的病),他们的平均存活时间是不一样的,假定A组的平均存活时间只有两个月,而B组的平均存活时间有十二个月。值得注意的是我们现在是把他们全部放在一起观测的,我们并不知道谁是A组谁是B组,而我们的目的是想知道这些人平均会活多久。 假定我们的实验进行了十个月就结束了。

如果我们只是简单地删除那些发生右侧截断的样本,然后对所有人的生存时间求平均,我们将会严重低估这个群体的生存时间。

如果我们不删除发生右侧截断的样本而直接求平均值,仍然会低估这个群体的平均生存时间,要注意的是,我们只能观测到10时刻之前的事情,10时刻之后的我们并不能看到。

生存分析最初被设计出来的目的就是为了处理存在右侧截断的这种数据的。但是,即使我们的数据不包含右侧截断,生存分析仍然是一个强大有效的工具。

上述例子是为了阐述方便所以让所有的样本的出生从0时刻开始,而实际上这是不必要的,生存分析并不要求所有样本在同一时刻出生,它只关注每个样本从出生到death触发或到实验结束之间的间隔时间,每个样本随时可以出生。

生存函数

我们设T是一个随机变量,它表示一个样本的从出生到死亡所经历的时间。T总是大于0的,有可能是无穷。对一个群体,我们定义生存函数S(t)如下:

S(t)=Pr(T>t)

解释:S(t)描述了这个群体的样本生存时间大于t的概率,换句话说,直到时刻t,我们仍然没有观测到death事件的发生。

它有以下几个性质:

  1. 0\leq S(t) \leq 1 。
  2. F_T(t)=1-S(t)F_T 是随机变量T的累积分布函数。
  3. S(t)是一个单调不增的函数。

S(t)的函数图像可能是下面这个样子:

风险函数

我们同样可能会关心某个样本在t时刻死亡的概率,也就是说,直到t时刻我们都没有观察到该样本的死亡,而在t时刻的一个右邻域观察到该样本死亡。即:

\mathop{lim}\limits_{\delta t\rightarrow 0} Pr(t\leq T\leq t+\delta t |T>t)

由于上述极限随着\delta t的减小而趋于0,我们定义

h(t)=\mathop{lim}\limits_{\delta t\rightarrow 0} \frac{Pr(t\leq T\leq t+\delta t |T>t)}{\delta t}

等价地,有:

h(t)=\frac{-S'(t)}{S(t)}

这是一个变量可分离的微分方程:

z(x)=- \frac{1}{y} \frac{dy}{dx} \Rightarrow z(x)dx= -\frac{1}{y}dy

因此,我们分离变量后,两遍同时取积分,并注意到S(0)=1

可以解得 S(t)=exp(-\int_{0}^{t} h(x)dx)

其中的积分部分有一个更为一般的名称,我们称H(x)=\int_{0}^{t} h(x)dx为累积风险函数。

这张图表示了这些函数之间的关系。

估计生存函数

而我们在实践中是不可能知道真实的生存函数的,只能去对它进行估计。

于是,我们接下来的问题就变成了如何对生存函数进行估计。

接下来就是大家经常听到的Kaplan-Meier Estimate、Nelson-Aalen Estimate等估计方法。

这里以Kaplan-Meier为例:

Kaplan-Meier是一种非参数的估计方法。

简单说一下非参数估计和参数估计

参数估计:我们通过一定的基本假设和建模获得了待估计函数的形式,而有若干控制该函数具体表现的参数。而我们的目的是从形式已知参数未知的模型簇里找出合适的参数。把这个函数当做我们对目标函数的估计。

非参数估计:我们并不对待估计的函数形式做任何假设,而是直接从数据出发去估计它。

优缺点:在数据量较小的时候,参数估计的表现会比较好。而非参数估计会由于数据量有限而无法表现出良好的性能。在数据量充足的时候,非参数估计由于减少了强加给数据的假设而会表现的比参数估计好。通常非参数估计的计算量大于参数估计。

\hat{S(t)}=\prod_{ti<t} \frac{n_i-d_i}{n_i}

t_i是至少有一个终结事件(例如死亡事件)发生了的时间节点,n_i是该时间点上进行随访的样本数,换句话说,是在该时刻有潜在的被观测到死亡可能的人数,d_i是在该时间点实际死亡的人数。

 

后续

由于大多数使用生存分析工具的都是生物信息学的同学和医学等专业的人员,他们通常喜欢使用SPSS和R等工具,而计算机专业相关的同学都喜欢用python,因此下一章将为大家介绍一个简单好用的用于生存分析的python包,方便熟悉python的同学使用。


http://chatgpt.dhexx.cn/article/jGIgp7aT.shtml

相关文章

R语言 生存分析

文章目录 R语言进行生存分析1.下载示例数据2.R语言代码实例详解3.难点解读4.补充&#xff1a;如何用R语言 手动计算生存率 R语言进行生存分析 1.下载示例数据 示例数据连接 2.R语言代码实例详解 #示例数据输入 clinical <- read.table("clinical_clust.txt",h…

TCGA_生存分析

library("survival") library("survminer") 生存分析需要三个 vector&#xff0c;在一个dataframe中&#xff1a; 生存时间&#xff0c;以mouths或者days作单位&#xff1b;结局&#xff0c;"Dead"或者"Alive"&#xff0c;"Ali…

浅谈生存分析

为什么要用生存分析&#xff1f; 相信大家对于生存分析这一概念已有相当多的了解&#xff0c;但在进行相关操作前&#xff0c;是否思考过为何要使用生存分析&#xff1f; 小编将通过一个事例进行说明&#xff1a;考虑研究对象为某一患病群体&#xff0c;将该群体分为两组&…

R数据分析:生存分析与有竞争事件的生存分析的做法和解释

今天被粉丝发的文章给难住了&#xff0c;又偷偷去学习了一下竞争风险模型&#xff0c;想起之前写的关于竞争风险模型的做法&#xff0c;真的都是皮毛哟&#xff0c;大家见笑了。想着就顺便把所有的生存分析的知识和R语言的做法和论文报告方法都给大家梳理一遍。 什么时候用生存…

php 生存分析,HPA数据库08.做生存分析

生信论文的套路 ONCOMINE从全景、亚型两个维度做表达差异分析&#xff1b; 临床标本从蛋白水平确认(或HPA数据库)&#xff0c;很重要&#xff1b; Kaplan-Meier Plotter从临床意义的角度阐明其重要性&#xff1b; cBio-portal数据库做基因组学的分析(机制一)&#xff1b; STRIN…

生存分析(2)

接上篇文章生存分析&#xff08;1&#xff09;&#xff0c;本文将进一步介绍生存分析中有关生存率的具体算法及其应用 Kaplan-Meier法&#xff08;K-M法、乘积极限法&#xff09; Kaplan-Meier法由Kaplan和Meier于1958年提出&#xff0c;直接用概率乘法定理估计生存率&#x…

生物统计分析之生存分析

简介 生存分析(Survival analysis)是指根据试验或调查得到的数据对生物或人的生存时间进行分析和推断&#xff0c;研究生存时间和结局与众多影响因素间关系及其程度大小的方法&#xff0c;也称生存率分析或存活率分析。临床医学数据生存分析是将临床医学中事件的现象与结果&am…

生存分析研究

生存分析 生存分析基础知识生存分析生存数据生存函数1.描述性 生存分析方法生存分析统计方法非参数方法半参数方法参数方法 生存分析机器学习模型 生存分析研究的内容1.描述生存过程2.比较生存过程3.分析危险因素4.建立数学模型 研究思路1.数据2.模型设计3.实验部分&#xff08…

生存分析

1 KM法计算生存率——非参数模型2 log-rank秩检验比较不同组的生存率2.1 输入数据2.2 建立假设2.3 log-rank秩精确性检验2.4 可视化 1 KM法计算生存率——非参数模型 乘积极限法适用于离散数据&#xff0c;它用于建立时刻 t t t 上的生存函数&#xff0c;根据 t t t 时刻之前…

8.常用统计分析方法——生存分析

目录 生存分析基本概念 生存率估计 1. 乘积极限法 2. 寿命表法 3. 生存曲线 生存曲线比较 COX比例风险回归模型 1. 建立COX回归模型 2. 比例风险假定的检验 3. 生存预测 生存分析基本概念 logistic回归中因变量是终点事件发生与否&#xff0c;而生存分析则关注的是终…

生存分析(1)

一、基本概念和名词解释 1.生存分析&#xff08;survival analysis&#xff09; 是研究生存现象和响应时间数据及其统计规律的一门学科。 是将事件的结果&#xff08;终点事件&#xff09;和出现这一结果所经历的时间结合起来分析的一种统计分析方法。 生存分析与其他多因素…

什么是生存分析(survival analysis)?

什么是生存分析(survival analysis)? 用来研究生存时间的分布规律以及生存时间和相关因索之间关系的一种统计分析方法 基本概念 失效事件(Failure Event):常被简称为事件,研究者规定的终点结局,医学研究中可以是患者死亡,也可以是疾病的发生、某种治疗的反应、疾病的…

生存分析原理简明教程 单因素生存分析 Kaplan-Meier、LogRank 只能针对单一的变量进行 多因素cox回归分析

一、生存分析 狭义上来说&#xff0c;生存分析用来分析病人的生存和死亡情况。广义上讲的是事件是否发生。在这里就用是否死亡来代替。一般来说&#xff0c;生存的数据一般有两个变量&#xff0c;一个事件是否发生&#xff0c;病人是否死亡&#xff0c;死亡为1&#xff0c;未死…

IRIS 2021 技术文档 First Look 25 -- 数据库加密

本文档向您介绍 InterSystems IRIS数据平台如何处理数据库加密&#xff0c;这是所有企业安全战略的重要组成部分。 本文档介绍了数据库加密的情况&#xff0c;并引导您完成一些与创建加密数据库有关的初始任务。一旦您完成了本指南&#xff0c;您将创建一个密钥文件&#xff0c…

开始使用了

开始了 今天开始用,请大家指教 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown…

Oracle LiveLabs实验:DB Security - Key Vault

概述 此实验关于Oracle Key Vault。 此实验申请地址在这里&#xff0c;时间为55分钟。 实验帮助在这里。 实验生成需要15分钟左右&#xff0c;最终会生成2个虚机&#xff0c;以下为我的专属配置&#xff1a; 129.146.74.138 DBSEC-LAB &#xff08;数据库主机&#xff09;…

idea 启动项目找不到程序包,提示程序包不存在

我是一个父子工程项目,项目在编译,build,rebuild的时候都没用报错,但用idea启动的时候就报错 error:找不到该程序包.或者类… 在网上找了很多方法都没有解决:reimport maven ,rebuild 都不行 .maven实际是完整的,本地也有这个jar包. 现在我在网上找了几种解决方法: 1.是因为id…

docker-compose vmwkmip

vSphere 6.5 中引入了许多 vSphere 安全增强功能,包括备受期待的虚拟机加密功能。为了能够使用新的虚拟机加密功能,您需要先设置一个 密钥管理互操作性协议 (KMIP)服务器(如果您还没有)并将其与您的 vCenter Server 相关联。有很多 3rd 方供应商提供与新的 VM 加密功能互操…

运维实战:Xtrabackup备份与还原

目录 运维实战&#xff1a;percona-xtrabackup备份与还原 一、工作原理 二、版本区别 三、Xtrabckup特点及限制 3.1 特点 3.2 限制 四、xtrabckup安装&#xff08;mariadb5.5 xtrabckup 2.4&#xff09; 4.1 rpm安装xtrabackup 4.2 xtrabackup的rpm包含哪些内容 4.2…

FileNotFoundException: jdcbc.properties (系统找不到指定的文件) 该问题的解决方法

一般遇到这种问题都是我们将properties文件创建在模块下面了, 这时候,由于默认访问路径在项目下面, 所以此时我们应该加上当前模块的路径, 即可解决这个问题