一、引言
在当今医学领域中,精准医学作为一种以个体差异为基础的医疗模式逐渐受到重视和应用[1]。精准医学基于个体基因组、环境和生活方式因素的综合分析,旨在实现个体化的预防、诊断和治疗方案,从而提供更好的临床结果[2]。与传统医学相比,精准医学可针对患者的疾病风险、病因和药物反应等方面进行更为精准的预测,为医生和患者做出更明智的决策提供了依据。
DCA(Decision Curve Analysis)曲线作为一种评估医疗决策效果的工具[3],在临床医学中得到广泛应用。DCA曲线以横轴为阈值,纵轴为净效益,可以通过绘制不同决策策略的DCA曲线来比较其优劣。DCA曲线考虑了患者和医生的风险偏好,可以直观地展示不同策略在避免过度治疗和漏诊的平衡中的表现[4]。它已被广泛应用于癌症早期筛查、疾病诊断和治疗方案选择等领域,为医疗实践提供了重要的决策支持。
随着人工智能技术的迅速发展,将人工智能与DCA曲线相结合的研究和应用也逐渐崭露头角。通过利用人工智能的强大计算和模式识别能力,可以对丰富的临床数据进行挖掘和分析,从而优化医疗决策并提高临床结果的准确性和效果[5]。例如,利用人工智能的算法可以在DCA曲线中寻找关键的阈值点,帮助医生确定最佳的决策策略。此外,人工智能还能够加速DCA曲线的建模过程,并提供更精确的结果,进一步提升医疗决策的效益[6]。人工智能与DCA曲线的结合不仅可以为临床医学提供更强大的决策工具,还有望改进传统医疗模式的不足之处。
二、DCA简介和临床意义
-  
   「DCA曲线的基本概念和作用」 
DCA曲线是一种衡量医疗决策效果的曲线工具,广泛应用于临床医学中。通过将阈值值与净效益进行比较,DCA曲线能够评估不同决策策略的优劣。横轴表示阈值,用于决定实际操作是否执行某种治疗策略,纵轴表示净效益,衡量该策略相对于其他策略的潜在有益性。DCA曲线的优势在于它考虑了患者和医生的风险偏好,能够提供关于决策策略的详细信息;另外DCA曲线用于评估预测模型预测准确性并确定最优的决策策略。通过绘制DCA曲线,可以使用不同的决策阈值来评估模型的敏感性和特异性,从而评估模型的预测性能。DCA曲线可以帮助医生和研究人员了解模型在不同决策阈值下的真阳性率和伪阳性率,进而选择最适合临床实践的决策策略。
-  
   「DCA曲线在治疗效果评估和决策制定中的价值」 
DCA曲线在评估治疗效果和指导决策制定方面具有重要价值。通过绘制不同决策策略的DCA曲线,医生可以直观地分析不同阈值下的净效益,并选择最佳治疗策略。DCA曲线能够提供信息,帮助医生在避免过度治疗和漏诊之间找到平衡点。在临床研究和实践中,DCA曲线可应用于多个领域,如癌症早期筛查、疾病诊断和治疗方案选择,为医生提供决策支持,并最大程度地优化患者的临床结果。
-  
   「DCA曲线的局限性和改进方向」 
尽管DCA曲线在临床医学中具有重要意义,但也存在一些局限性。首先,DCA曲线依赖于模型和数据的质量,因此在实际应用中需注意模型的可靠性和数据的准确性。其次,DCA曲线在面对不同患者群体和疾病情况时可能存在变化,需根据具体情况进行调整和解读。此外,DCA曲线的建立过程可能较为复杂,需要进一步改进算法和方法,以提高其实用性和可解释性。
为了提高DCA曲线的应用效果,未来的研究可以从以下几个方向进行改进。首先,应进一步优化数据收集和分析方法,以提高DCA曲线的准确性和稳定性。其次,结合生物标志物等新的临床指标,以完善DCA曲线在个体化医疗中的应用。此外,结合人工智能技术,提升DCA曲线的预测能力和决策支持水平。通过这些努力,我们可以进一步提高DCA曲线在临床医学中的意义和应用前景。
三、DCA曲线分析过程
-  
   数据收集:收集相关的临床数据,包括患者特征、病史、临床诊断参数和治疗结果等。这些数据可以来自临床试验、医疗记录或其他医学数据库。 
