from lifelines import NelsonAalenFitter # 导入Nelson-Aalen累积风险估计器
company_survival_data['leverage_group'] = pd.cut( # 按杠杆率分组
company_survival_data['Initial_Leverage'], # 杠杆率变量
bins=[0, 0.3, 0.6, float('inf')], # 分组边界
labels=['低杠杆(0-30%)', '中杠杆(30-60%)', '高杠杆(>60%)'] # 分组标签
) # 完成分组
fig, ax = plt.subplots(figsize=(10, 6)) # 创建画布
nelson_aalen_fitter = NelsonAalenFitter() # 实例化NA估计器
for leverage_group in company_survival_data['leverage_group'].dropna().unique(): # 遍历各分组
mask = company_survival_data['leverage_group'] == leverage_group # 筛选当前分组
if mask.sum() < 2: # 样本不足则跳过
continue # 跳过
nelson_aalen_fitter.fit( # 拟合累积风险
company_survival_data.loc[mask, 'duration'], # 存续时间
company_survival_data.loc[mask, 'event'] # 事件标记
) # 完成拟合
cumulative_hazard = nelson_aalen_fitter.cumulative_hazard_ # 获取累积风险
hazard_estimate = cumulative_hazard.diff().fillna(0) # 差分得到风险函数估计
hazard_estimate.plot(ax=ax, label=leverage_group) # 绘制到画布
ax.set_title('不同初始杠杆率分组的退市风险函数', fontsize=14) # 设置标题
ax.set_xlabel('生存时间(年)', fontsize=12) # x轴标签
ax.set_ylabel('风险函数 h(t)', fontsize=12) # y轴标签
ax.grid(True, alpha=0.3) # 添加网格线
plt.legend(title='杠杆率分组', prop={'family': 'Source Han Serif SC'}) # 图例
plt.tight_layout() # 自动调整布局
plt.show() # 显示图形