用machine learning来预测CS死亡率

CS death

Posted by dewen on 2019-05-31

问题

一共给出了60+个自变量(2值型和连续型),1个因变量(二期是否死亡,2值型),还有一个死亡时间(连续变量)。希望通过machine learning的方法建模,得到哪些自变量自变量可以用来预测因变量,并得到模型的敏感性,特异性,AUC等信息。

数据预处理

  • 删除掉对因变量没有直接影响的变量,如:住院号,姓名等,也包括之后讨论的:是否完成二期手术
  • 删除掉有很多NULL的变量,如:结扎侧枝,结扎PDA
  • 删除掉有很多NULL的病人,如:分流管直径/体重,分流管直径/BSA

处理完之后数据共91例,自变量55个,因变量1个(PS:存活时间变量暂时不纳入自变量和因变量)

自变量初筛选

  • 使用软件:SPSS

由于自变量比较多,这里想首先筛选出对因变量影响较为显著的自变量,使用的方法是单因素分析和多变量logistic回归。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
单因素分析显著性    多变量logistics回归显著性     是否纳入      特征
0.291 0.429 性别-A
0.390 0.457 早产儿-B
0.339 0.185 年龄-C
0.302 0.250 年龄分组>6m-D
0.982 0.640 年龄分组>1m-E
0.096 0.077 1 身高-F
0.143 0.104 1 体重-G
0.11 0.084 1 术前BSA-H
0.688 0.64 术前低体重-I
0.198 0.114 1 术前心功能-J
0.102 0.019 1 术前气管插管-K
0 0.001 1 主诊断分组-L
0 0 1 是否为FSV-M
0.297 0.260 术后前向血流-O
0.001 0.022 1 TAPVC-P
0.688 0.944 术前支气管狭窄-Q
0.753 0.348 MPA-R
0.633 0.290 主动脉弓-S
0.715 0.857 RPA上下径-T
0.455 0.627 RPA前后径-U
0.029 0.038 1 LPA上下径-V
0.022 0.022 1 LPA前后径-W
0.096 0.038 1 术前LPA重度狭窄-X
0.002 0.013 1 术前RPA重度狭窄-Y
0.011 0.018 1 是否肺动脉成型扩宽-Z
0.083 0.227 RPA直径-AA
0.028 0.038 1 LPA直径-AB
0.165 0.268 RPA面积-AC
0.031 0.059 1 LPA面积-AD
0.100 0.034 1 DA直径-AE
0.042 0.032 1 MCPAs面积-AF
0 0 1 RPA/DA-AG
0 0 1 LPA/DA-AH
0 0 1 McGoon-AI
0.001 0 1 M率-AJ
0.002 0.001 1 M率分组-AK
0.001 0 1 M前后径-AL
0 0 1 Nataka指数-AM
0 0 1 Nataka分组-AN
0.078 0.154 1 TAPAI-AO
0.006 0.028 1 TAPAI分组-AP
0.186 0.071 1 PVI术前-AQ
0.089 0.029 1 MACPAs数目-AR
0.026 0.014 1 术前有无MACPAs-AS
0.006 0.002 1 PDA-AT
0.788 0.469 术后有无PDA-AU
0.014 0.065 1 术后有无MAPCAs-AV
0.001 0.020 1 是否肺血管单一化-AW
0.332 0.235 手术分流管直径-AX
0.257 0.332 分流管直径/体重-AY
0.102 0.068 1 吻合口位置-AZ
0.02 0.014 1 是否延迟关胸-BA
0.004 0.014 1 是否CPB-BB
0.318 0.045 分流管直径/BSA-BC

我们选择在单因素分析和多变量logistic回归中显著性都小于0.2的变量,纳入之后的建模,纳入的变量用1标记

这样我们初步选出以下的自变量:

  • F, G, H, J, K, L, M, P, V, W, X, Y, Z
  • AB, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR, AS, AT, AV, AN, AZ
  • BA, BB

一共36个自变量

实验

我们直接用上面选出来的36个变量建模,实验设置为4则交叉验证,重复100次取结果的平均值,评价指标为精确度,敏感性,特异性和AUC(每个指标的95%CI的结果也可以得到,但由于空间限制,此处不report)

1
2
3
4
5
6
7
8
Model         Number of features       Accuracy       Sensitivity     Specificity         AUC
KNN 36 0.7425 0.3687 0.8899 0.7229
SVM 36 0.8350 0.4014 1.0000 0.8353
LR 36 0.8050 0.6421 0.8680 0.8464
RF 36 0.8208 0.5495 0.9203 0.8776
DTC 36 0.7942 0.6684 0.8414 0.7549
GBDT 36 0.8142 0.4887 0.9331 0.8730
XGBoost 36 0.8167 0.5818 0.9051 0.8522

