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

如何获取lifelines库风险函数数据并检测局部极大值点

风险函数局部极大值检测解决方案

你可以直接通过NelsonAalenFitter内置接口获取风险函数的数值结果,无需依赖绘图接口返回值,具体实现逻辑如下:
plot_hazard方法内部实际是调用smoothed_hazard()方法计算平滑后的风险值再完成绘图,你可以直接调用该方法拿到数值,再传入scipy的峰值检测接口即可。

完整实现代码

import numpy as np
from scipy.signal import find_peaks

# 原有拟合、绘图逻辑保持不变
fig, (ax1, ax2, ax3) = plt.subplots(1, 3,figsize=(18,8))

km.fit(duration, event_observed = event)
kap = km.plot_survival_function(ax=ax1,legend="")
kap.set_title("Kaplan-Meier",fontsize=15)

na.fit(duration, event_observed = event)

na1 = na.plot_cumulative_hazard(ax=ax2,legend="",color="green")
na1.set_title("Cumulative Hazard",fontsize=15)

bandwidth = 5
na2 = na.plot_hazard(ax=ax3,xlim=(0,200),ylim=(0,0.03),bandwidth=bandwidth,color="orange",legend="")
na2.set_title("Hazard Function",fontsize=15)
ax3.set_xlabel('timeline',fontsize = 10)
plt.grid(linestyle="-.", color='grey')

# ========== 新增峰值检测逻辑 ==========
# 构造0-200的时间序列,步长可根据需求调整
timeline = np.arange(0, 201, 1)
# 计算对应时间点的平滑风险值,带宽参数和绘图保持一致
hazard_values = na.smoothed_hazard(times=timeline, bandwidth=bandwidth)
# 峰值检测,可调整height、distance、prominence等参数过滤无效峰值
peaks_idx, properties = find_peaks(hazard_values, height=0.005, distance=10)
# 提取峰值对应的时间点和风险值
peak_times = timeline[peaks_idx]
peak_hazards = hazard_values[peaks_idx]

# 可选操作:将检测到的峰值标注到风险函数图上验证结果
ax3.scatter(peak_times, peak_hazards, color='red', s=50, zorder=10, label='检测到的峰值')
ax3.legend()

# 输出峰值结果
print("检测到的局部极大值时间点:", peak_times)
print("对应风险值:", peak_hazards)

补充说明

  • 上述方法获取的风险值和plot_hazard绘图使用的数据源完全一致,检测到的峰值和你标注的目标位置匹配。
  • 若你需要使用非平滑的原始风险值,可以直接调用na.hazard_获取,索引对应事件发生的时间点。
  • 除了直接调用内置方法外,也可以从绘图结果中提取数值,代码如下,但该方法可靠性更低,若设置了xlim截断会仅能拿到截断区间内的数值:
# 从绘图的线对象中提取数值
line = ax3.lines[0]
timeline = line.get_xdata()
hazard_values = line.get_ydata()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:54:03