使用CoxTimeVaryingFitter分层后无法获取各层基线生存曲线的问题
解决CoxTimeVaryingFitter分层分析中获取多分层基线生存值的问题
问题原因
CoxTimeVaryingFitter的baseline_survival_默认仅返回参考分层的基线生存数据,而静态CoxPHFitter会自动生成所有分层的结果,这是两类模型实现逻辑的差异导致的。
解决方案
下面提供两种可行方法获取各分层的基线生存值:
方法一:使用predict_survival_function生成各分层基线
构造对应每个分层的基线特征数据(协变量取基线值:连续变量用均值,分类变量用参考水平),通过预测函数直接生成各分层的生存曲线:
import pandas as pd import numpy as np from lifelines.datasets import load_rossi from lifelines.utils import to_episodic_format from lifelines import CoxTimeVaryingFitter # 加载并处理数据 rossi = load_rossi() rossi_long = to_episodic_format(rossi, duration_col='week', event_col='arrest', time_gaps=1.) # 拟合分层模型 ctv = CoxTimeVaryingFitter() ctv.fit(rossi_long, id_col='id', event_col='arrest', start_col='start', stop_col='stop', strata='wexp', formula="bs(age,df=4,lower_bound=10,upper_bound=50)+fin+race+mar+paro+prio") # 构造基线数据:每个分层一行,协变量取基线值 baseline_data = pd.DataFrame({ 'wexp': [0, 1], # 对应两个分层 'age': [rossi['age'].mean()] * 2, 'fin': [0] * 2, # 分类变量取参考水平(0为未获财务支持) 'race': [0] * 2, # 参考水平:白人 'mar': [0] * 2, # 参考水平:未婚 'paro': [0] * 2, # 参考水平:未假释 'prio': [rossi['prio'].mean()] * 2 }) # 生成各分层的基线生存曲线 baseline_survivals = ctv.predict_survival_function(baseline_data) print(baseline_survivals)
方法二:通过模型参数手动计算分层基线生存
分层Cox模型中,各分层的基线生存可通过参考分层的基线生存结合分层系数推导:
- 获取参考分层的基线生存(即
ctv.baseline_survival_) - 提取各分层的系数(
ctv.strata_) - 计算每个分层的基线生存:
S_s(t) = S0(t) ** np.exp(strata_coef)
示例代码:
# 获取参考分层基线生存 baseline_ref = ctv.baseline_survival_ # 获取分层系数 strata_coefs = ctv.strata_ print("分层系数:", strata_coefs) # 计算各分层基线生存 for strata_name, coef in strata_coefs.items(): # 提取分层对应的wexp值 wexp_val = int(strata_name.split('=')[-1]) baseline_strata = baseline_ref ** np.exp(coef) baseline_strata.columns = [f'wexp={wexp_val}'] print(f"wexp={wexp_val}的基线生存:") print(baseline_strata)
适配贷款数据场景
针对你的贷款违约预测需求(按正常、逾期30天、逾期60天分层),只需将上述代码中的wexp替换为你的分层变量(如overdue_status),构造对应三个分层的基线特征数据,即可生成每个分层的基线生存值。
内容的提问来源于stack exchange,提问作者Justin Lallemand
相关产品推荐
相关产品推荐

