2  临床预测模型建立的一般步骤

很多高分文献中都有涉及如何建立一个预测模型,比如:

BMJ也出过多篇高分文章指导临床预测模型的建立,比如:

英文的看不懂看中文的也行:

如果是从写代码的顺序的角度来说,大致可以分为以下几个步骤:

2.1 明确研究目的

首先要明确你的研究目的

  • 你是要预测某个患者在10年后的生存状态吗?
  • 你还是要判断某个病理标本是tumor还是normal?
  • 你是要计算患者在使用某个药物后的空腹血糖水平吗?
  • 你还是要预测心梗患者的死亡风险?

不同的研究目的需要使用不同的模型,对应的模型评价方法、预处理方法、模型比较方法都不一样,不能生搬硬套。

以上四个问题其实可以分为三类,刚好对应着模型的三种用途:

  • 分类
  • 回归
  • 生存分析

如果你的结果变量(或者叫应变量、因变量)是数值型的,比如血糖、血压、血钾这种,那么你需要选择一个可以做回归分析的模型(大部分机器学习方法都是既支持回归也支持分类),此时你选择逻辑回归必然是不行的。

如果你的结果变量是分类型的,比如生存/死亡,tumor/normal,治愈/有效/无效,患病/不患病,那么你需要选择一个可以做分类分析的模型。

以上两种类型的模型通常会被大家称为诊断模型

如果你的数据涉及到时间问题,那么你需要选择一个可以做生存分析的模型。这种模型通常被大家称为预后模型

2.2 探索数据

探索数据的过程非常重要,充分了解你的数据,这个过程有个专业的名词叫**探索性数据分析(exploratory-data-analysis,EDA),主要包括以下几个方面:

  • 共有多少行?多少列?
  • 哪些是自变量,哪些是因变量?
  • 每个变量的含义是什么?
  • 有没有缺失值?离群值?异常值?需不需要处理?
  • 有没有偏态分布?需不需要处理?
  • 每个变量是数值型还是分类型?需要转换吗?
  • 各个变量的单位是否需要转换?需要归一化吗?
  • 各个变量之间有没有相关性?共线性?零方差?需要处理吗?
  • ……

每一个问题都很重要,都要搞清楚!不同的模型对数据的要求是不一样的,有的要求不能有缺失值,有的模型要求数据必须归一化等等,这些问题对开发一个准确的、高性能的模型是必须的。

有些人连自己的数据是啥都不了解,就开始生搬硬套代码,最后得到shit一样的结果,然后到处问:为什么我的模型这么垃圾?滑稽。

2.3 数据预处理和变量筛选

探索完你的数据之后,你就要根据自己选择的模型进行相应的预处理,而且不同的预处理步骤有一定的顺序。

这一步需要你有一定的专业知识、统计学知识、机器学习知识,其实很难,大家可以遇到了具体问题具体搜索。

下面是对不同模型推荐的预处理步骤(推荐,不是必需一定要按这个来!!):

名词解释:

  • dummy:对分类变量进行哑变量处理,或者进行其他重编码
  • zv:去除方差为0(zero-variance)或者近似为0的变量
  • impute:对缺失值进行插补
  • decorrelate:处理有共线性或者高度相关的变量
  • normalize:对数据进行标准化
  • transform:对变量进行转换,比如log、取对数、分箱等

变量选择(又叫特征选择,feature-selection),是机器学习和统计建模领域非常重要的问题,到底哪些变量是有用的,哪些是不重要的,可以删除的,怎么选才能提高模型表现,理论其实非常复杂。

比如有个数据共有26个自变量,可能其中只有几个是重要的,其他的有没有都不重要或者对模型影响不大,这时候就要把不重要的变量筛掉。

在传统的临床预测模型中,比较常见的变量筛选方法有:

  • 先单因素后多因素
  • 最优子集(全子集回归)
  • 逐步选择法
  • lasso回归筛选变量
  • 随机森林筛选变量

2.4 建立模型

这一步其实是大家遇到的最多的一步,可能也是大多数人的第一步。这里的“建立模型”其实是狭义的,就是单指“在训练集拟合模型”这一步,广义的“建立模型”包括本文所说的所有步骤。

这一步涉及到的主要知识点是各种重抽样方法的选择,比如boostrap(自助法,也有人翻译成拔靴法)、交叉验证、嵌套重抽样等。

但是写代码时其实就是1行代码而已,没有难度,需要大家理解每一种重抽样方法。

2.5 评价模型

这一步其实是最复杂的,因为从第二步(探索数据)到这一步其实是一个不断重复循环的过程,可能你建立一个模型之后发现这个模型表现很烂,那么你需要重新审视之前的每一个过程,因为每一步都会对模型表现产生影响,你就需要不断对之前的步骤进行调整,也就是不断地重复之前的过程。通常你可能需要重复好多次之后才能得到满意的结果。

而且模型的评价现在需要在不同的数据集中分别评价,比如:训练集、测试集、外部验证集等。有时候你的训练集模型表现很好但是测试集不一定好,那你是不是得找原因?如果你没有超级强大的知识储备,对你来说最简单的可行方案就是挨个试(对高手来说这一步也必不可少,只是写论文不需要写这个过程)。

除此之外,对于不同的研究目的和不同的模型需要选择不同的评价指标。对于分类问题你需要选择能够评价分类问题的指标,对于回归问题你需要选能够择评价回归问题的指标,对于生存问题你需要选择能够评价生存问题的指标。不能混用,不然必报错!

同样是分类问题,研究目的不同使用的指标也不一样,比如:你是想获得更大的敏感度还是更大的特异度?换个说法就是:你想要更高的误诊率还是更大的漏诊率?类别的不平衡对某些指标影响很大,你的研究能忽略这种问题吗?不能的话就要选择适合评价类不平衡数据的指标。诸如此类的问题,都和指标选择有关。

当你通过一通操作确定了最终的模型之后,你就可以画个列线图展示你的模型了,除此之外还可以根据列线图得分进行分组,做生存分析、亚组分析等。

如果你还想更加高大上一点,你还可以用shiny做个网页计算器。

2.6 结果报告和写作

全都搞定之后就可以写文章了,不会写的话就pubmed关键词搜一搜,模仿一下即可。除此之外还有一个TRIPOD指南,上面也有建议你需要写哪些东西。

注释

本合集并不是按照以上顺序编排的,本合集是模块化的,把这么多步骤分成不同的部分,每个部分都做详细介绍,方便大家学习。