You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中基于lifelines的CoxPH模型样条回归实现咨询

嘿,你说的这个需求其实在Python里完全能实现,而且你正在用的lifelines库本身就支持,不用找别的工具啦!我给你整理几个可行的方案:

一、用lifelines配合样条特征实现CoxPH样条回归

lifelines本身没有直接封装“一键样条CoxPH”的方法,但可以通过生成样条特征再喂给CoxPHFitter来实现,这也是最贴合你现有工作流的方式:

  1. 先导入依赖库:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from lifelines import CoxPHFitter
from patsy import bs  # patsy是lifelines常用的特征转换工具,一般会随lifelines安装
  1. 处理你的连续变量,生成样条特征:
    假设你的数据集df里有生存时间time、事件状态event,以及需要做样条回归的连续变量age(举个例子),我们用三次样条(自由度设为3)来转换:
# 生成样条特征,df=3表示三次样条,你可以根据数据调整自由度
df['age_spline'] = bs(df['age'], df=3)
  1. 拟合CoxPH模型并可视化效果:
# 拟合模型
cph = CoxPHFitter().fit(df, duration_col='time', event_col='event')

# 生成连续的变量值用于绘图
age_range = np.linspace(df['age'].min(), df['age'].max(), 100)
new_data = pd.DataFrame({'age': age_range})
new_data['age_spline'] = bs(new_data['age'], df=3)

# 预测风险比(HR)并绘图
hazard_ratios = cph.predict_hazard_ratios(new_data)
plt.plot(age_range, hazard_ratios)
plt.xlabel('Age')
plt.ylabel('Hazard Ratio (vs reference)')
plt.title('Spline Regression Effect on Hazard Ratio')
plt.show()

这样就能得到和你示例图类似的、展示连续变量非线性效应的曲线了。

二、用statsmodels实现CoxPH样条回归

如果你愿意尝试另一个库,statsmodels的CoxPH实现支持直接在公式里嵌入样条转换,写法更简洁:

import statsmodels.api as sm
from statsmodels.formula.api import coxph
from patsy import bs

# 直接在公式中定义样条项
model = coxph("Surv(time, event) ~ bs(age, df=3)", data=df)
result = model.fit()

# 同样可以提取结果并绘图,逻辑和lifelines类似
三、额外提示:自由度的选择

样条的自由度(df参数)决定了曲线的平滑程度:自由度越高,曲线越灵活,但也更容易过拟合。一般建议从3-5开始尝试,根据数据分布和模型拟合效果调整。

内容的提问来源于stack exchange,提问作者Tran Tran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 08:18:11