数据分析系列:生存分析(生存曲线分析、Cox回归分析)——附生存分析python代码。

article/2025/8/28 9:05:03

上一篇文章写了数据分析系列:归因分析原理、案例和python代码。但是现实中用户所归属的渠道可能很多,比如用户在网上商城的首页点击了一个产品,又在其他公众号的相关推荐点击了此产品,在所有转化用户中,每个渠道的贡献率是多大?这就是归因分析中的多渠道归因。

对于多渠道归因,有一些启发式的归因方法,比如“最终点击”(将订单归属于最后一个渠道)、“非最终点击”(归属于倒数第二个渠道)、“首次点击”(第一次点击)、“线性衰减”(时间越远权重越小)、“线性平均”(各经历渠道权重相同)、“根据位置”(自己定义每个位置权重),可参考Google Analysis

上面的启发式归因,需要人为定义渠道归属或每个位置的权重,在大多数情况,当合理根据业务定义归属时,得出的结果是合理的,也是使用最多的方法。但是却避免不了存在主观性的缺点。**还有一个是根据算法归因的方式,包括使用逻辑回归、生存分析中的cox回归,马尔科夫链等。

其中逻辑回归和生存分析的多渠道归因大致方法是,求出回归中对应每个渠道前的系数 β i β_i βi,再根据 β i β_i βi求出对应的odd ratios: e x p ( β i ) exp(β_i) exp(βi)(cox回归可以直接求出RR),再根据前一篇数据分析系列:归因分析原理、案例和python代码相关的公式求出每个渠道的PAF。

马尔科夫链的大致计算方式是:计算每个渠道之间以及最初/终状态(start、转化、未转化)之间的状态转移概率矩阵,再每次去掉其中一个渠道,计算其移除效应,再对每个渠道的移除效应进行标准化,最终的得到就是这个渠道的贡献大小。

逻辑回归不用多说了,到处都在用。网上的生存分析大多是使用R或者SPSS。本文主要使用python进行生存分析。

生存分析的理论很多,本文不涉及,推荐写的很好的生存分析系列文章生存分析简介。写的非常清晰,本人也是在长时间不使用后,看着这个系列的文章才慢慢回想起来。

在python中,生存分析的包是lifelines,可以利用lifelines进行累计生存曲线的绘制、Log Rank test、Cox回归等。

一、绘制S(t)

先使用自带的数据集

from lifelines.datasets import load_waltons
from lifelines import KaplanMeierFitter
from lifelines.utils import median_survival_timesdf = load_waltons()
print(df.head(),'\n')
print(df['T'].min(), df['T'].max(),'\n')
print(df['E'].value_counts(),'\n')
print(df['group'].value_counts(),'\n')

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

利用此数据取拟合拟生存分析中的Kaplan Meier模型(专用于估计生存函数的模型),并绘制全体人群的生存曲线。

kmf = KaplanMeierFitter()
kmf.fit(df['T'], event_observed=df['E'])kmf.plot_survival_function()median_ = kmf.median_survival_time_
median_confidence_interval_ = median_survival_times(kmf.confidence_interval_)
print(median_confidence_interval_)

在这里插入图片描述
图中蓝色实线为生存曲线,浅蓝色带代表了95%置信区间。随着时间增加,存活概率S(t)越来越小,这是一定的,同时S(t)=0.5时,t的95%置信区间为[53, 58]。这并不是我们关注的重点,我们真正要关注的实验组(存在病毒)和对照组(未存在病毒)的生存曲线差异。因此我们要按照group等于“miR-137”和“control”分组,分别观察对应的生存曲线:

groups = df['group']
ix = (groups == 'miR-137')kmf.fit(df['T'][ix], df['E'][ix], label='miR-137')
ax = kmf.plot()
treatment_median_confidence_interval_ = median_survival_times(kmf.confidence_interval_)
print("带有miR-137病毒存活50%对应的存活时间95%置信区间:'\n'", treatment_median_confidence_interval_, '\n')kmf.fit(df['T'][~ix], df['E'][~ix], label='control')
#共享一个画布
ax = kmf.plot(ax=ax)control_median_confidence_interval_ = median_survival_times(kmf.confidence_interval_)
print("未带有miR-137病毒存活50%对应的存活时间95%置信区间:'\n'", control_median_confidence_interval_)

在这里插入图片描述
可以看到,带有miR-137病毒的生存曲线在control组下方。说明其平均存活时间明显小于control组。同时带有miR-137病毒存活50%对应的存活时间95%置信区间为[19,29],对应的control组为[56,60]。差异较大,这个方法可以应用在分析用户流失等场景,比如我们对一组人群实行了一些防止流行活动,我们可以通过此种方式分析我们活动是否有效。