-  
   模型构建:基于收集到的数据,构建一个预测模型,可以是机器学习模型、深度学习模型或其他预测模型。模型的选择取决于研究的具体需求和数据的特点。 
-  
   DCA曲线生成:使用构建好的模型,针对不同的阈值值进行预测。将预测结果与实际观察结果进行比较,计算出每种阈值值下的净效益。根据这些计算结果,绘制出DCA曲线。 
-  
   DCA曲线评估:对生成的DCA曲线进行评估,分析不同决策策略在不同阈值下的净效益。根据曲线的形状和特征,评估不同策略的优劣,并确定最优的治疗策略。 
-  
   结果解释:根据DCA曲线的结果,解释不同决策策略的潜在益处和风险,并与临床实践和指南进行比较。解释DCA曲线的结果可以帮助医生和决策者更好地理解不同策略的效果,从而做出更明智的决策。 
四、案例展示
4.1 衡量医疗决策效果
-  
   「数据集简介」 
library(survival)
str(gbsg)
结果展示:
'data.frame':   686 obs. of  10 variables:
 $ age    : int  49 55 56 45 65 48 48 37 67 45 ...
 $ meno   : int  0 1 1 0 1 0 0 0 1 0 ...
 $ size   : int  18 20 40 25 30 52 21 20 20 30 ...
 $ grade  : int  2 3 3 3 2 2 3 2 2 2 ...
 $ nodes  : int  2 16 3 1 5 11 8 9 1 1 ...
 $ pgr    : int  0 0 0 0 0 0 0 0 0 0 ...
 $ er     : int  0 0 0 4 36 0 0 0 0 0 ...
 $ hormon : int  0 0 0 0 1 0 0 1 1 0 ...
 $ rfstime: int  1838 403 1603 177 1855 842 293 42 564 1093 ...
 $ status : Factor w/ 2 levels "0","1": 1 2 1 1 1 2 2 1 2 2 ...
age:患者年龄
meno:更年期状态(0表示未更年期,1表示已更年期)
size:肿瘤大小
grade:肿瘤分级
nodes:受累淋巴结数量
pgr:孕激素受体表达水平
er:雌激素受体表达水平
hormon:激素治疗(0表示否,1表示是)
rfstime:复发或死亡时间(以天为单位)
status:事件状态(0表示被截尾,1表示事件发生)
-  
   「数据预处理」 
gbsg_select <- gbsg[,c("age","meno","size","grade","nodes","pgr","er","hormon","rfstime","status")]
# 划分数据集为训练集和测试集
set.seed(123) # 设置随机种子,保证结果的可复现性
train_index <- sample(1:nrow(gbsg), 0.7 * nrow(gbsg)) # 70%的数据作为训练集
train_data <- gbsg_select[train_index, ]
test_data <- gbsg_select[-train_index, ]
-  
   「绘制DCA曲线」 
library(rmda)
set.seed(123)
bs_md <- decision_curve(status ~ age + meno + size, data = train_data,
    thresholds = seq(0, 0.4, by = 0.005), bootstraps = 10)
plot_decision_curve(bs_md,  
                    curve.names = "Baseline Model",
                    cost.benefit.axis =FALSE,
                    # col= c('red','blue'),
                    confidence.intervals=FALSE,
                    standardize = FALSE)
summary(bs_md,measure= 'NB')
结果展示:
Net Benefit (95% Confidence Intervals):
--------------------------------------------------------------------------------------------------
   risk      cost:benefit       percent             All         status ~ age + meno + size   None 
 threshold      ratio          high risk                                                          
