决策曲线拆解分析兼随机森林DCA绘制

临床决策曲线(DCA)解析兼绘制随机森林的DCA曲线(R)

决策曲线拆解分析兼随机森林DCA绘制_第1张图片

临床决策曲线的独特作用

  • 协助决定阈值;cost-benefit 比值的概念和净收益的概念对临床决策阈值的选择都有重要的参考作用。
  • 协助选择模型,通常区分度和校准度是评价模型和选择模型的标准,这两个参数越高的模型越好,但是在实际情况下,往往是一个模型仅有一方面比另外一个模型好,那么这种情况下该选择哪个模型就是一个问题,决策曲线将有助于模型的选择。

关于DCA的几个观念

  • DCA曲线可以用于预测模型、检验marker等实验中。
  • 建议使用DCA确定一个阈值范围而不是单个阈值。
  • 明确预测模型使用的后续具体的检查或者治疗,比如某某检查或者某某手术等。

cost-benefit比值的概念

  • cost 的意思是,检查或者手术本身的不适和副作用;
  • benefit的意思是,检查或者手术的诊断和治疗作用;
  • 临床上两者往往不是等同的, 一般情况下benefit会大于cost。
  • 在DCA中,cost-benefit比值和选择的概率密切相关,比如如果选择的阈值概率为0.1(0.1以上接受检查或者治疗),那么cost-benefit比值为1:9,横坐标轴下的标线就表示出cost-benefit比值。选择阈值为0.1代表了一种考量,即我们愿意检查或者治疗10个人(至多),其中有1个获得了应有的检查或者治疗。在临床上,选择决策阈值之前,可以问这样的问题“你愿意接受检查或者治疗多少人而其中有1个得到了所需的检查或治疗?”,将有助于确定阈值。

净收益概念

  • 净收益是DCA的纵坐标,DCA中的treat all曲线和模型曲线需要计算净收益,且两者的计算公式稍微有些区别。下面是treat all 曲线的净收益计算方法,实际上是使用真实值(而不是预测值)来计算的。
#引用自https://blog.csdn.net/qq_48321729/article/details/123241746
def calculate_net_benefit_all(thresh_group, y_label):
    net_benefit_all = np.array([])
    tn, fp, fn, tp = confusion_matrix(y_label, y_label).ravel()
    total = tp + tn
    for thresh in thresh_group:#阈值
        net_benefit = (tp / total) - (tn / total) * (thresh / (1 - thresh))
        net_benefit_all = np.append(net_benefit_all, net_benefit)
    return net_benefit_all

以下是模型曲线净收益的计算公式。可以看到两者是略有区别的。

#引用自https://blog.csdn.net/qq_48321729/article/details/123241746
def calculate_net_benefit_model(thresh_group, y_pred_score, y_label):
    net_benefit_model = np.array([])
    for thresh in thresh_group:
        y_pred_label = y_pred_score > thresh
        tn, fp, fn, tp = confusion_matrix(y_label, y_pred_label).ravel()
        n = len(y_label)
        net_benefit = (tp / n) - (fp / n) * (thresh / (1 - thresh))
        net_benefit_model = np.append(net_benefit_model, net_benefit)
    return net_benefit_model

  • 从以上公式中也可以看出,只要知道模型预测的概率就可以画出DCA曲线,而treat all曲线和模型无关,所以各种预测模型的treat all 曲线都是相同的,这样我们就可以绘制出随机森林等各种模型的DCA。

绘制随机森林模型的DCA

目前为止,官方只给出了线性模型(逻辑回归和COX)的DCA绘制方法,这一点是有点奇怪的,可能有些方面不适合向随机森林这样的模型(可能是其中的某些关键元素只能用线性模型来解释),但是从技术层面来看,各种模型都可以制作DCA曲线。

  • 线性模型:逻辑回归或者cox回归有现成的R包(rmda)可以用于绘制DCA。
  • 从上面的净获益的计算公式可以看出,只要有预测概率就可以计算,所以理论上所有的模型都可以计算净获益,也就可以制作DCA曲线,所以,计算净收益用到的是预测概率,所以模型的预测概率与实际概率的符合程度(校准度)是重要的。
  • 随机森林模型:理论上我们只要可以得到阈值(X轴)和净收益(Y轴)的数据,我们就可以绘制出DCA曲线。。
    • 考虑到上面所述“奇怪”的情况,同时绘制出线性模型的DCA作为参考,可能是比较妥当的。

    • 制作中遇到一个问题,就是“该使用全部数据,训练数据集还是测试数据集来绘制DCA曲线呢?”。对照线性模型的情况来看,应该使用全部数据集来绘制DCA曲线,那麽我们就要使用训练出的模型来预测整个数据集的概率,这会产生overfit的疑虑,所以目前觉得使用交叉验证的方法来获得整个数据集的预测概率是比较妥当的。

    • 这里使用了rmda官方的包作为基础绘制,在上面添加random forest 的DCA曲线的方式,比其它的方式更加简洁。

    • 绘制的详细代码可以参照链接(https://www.heywhale.com/notebooks/run/6413b2941c8c8b518ba04e52?label=62412710e2ca7e0017eaff45&image=63aa8edc230abea285abb899¬ebook=6413b294530f9c6c19267ed6&beta=1),一键运行。

    • 计算出的随机森林模型的净收益一般的做法是进行标准化,即净收益/prevalence,因为官方的做的曲线默认是进行标准化的。官方的包中给出了对实验类型给出了两个选项"cohort" or “case-control”,实际上就是和prevalence有关,“cohort”直接使用现有的数据计算prevanlence,这时候的数据量往往比较大, 而“case-control”,使用的情况是数据量比较小,prevanlence计算不准确的情况,比如使用验证集数据制作DCA曲线的时候。

你可能感兴趣的:(预测模型构建和评价,随机森林,python,人工智能)