原文:
www.kdnuggets.com/2020/07/guide-survival-analysis-python-part-2.html
评论
由 Pratik Shukla,有志的机器学习工程师。
在 这一三部分系列的第一篇文章中,我们了解了 Kaplan-Meier 估计器的基础知识。现在,是时候实现我们在第一部分讨论的理论了。
1. 谷歌网络安全证书 - 快速入门网络安全职业。
2. 谷歌数据分析专业证书 - 提升你的数据分析技能
3. 谷歌 IT 支持专业证书 - 支持你组织的 IT
让我们编写代码:
(1) 导入所需的库:
(2) 读取数据集:
(3) 数据集的列:
(4) 数据集的附加信息:
这提供了有关数据类型和每列中具有空值的行数的信息。对于生存分析中的某些方法,去除具有空值的行非常重要。
(5) 数据集的统计信息:
这提供了一些统计信息,如总行数、均值、标准差、最小值、第 25 百分位数、第 50 百分位数、第 75 百分位数和每列的最大值。
(6) 使用直方图查看性别分布:
这让我们对数据的分布有一个总体了解。在下面的图表中,你可以看到大约有 139 个值的状态为 1,大约 90 个值的状态为 2。这意味着在我们的数据集中,有 139 名男性和约 90 名女性。
(7) 为 KaplanMeierFitter 创建对象:
(8) 组织数据:
现在我们需要组织数据。我们将在数据集中添加一个名为“dead”的新列。它存储有关实验中人员是否生存的数据(基于状态值)。如果我们的状态值为 1,则该人活着;如果状态值为 2,则该人已死。这是我们在下一步需要做的非常关键的一步。因为我们将把数据存储在名为 censored 和 observed 的列中。观察数据存储特定时间线中死者的值,而 censored 数据存储活人或我们在该时间点不会调查的人的值。
(9) 将数据拟合到对象中:
我们的目标是找到患者在死亡前存活的天数。因此,我们感兴趣的事件将是“死亡”,它存储在“dead”列中。它接受的第一个参数是我们实验的时间线。
(10) 事件表:
kmf对象的一个最重要的方法是“event_table”。它为我们提供了适配数据的各种信息。让我们逐列查看。
(1) 事件时间: 存储数据集中时间线的值,即患者在实验中被观察到的时间或实验进行的时间。可以是分钟、天、月、年等。在我们的案例中,它将是天数。它基本上存储患者的生存天数。
(2) 风险中: 存储当前患者的数量。一开始,它将是我们在实验中要观察的总患者数。如果在某个时间点新增患者,我们需要相应地增加它的值。基本上,我们可以这样说:
at_risk = 当前患者 at_risk + 入口 — 移除
(3) 入口: 存储特定时间线中新患者的值。在我们有其他患者时,也可能有一些新患者被诊断出癌症。因此我们将其添加在这里。
(4) 审查: 我们的终极目标是找到患者的生存概率。如果在特定时间线上,实验中的人仍然活着,则该人进入审查类别。如果我们没有关于患者死亡时间的信息,则将其添加到审查数据中。其他可能性是如果患者选择搬到另一个无法进行实验的城镇,我们将该患者添加到审查类别中。
(5) 观察到: 实验期间死亡的患者数量。
(6) 移除: 存储不再参与实验的患者的值。如果一个人死亡或被审查,则他们属于这一类别。简而言之,
移除 = 观察 + 审查
(11) 计算单个时间线的生存概率:
我们将使用以下公式手动计算:
(12) Event_At_5:
(13) Event_At_11:
现在我们在这里找到的是某一特定时间段的概率。我们想要的是患者在整个时间段内的概率,即患者在所有实验回合中存活的概率。
这似乎很令人困惑,对吗?
让我们用一个非常简单的例子来理解条件概率的概念。
假设我们在一个不透明的盒子里总共有 15 个球。在这 15 个球中,有 7 个黑球、5 个红球和 3 个绿球。这是一个图示视图。
现在让我们找出一些概率吧!
选择红球的概率:
注意,我们总共有 15 个球中的 5 个是红球。
选择第二个红球的概率:
由于我们已经移除了一个红球,因此我们剩下的红球总数是 4,总球数是 14。
现在我的意思是:如果我们想找出两个选中的球都是红色的概率。这就是我们的情况。比如我们想找出一个患者在第一次时间区间存活的情况下,第二次时间区间存活的概率。我的意思是我们不仅仅想找出第二个时间区间的概率,我们想要的是他们在这个时间段内存活的总概率。
在这种情况下,我们想找出选中的两个球都是红色的概率是多少?
两个红球的概率。
在这里,我们的目标是找出这个人整个时间线上的概率。比如他们在第一次、第二次和第三次时间线中存活,那么他们的生存概率将是:
回到我们的主要示例:
(14) Surv_After_probability:
我们想找出一个患者到目前为止存活的概率。现在我们需要找出患者的实际生存概率。
(15) Predict function:
现在,kmf对象的预测函数会为我们完成所有这些工作。但了解其背后的逻辑总是好的。
(16) Finding survival probability for an array of the timeline:
我们可以找到一系列时间的概率。
(17)获取整个时间线的生存概率:
kmf 对象的 survival_function_ 提供了我们时间线的完整数据。
解释:
在时间线 0 时,患者的生存概率为 1。如果你仔细考虑,就会明白在诊断后的第 1 天一个人死亡的概率几乎为 0。因此,我们可以说生存概率尽可能高。随着时间线的增加,患者的生存概率会降低。
(18)中位数:
它提供了在平均情况下,50% 的患者存活的天数。
从上述代码中,我们可以说,平均来说,一个人在诊断后的 310 天后生存。
(19)绘制图表:
在这里,我们可以绘制生存概率的图表。
(20)置信区间:
置信区间给出了我们较为确定的真实值所在的范围。你可以在上面的图表中看到,浅蓝色阴影表示生存的置信区间。从中我们可以说该时间线上的概率确实位于该置信区间之间。
现在我们掌握的所有信息都是关于一个人的生存。现在我们将查看某个时间线上的人死亡的概率。在这里要注意,高生存概率对一个人来说是好的,但更高的累积分布密度(死亡概率)则不那么好!
(21)一个人死亡的概率:
在这里注意到,分母值是时间 (t) 之前的风险对象。简单来说,我们可以说前一行的对象 at_risk。
累积分布密度的公式:
累积分布密度。
手动计算概率:
t = 0
t = 5
t = 11
查找累积分布密度:
(22)绘制图表:
注意到,随着生存天数的增加,死亡概率也增加。
风险函数:
生存函数是总结和可视化生存数据集的好方法。然而,这并不是唯一的方法。如果我们对一个人群的危险函数 h(t) 感到好奇,不幸的是,我们不能转化 Kaplan-Meier 估计。为此,我们使用 Nelson-Aalen 危险函数:
危险函数
其中,
di = 时间 ti 的死亡人数
ni = 开始时的患者数量。
(23) 导入库:
(24) 拟合数据:
(25) 累积危险度:
请记住我们考虑当前行的 at_risk:
(26) 绘制数据:
累积危险度不如生存函数那么直观易懂,但危险函数是更高级生存分析技术的基础。
(27) 预测一个值:
综合起来:
在下一篇文章中,我们将讨论对数秩检验和 Cox 回归,并提供示例。
原始。已获许可转载。
简介: Pratik Shukla 是一位有抱负的机器学习工程师,喜欢将复杂理论以简单的方式呈现。Pratik 在计算机科学专业完成了本科,并正在南加州大学攻读计算机科学硕士学位。 “向月亮射击。即使错过,你也会落在星星之间。 -- Les Brown”
相关: