如何获取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
相关产品推荐
相关产品推荐