----------- -------------- ------------------ ---------------- ---------------------------- ------
     0           0:1              100              0.444                  0.444               0   
                               (100, 100)      (0.412, 0.481)         (0.412, 0.481)              
   0.005        1:199             100              0.441                  0.441               0   
                               (100, 100)      (0.41, 0.479)          (0.41, 0.479)               
   0.065        13:187            100              0.405                  0.405               0   
                               (100, 100)      (0.372, 0.445)         (0.372, 0.445)              
   0.07          7:93             100              0.402                  0.402               0   
                               (100, 100)      (0.368, 0.442)         (0.368, 0.442)              
   0.075         3:37             100              0.399                  0.399               0   
                               (100, 100)      (0.365, 0.439)         (0.365, 0.439)              
   0.08          2:23             100              0.395                  0.395               0   
                               (100, 100)      (0.361, 0.436)         (0.361, 0.436)              
   0.085        17:183            100              0.392                  0.392               0   
                               (100, 100)      (0.358, 0.433)         (0.358, 0.433)              
   0.09          9:91             100              0.389                  0.389               0   
                               (100, 100)      (0.354, 0.43)          (0.354, 0.43)               
   0.115        23:177            100              0.371                  0.371               0   
                               (100, 100)      (0.336, 0.414)         (0.336, 0.414)              
   0.12          3:22             100              0.368                  0.368               0   
                               (100, 100)      (0.332, 0.411)         (0.332, 0.411)              
             
   0.295        59:141           99.792            0.211                  0.212               0   
                             (87.917, 100)     (0.167, 0.264)         (0.17, 0.265)               
    0.3          3:7             99.792            0.205                  0.206               0   
                             (87.917, 100)     (0.161, 0.259)         (0.165, 0.26)               
   0.305        61:139           99.792             0.2                   0.201               0   
                             (87.083, 100)     (0.155, 0.254)         (0.162, 0.259)              
   0.31         31:69            99.583            0.194                  0.196               0   
                             (84.375, 100)     (0.149, 0.248)         (0.146, 0.254)              
   0.315        63:137           99.167            0.188                  0.189               0   
                            (81.25, 99.792)    (0.142, 0.243)         (0.153, 0.249)              
   0.32          8:17            98.542            0.182                  0.186               0   
                            (81.042, 99.792)   (0.136, 0.237)         (0.149, 0.243)              
   0.325        13:27            98.333            0.176                  0.181               0   
                            (79.375, 99.583)   (0.13, 0.231)          (0.142, 0.239)              
   0.33         33:67            97.292             0.17                   0.18               0   
                            (77.292, 99.583)   (0.123, 0.226)         (0.138, 0.226)              
   0.335        67:133           96.875            0.164                  0.176               0   
                            (76.25, 99.583)    (0.117, 0.22)          (0.128, 0.22)               
   0.34         17:33            95.625            0.157                  0.173               0   
                            (74.583, 98.333)   (0.11, 0.214)          (0.122, 0.221)              
   0.345        69:131           94.583            0.151                   0.16               0   
                            (70.833, 98.333)   (0.103, 0.208)         (0.116, 0.216)              
   0.35          7:13            92.917            0.144                   0.16               0   
                            (67.708, 97.292)   (0.096, 0.202)         (0.111, 0.213) 
   0.375         3:5             82.917             0.11                  0.129               0   
                            (60.208, 92.292)    (0.06, 0.17)          (0.086, 0.205)              
   0.38         19:31            80.417            0.103                  0.122               0   
                            (59.375, 90.208)   (0.052, 0.163)          (0.085, 0.2)               
   0.385        77:123           79.167            0.096                  0.121               0   
                              (56.25, 90)      (0.045, 0.157)         (0.067, 0.204)              
   0.39         39:61            76.042            0.088                  0.115               0   
                            (55.208, 89.583)   (0.037, 0.15)          (0.069, 0.205)              
   0.395        79:121           73.958            0.081                  0.103               0   
                            (52.917, 88.333)   (0.029, 0.143)         (0.056, 0.191)              
    0.4          2:3             70.208            0.073                  0.105               0   
                            (51.875, 87.292)   (0.021, 0.135)         (0.044, 0.199)              
