Python绘制Cox列线图:详细教程与指南
python绘制列线图(新增cox)及绘制指南
最近,绘制列线图的帖子受到了大家不少的关注,大家的关注是我的动力。
绘制cox列线图
经过一天的努力,在原有绘制逻辑回归算法列线图的基础上,增加了绘制COX列线图的功能。Cox列线图的绘制稍微复杂一些,好在基本的逻辑是一样的,主要的不同的是列线图概率部分一般会绘制2-3个概率条,分别指定不同时间的累计风险。
还是有一些不完善,比如左侧的字体有些显示不全。下面是另外“cool”风格,可以绘制不同的风格,也算是我们这个代码的一个特色,以后肯定会增加更多有趣的风格,使列线图兼具实用性和美观性,以便大家可以在一些不是特别正式的场合来展示列线图。
关于如何绘制列线图,感觉还是有必要说一说,因为代码编写的不够完善,稍有不慎还是容易出错。
绘制指南
整体的过程如下所示。
需要强调的几个地方:
- 读取数据之后,要使用pandas的Categorical函数对分类变量进行一定的处理,规定哑变量是哪个,这里是0,把哑变量排在第一位。因为代码中会进行onehot编码,会影响最终列线图的绘制。
- 后处理过程是必须的,后处理过程中计算了总分和概率,是绘制列线图中需要用到的,不可省略。
- case_data是字典形式,变量名称是onthot编码后的名称,不是原始名称。
- 绘图参数中,有个continuous_step_scale,是用来控制连续变相的刻度线疏密程度的,数字越大,越稀疏,需要多次尝试选择合适的刻度疏密程度,最好是能被刻度线整除的。color_theme=‘cool’,symbol_theme=‘cool’ 用来控制风格,分别有“classic”、“CNS”和“cool”三种风格。
附相关的代码
#读取数据
data=pd.read_csv('heart_failure.csv')
#处理分类变量
data['anaemia']=pd.Categorical(data['anaemia'],categories=[0,1],ordered=True)
data['diabetes']=pd.Categorical(data['diabetes'],categories=[0,1],ordered=True)
data['high_blood_pressure']=pd.Categorical(data['high_blood_pressure'],categories=[0,1],ordered=True)
data['sex']=pd.Categorical(data['sex'],categories=[0,1],ordered=True)
data['smoking']=pd.Categorical(data['smoking'],categories=[0,1],ordered=True)
#指定需要的变量
cat_cols = ['sex', 'anaemia','diabetes','high_blood_pressure','smoking']
continuous_cols = ['age', 'creatinine_phosphokinase', 'ejection_fraction', 'serum_creatinine', 'serum_sodium']
time_col = 'time'
event_col = 'DEATH_EVENT'
var_cols = continuous_cols + cat_cols
#计算数据
data_label, meta_df, score_df, params_df,cph,data_onehot = prepare_nomogram_data_cox(data, cat_cols, event_col, time_col, var_cols)
#后处理
ununion_cols=[['sex_1'],['anaemia_1'],['diabetes_1'],['high_blood_pressure_1'],['smoking_1']]
reunion_cols=['sex','anaemia','diabetes','high_blood_pressure','smoking']
meta_df,score_df=postprocess(meta_df,score_df,ununion_cols,reunion_cols,cox=True,specific_times=[30,60],cox_model=cph,data_onehot_cox=data_onehot)
#计算个案数据
case_data={'age':60,'creatinine_phosphokinase':40,'ejection_fraction':50,'serum_creatinine':1,'serum_sodium':120,'sex_1':1,'anaemia_1':1,'diabetes_1':1,'high_blood_pressure_1':1,'smoking_1':1}
params_df,case_data=calculate_case_score(params_df,case_data=case_data,cox=True,cox_model=cph,specific_times=[30,60])
#绘制列线图
fig = plot_nomogram(score_df,data_label,meta_df,params_df,
ununion_cols,reunion_cols,prob_range=[0.1,0.2,0.3,0.6,0.9],cox=True,cox_model=cph,specific_times=[30,60],
continuous_step_scale={0: 3, 1: 1000, 2: 2,3:1,4:5,'total': 2},
case_data=case_data,
color_theme='cool',symbol_theme='cool'
)
fig.show()
最后
其实,代码本来不是想绘制列线图的,是为了用列线图算法来解释线性模型的,但是绘制好列线图也是应该的,后续在这两方面都会继续完善,欢迎大家继续关系。
项目地址:https://gitcode.com/skyskytotop/pynomogram_explainer
视频版本
如果文字不够仔细,大家可以参照视频版本。
python绘制列线图和绘图指南
作者:医学AppMatrix