可以看出RF(Random Forest)和GBDT(Gradient Boosting Decision Tree)的AUC最好

但考虑到这样的模型纳入的变量太多,希望能减少特征个数,得到简化的模型

进一步实验

Idea: XGBoost在建模的过程中可以得到每个特征的重要程度,因此我们可以用XGBoost对特征的重要性排序,进一步选出较为重要的特征

这样选出了13个相对比较重要的特征,实验结果为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Variables         Important score
AH 0.0888
L 0.0863
G 0.0635
AG 0.0609
AQ 0.0533
AN 0.0533
AO 0.0533
X 0.0507
F 0.0507
AE 0.0482
BA 0.0457
AB 0.0431
AI 0.0431

同样,我们用上面选出的这13个变量建模,实验设置和之前一样,实验结果如下:

1
2
3
4
5
6
7
8
Model         Number of features       Accuracy       Sensitivity     Specificity         AUC
KNN 13 0.7467 0.3671 0.8825 0.7229
SVM 13 0.8550 0.4457 1.0000 0.8419
LR 13 0.8167 0.5513 0.9083 0.8418
RF 13 0.8525 0.6170 0.9349 0.8637
DTC 13 0.8208 0.7030 0.8593 0.7812
GBDT 13 0.8400 0.5767 0.9356 0.8775
XGBoost 13 0.8333 0.5835 0.9208 0.8489

GBDT模型可以得到最好的AUC,和之前的36个特征相比,几乎无损失

进一步,我们希望得到特征更少的模型,这里采用logistic回归中的逐步回归方法,以上面选出的13个特征为基础,继续得到简化的模型

Step logistic regression的结果为:

最后选出3个特征: L, X, AI

但由于模型中X的P>0.05,并不显著,所以直接把X删除,只用特征:L和AI建模

用2个特征来做逻辑回归的模型为:

Hosmer‑Lemeshow 检验所得统计值 p‑value=0.879,说明此模型一致性结果较高。

同样,我们用这2个特征来建模,看看效果:

1
2
3
4
5
6
7
8
Model         Number of features       Accuracy       Sensitivity     Specificity         AUC
KNN 2 0.7633 0.4759 0.8775 0.8033
SVM 2 0.7683 0.4045 0.9173 0.7980
LR 2 0.7700 0.3383 0.9441 0.8321
RF 2 0.8217 0.6417 0.8941 0.8239
DTC 2 0.8275 0.6788 0.8897 0.7843
GBDT 2 0.8008 0.5013 0.9228 0.8517
XGBoost 2 0.7733 0.5559 0.8623 0.8337

精度略有下降,但不多

进一步,我们希望设计更简化的模型,使用决策树将连续变量L和AI离散化为(方法是直接用单变量做决策树模型,会得到一个分割阈值,但我不确定这样的做法是否合理):

  • L: if L > 3 then L = 1 else L = 0
  • AI : if AI > 1.64 then AI = 1 else AI = 0

这样我们得到全新的L和AI变量

用新的L和AI做逻辑回归:

可以看到模型依然有意义

machine learning 建模结果:

1
2
3
4
5
6
7
8
Model         Number of features       Accuracy       Sensitivity     Specificity         AUC
KNN 2 0.7672 0.3906 0.8975 0.7578
SVM 2 0.7789 0.2836 0.9520 0.6928
LR 2 0.7778 0.2126 0.9787 0.7921
RF 2 0.7839 0.2781 0.9599 0.7801
DTC 2 0.7789 0.2530 0.9623 0.7633
GBDT 2 0.7828 0.1996 0.9873 0.7735
XGBoost 2 0.7675 0.2679 0.9420 0.7764

模型性能有一些降低,敏感性降低很多,逻辑回归有更好的效果

之后我们希望通过选出的2个变量建立一个患者的风险分层评分(risk stratification score, RSS)模型,将1分为低危组,2分为中危组,3分为高危组。(变量L和AI的分割阈值分别取3和1.64)

1
2
3
Variables       beta        HR(95% CI)                P         Derived Score
L>3 2.177 8.817(2.579-30.150) 0.001 1
AI>1.64 3.154 23.438(3.537-155.305) 0.001 2

最终的简化模型分析

我们的对最终建立的简化模型进行了分析,得到AUC为0.801

Kaplan-Meier生存分析显示

Log-rank test 为 0 < 0.001 说明我们得到的简化模型可以病人的死亡风险进行很好的分层

最终模型纳入变量:

  • L : 主诊断分组
  • AI : McGoon