二、Cox回归

通常存活时间与多种因素都存在关联,因此我们的面临的数据是多维的。下面使用一个更复杂的数据集。

from lifelines.datasets import load_regression_dataset
from lifelines import CoxPHFitterregression_dataset = load_regression_dataset()print(regression_dataset.head())
print(regression_dataset['E'].value_counts())

在这里插入图片描述
其中T代表min(T, C),其中T为死亡时间,C为观测截止时间。E代表是否观察到“死亡”,1代表观测到了,0代表未观测到,即生存分析中的**“删失”**数据,删失数据共11个。var1,var2,var3代表了我们关系的变量,可以是是否为实验组的虚拟变量,可以是一个用户的渠道路径,也可以是用户自身的属性

我们利用此数据进行Cox回归

cph = CoxPHFitter()
cph.fit(regression_dataset, 'T', event_col='E')
cph.print_summary()

在这里插入图片描述
结果分析:从结果来看,我们认为var1和var3在5%的显著性水平下是显著的。认为var1水平越高,用户的风险函数值越大,即存活时间越短(cox回归是对风险函数建模,这与死亡加速模型刚好相反,死亡加速模型是对存活时间建模,两个模型的参数符号相反)。同理,var3水平越高,用户的风险函数值越大。

我们看到结果中第二列为exp(coef),我们还可以利用这个数字代替RR值,带入PAF的计算公式进行归因分析。请参考我的另一篇博客数据分析系列:归因分析原理、案例和python代码
在这里插入图片描述


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

相关文章

SPSS详细操作:生存资料的Cox回归分析

SPSS详细操作:生存资料的Cox回归分析 一、问题与数据 某研究者拟观察某新药的抗肿瘤效果,将70名肺癌患者随机分为两组,分别采用该新药和常规药物进行治疗,观察两组肺癌患者的生存情况,共随访2年。研究以死亡为结局,两种治疗方式为主要研究因素,同时考虑调整年龄和性别的…

如何才能做Cox呢?今天带来Cox回归分析步骤详解

Cox回归是生存分析中运用最多的一个模型,又称为比例风险回归模型(proportional hazards model)。是由英国统计学家D.R.Cox在1962年提出的,为了表示对他的尊敬,所以大家以他的名字命名这个模型。这是一种半参数回归模型,以结局和生…

R语言与临床模型预测——LASSO回归,单因素多因素cox,差异表达分析,Venn图,森林图,列线图,矫正曲线,ROC全套代码及解析——第五部分 批量cox回归分析 本专栏可免费答疑

上次我们将自噬相关基因的表达数据与临床数据进行了匹配,下面我们进行批量cox回归分析,筛选出预后相关的自噬基因: 这个临床模型预测会针对一个案例进行讲解,目录如下: 1.下载数据 2. 匹配基因 3. 基因去重复 4.匹配临床数据 5.批量cox回归分析 6.差异表达基因筛选 …

Cox与KM生存分析及结果解读 不同的生存分析方法 单因素和多因素生存分析的比较km cox回归分析差异 生存分析结果详解 结果解读 参数详细解释 全因死亡率

生存分析KM法与Cox法异同介绍 KM 方法即Kaplan-Meier survival estimate是一种无参数方法(non-parametric)来从观察的生存时间来估计生存概率的方法。KM生存分析模型,是单变量分析(univariable analysis),在做单变量分析时,**模型只描述了该单…

咋筛选变量进入多因素回归 纳入变量 变量选择 类似机器学习的特征选择 cox回归分析cox多因素

在前期推送的内容中,我们介绍了构建多因素回归模型,探讨对结局指标有独立作用的影响因素,就好比侦探破案找出真凶的过程。我们作为研究人员,就像是一名侦探,通过统计学方法及专业知识,在众多的嫌疑人中一一…

(生物信息学)R语言与统计学入门(九)—— 单因素cox回归分析

## 近期将推出 ​​​​​​​苦逼医学生R语言入门;R语言与高级统计学 付费专栏,感谢大家支持 ##​​​​​​​ COX回归模型,又称“比例风险回归模型(proportional hazards model,简称Cox模型)”,是由英国统计学家D.R.Cox(1972)年…

(生物信息学)R语言与统计学入门(十)—— 多因素Cox回归分析

## 近期将推出 医学生R语言入门课;R语言与高级统计学 付费专栏,感谢大家支持 ## 上次提到单因素cox回归分析: (生物信息学)R语言与统计学入门(九)—— 单因素cox回归分析_Lijingxian教你学生信的博客-CSD…

SPSS如何进行Cox回归分析操作

问题与数据 某研究者拟观察某新药的抗肿瘤效果,将70名肺癌患者随机分为两组,分别采用该新药和常规药物进行治疗,观察两组肺癌患者的生存情况,共随访2年。研究以死亡为结局,两种治疗方式为主要研究因素,同时…

R语言生存分析:Cox回归

上次介绍了生存分析中的寿命表、K-M曲线、logrank检验、最佳切点的寻找等,本次主要介绍Cox回归。 本推文不涉及理论,只有实操,想要了解生存分析的理论的请自行学习。 Cox回归 使用survival包中的lung数据集用于演示,这是一份关…

SPSS教学—Cox回归模型探索多因素对生存期的影响

Cox回归模型又称为比例风险回归模型,该模型以生存结局和生存时间作为因变量,进而分析众多因素对生存期的影响,是一个典型的多因素分析方法。 SPSS中就带有Cox回归模型方法,本节将带大家进行深入的了解与探索,话不多说…

oracle dump enq hw,等待事件enq:HW–contention说明及解决方法

一、今天在查看awr报告中,发现Top 5 Timed Foreground Events发现enq: HW - contention的等待事件; 二、enq: HW - contention的官方说明: The HW enqueue is used to serialize the allocation of space beyond the high water mark of a se…

关于enq: TX - allocate ITL entry的问题分析

今天发现系统在下午1点左右的时候负载比较高,就抓取了一个最新的awr报告. Snap Id Snap Time Sessions Cursors/Session Begin Snap: 20892 26-Nov-14 13:20:17 3623 5.4 End Snap: 20893 26-Nov-14 13:30:17 3602 5.4 Elapsed: 10.01 (mins) DB Time…

enq: TX - index contention

解决方案:alter system set “_lm_drm_disable”5 sid’*’;(重启库)

oracle enq: tm,Tuning enq: TM – contention with foreign key (外键引起的队列)

TM – Enqueue contention 与Table Manipulation相关的入队争用,可以在使用需要锁定表的重组活动显式锁定表时看到。 ID1 ID2的含义 ID1 : 0(LGWR) or object_number, 即DBA_OBJECTS.OBJECT_ID ID2: 0 for a normal table / partition lock ; 1 for…

Oracle-enq: TX - row lock contention 等待事件分析

什么是enq:TX - row lock contention等待: 等待事件enq:TX - row lock contention 是Oracle常见的几大等待事件之一,在开启的事务中,为了维护事务数据的一致性,会在事务所涉及的修改行中添加TX锁以防止其他会话同时修改数据,当其他会话等待该…

Oracle死锁问题: enq: TX - row lock contention

前言 这篇文章也是记录近期遇到的问题以及从中学到的知识 ,近期一直在救火,有些问题自认为还是挺有代表性的,有兴趣的话再继续向下看 问题现象 线上反馈,执行批量处理EXCEL数据时,系统一直卡在进度滚动条界面。处理任务…

oracle dump enq hw,enq:HW–contention 故障处理

enq: HW - contention 说明: 硬件队列用于序列化段的高水位线以外的空间分配。 可以用手动分配范围即可解决问题。 V$SESSION_WAIT,P2 / V$LOCK.ID1 is the tablespace number. V$SESSION_WAIT.P3 / V$LOCK.ID2 is the relative data block address (dba) of segmen…

oracle enq ta,Oracle 的 enq: TT - contention 等待事件

Oracle 的 enq: TT - contention 等待事件 在遇到 TT 锁等待时,你可能会被Oracle的文档所困扰。即便是在Oracle Database 12c的文档中,关于TT锁的描述也是:Temporary table enqueue。 这其实已经不准确了,从数据库中可以得到更详细和准确的描述,V$LOCK_TYPE中有着准确记录…

oracle enq ta,enq: TA – contention 等待事件

enq: TA – contention 等待事件 This enqueue is used when undo tablespace operations are being performed. Some examples of such operations are: When dropping an undo tablespace we acquire the enqueue in exclsuive mode to stop other sessions using the undo t…

关于AQS中的enq方法的理解

自己太笨了,总感觉有点绕,就整理下吧~ private Node enq(final Node node) {//自旋锁for (;;) {//tail默认就是nullNode t tail;if (t null) { // Must initialize//因为tail默认是null,所以首次一定会进来//compareAndSetHead在下面//也就…