lifelines/scikit-survival:计算预期时间

问题描述 投票:0回答:1

我试图了解如何计算数据集中每个 id 的预期时间。我有一个看起来像数据框形状 (500,4) 的数据集:

ids var1       var2  churn     time
0   1.738434    324    0       21.0
1   1.541176    12     0       4.0
2   2.049281    753    1       5.0
3   1.929860    563    0       16.0
4   1.595027    22     0       5.0
... ... ... ... ...

让我们使用

lifelines
或通过获取每个 ID 的生存函数
predict_expectation
来计算期望值。

第 1 部分:计算预期值

median

对于 scikit-survival 是使用 

cph = CoxPHFitter() cph.fit(data,"time","churn") censored_df = data[data["churn"]==0] cph.predict_expectation(censored_df) #conditional_after=censored_df["time"]) #or cph.predict_median(censored_df) #conditional_after=censored_df["time"])

 计算的
一致性指数 = 0.82

第 2 部分:将结果与实际情况进行比较

所以现在我使用两种方法创建了一个表:

predict_survival_function()

(“预期”列)和

predict_expectation()
(“中值”列),如下所示:

对于 scikit-survival 只能通过取中位数来计算

(请注意,我知道生命线\scikit-learn中的其他算法可能会有所不同,但请重点关注这个想法) predict_median

带有“diff”的列表示相应预测列与“时间”之间的差异

问题

    为什么预计时间这么差?
  1. 做法有什么问题吗?我应该在整个数据(审查+未经审查)中进行预测还是仅使用审查数据进行预测? (我已经尝试了三种可能的排列,仅经过审查,仅未经审查,两者皆有,但仍然关闭)。我的理解是,如果每个 ID 的生存曲线收敛到 0(未经审查的数据),您可以使用曲线下面积进行计算,如果经过审查,则需要使用生存曲线的中位数。 (我已经记住了上面的计算)
  2. 我怎样才能获得更接近的估计?
  3. 如果运行实验并仅在未经审查的数据上拟合模型,然后对相同的未经审查的数据进行预测,您应该得到非常接近的估计,对吧?嗯,事实并非如此。您应该能够通过从预期中位数取平均值来检查这一点,它应该与实际值的中位数类似,对吧?或者您可以检查“diff”列的平均值,看看它是否至少平均值为 0,但事实并非如此,这表明模型中存在一些潜在偏差
  4. 为什么
  5. ids churn time expected diff_expectation median diff_median 0 0 21.0 21.526222 0.526222 8.0 -13.0 1 0 4.0 21.819911 17.819911 13.0 9.0 3 0 16.0 23.189344 7.189344 9.0 -7.0 4 0 5.0 22.090598 17.090598 12.0 7.0 6 0 8.0 21.545022 13.545022 10.0 2.0 ... ... ... ... ... ... ...

    输出的内容与

    predict_expectation
    不同?更推荐使用哪一款?
    
    

  6. 这种现象发生在任何数据集上,您可以尝试使用
predict_median

数据集复制此示例,即使您的一致性指数为 0.9,这种情况仍然会发生。

这里有一些我发现的资源可以解释这一点,但我并不完全理解它,如果有人可以进一步分解它,那就太好了。

来源

    https://github.com/sebp/scikit-survival/issues/94
  1. https://github.com/sebp/scikit-survival/issues/190
  2. https://scikit-survival.readthedocs.io/en/latest/user_guide/understanding_predictions.html
  3. https://lifelines.readthedocs.io/en/latest/fitters/regression/CoxPHFitter.html#lifelines.fitters.coxph_fitter.CoxPHFitter.predict_expectation

您可以在这里找到完整编码的示例:https://github.com/felipe0216/survival_examples/blob/main/predict_expectation_scikit.py

python survival-analysis cox-regression survival lifelines
1个回答
0
投票
这篇文章

给出了一个很好的解释,作为预测生存时间的一种方式,期望值和中值之间的差异。 基本上,只有当您处理的数据最终达到生存概率

from lifelines.datasets import load_leukemia

时,期望才是一个好的预测,因为如果没有达到,期望(根据线下面积计算)将是无穷大。

在这种情况下,中位数(概率跨越 0.5 的时间)会更合适。
然而,有时我们的数据可能永远达不到 

S(t)=0

所以我认为答案是视情况而定。

© www.soinside.com 2019 - 2024. All rights reserved.