--------------------------------------------------------------------------------------------------
仅仅作为展示,中间删除了很大一部分,太长了。
-  
   「多模型比较」 
full_md <- decision_curve(status ~ age + meno + size + grade + nodes + pgr + er + hormon, data = train_data,
    thresholds = seq(0, 0.4, by = 0.005), bootstraps = 10)
plot_decision_curve( list(bs_md, full_md),
                    curve.names = c("Baseline model", "Full model"),
                    col = c("blue", "red"),
                    confidence.intervals = FALSE,  #remove confidence intervals
                    cost.benefit.axis = FALSE, #remove cost benefit axis
                    legend.position = "topright") 
从图中可以看出,全模型的效果是比基础模型的效果是要更优的。
4.2 模型性能比较
devtools::install_github("yikeshu0611/ggDCA")
library(ggDCA)
lrm1 <- lrm(status ~ age + meno + size, data = train_data)
lrm2 <- lrm(status ~ age + meno + size + grade, data = train_data)
lrm3 <- lrm(status ~ age + meno + size + grade + nodes + pgr, data = train_data)
dca_md <- dca(lrm, lrm2, lrm3, model.names = c("base", "base + size", "base + size + node +pgr"))
ggplot(dca_md)
五、DCA曲线解读
-  
   X轴:X轴通常代表决策曲线中的阈值,即预测概率或预测分数的截断点。X轴的取值范围是预先设定的,例如在您的代码示例中,从0到0.4之间,间隔为0.005。 
-  
   Y轴:Y轴代表DCA曲线的净效益(net benefit)。净效益是通过计算“真阳性数目减去假阳性数目”的结果,再乘以一个权重因子(称为网络好处比,net benefit ratio)得到的。通常,Y轴的值越高,表示模型具有更好的净效益。 
-  
   基准线:DCA曲线上的基准线(reference line)表示在没有进行任何预测的情况下(即将所有患者都作为阳性或阴性),所获得的默认策略的净效益。曲线位于基准线之上的区域表示模型的预测策略优于默认策略。 
-  
   不同模型或策略的曲线:如果您进行了多个模型或策略的比较,DCA曲线可以同时展示它们的结果。通过比较不同曲线之间的高低,可以了解到每个模型在不同阈值下的净效益优劣。 
-  
   最优阈值选择:DCA曲线上的最高点对应的阈值是最优的选择,因为在该点时模型能够获得最大的净效益。 
-  
   曲线相对位置:如果一个模型的曲线明显高于其他模型的曲线或基准线,意味着该模型在大多数阈值范围内能够获得更好的净效益。 
-  
   阈值选择的影响:可以观察不同阈值选择对净效益的影响。例如,在低阈值下,可能会增加假阳性率,而在高阈值下,可能会增加漏诊率。选择合适的阈值需要基于任务需求和成本效益的考虑。 
参考文献:
[1] Collins, F. S., & Varmus, H. (2015). A new initiative on precision medicine. New England Journal of Medicine, 372(9), 793-795.
[2] Hamburg, M. A., & Collins, F. S. (2010). The path to personalized medicine. New England Journal of Medicine, 363(4), 301-304.
[3] Vickers, A. J., & Elkin, E. B. (2006). Decision curve analysis: A novel method for evaluating prediction models. Medical decision making, 26(6), 565-574.
[4] van Klaveren, D., Steyerberg, E. W., & Koffijberg, H. (2012). Determining the utility for clinical prediction models: a discussion. BMC medical informatics and decision making, 12(1), 1-5.
[5] Rajkomar, A., Dean, J., & Kohane, I. (2019). Machine learning in medicine. New England Journal of Medicine, 380(14), 1347-1358.
[6] Tagliaferri, L., Petrillo, A., & Tagliaferri, F. (2020). AI and machine learning applied to cancer prevention and detection: Challenges and perspectives. Frontiers in oncology, 10, 576581.
*「未经许可,不得以任何方式复制或抄袭本篇文章之部分或全部内容。版权所有,侵权必究。」



















