【医生向】临床预测模型:收集数据“切片”还是数据趋势?
在进入介绍之前,先说一个理念:医生做临床数据科研,并不等于要自己变成算法工程师。但是,“不同的方法适用于不同的情景”,对于这个事实要心中有数。
真正的第一步,正是在医生自己手上——把感兴趣的临床问题说清楚。手里的数据是什么样的?某个指标是采集一个时间点的,还是随着病程不断变化而持续采集?
比如:
“我有一批患者资料,能不能建个模型预测某个结局?”
但真正开始分析前,需要先问一个更基础的问题:
我的数据到底是什么形态?
是每个患者一行资料,每个检查只取了某个时间点的结果?
还是每个患者有很多次检查,可以呈现一个趋势?
是只看入院时状态?
还是要看病情随时间变化?
这些问题会决定你应该用什么模型。
因为,医生最不可被替代的工作是把临床逻辑、数据来源、时间顺序和研究目标先梳理出来。后续用数据科学的方法,交给统计师、数据科学家、工程师合作来完成。否则直接用数据科学(AI或机器学习等)的方法,看似能够从计算的角度完成一些筛选,但常常漏洞百出。
做临床数据相关课题的过程和写任何项目计划书并没有本质区别:先定义问题,再盘点资源,然后选择合适的方法,最后不断验证和修正。这不应该在医生的能力之外,也不能完全“外包”。
下面举例解释。
1. 静态特征模型:把一个患者压缩成“一行”
英文:static-feature model / static tabular model
这是临床研究里最常见的形式。
比如我们想预测:
入院时能不能预测这个患者住院期间会不会发生VTE?
我们可能为每个患者整理一行数据:
| 患者 | 年龄 | 肿瘤分期 | D-dimer | 是否手术 | 是否发生VTE |
|---|---|---|---|---|---|
| A | 65 | III期 | 升高 | 是 | 是 |
| B | 52 | II期 | 正常 | 否 | 否 |
这种数据就是“表格型数据”。每个患者一行,每个变量一列。
适合的模型包括:
- 逻辑回归(logistic regression)
- 随机森林(random forest)
- XGBoost
- LightGBM
- 支持向量机(support vector machine)
举例:
如果你只用“入院第一天能获得的信息”预测“住院期间是否发生VTE”,这通常就是静态特征模型。
2. 动态特征模型:患者状态会随时间变化
英文:dynamic-feature model
有些变量不是固定的。比如:
- D-dimer每天都可能变
- 白细胞每天都可能变
- CRP术后逐日变化
- 血压、心率、氧饱和度持续变化
如果模型不仅看“某个时间点”,而是想利用这些变化,就进入了动态特征模型。
举例:
术后第1天D-dimer升高,意义可能不大;但如果D-dimer从术前到术后第5天持续升高,可能更值得关注。
动态特征模型的关键不是“数值是多少”,而是:
这个变量是怎么变化的?
3. 时间序列模型:保留时间轨迹
英文:time-series model / temporal model
时间序列模型更强调“顺序”。
例如一个患者术后7天白细胞变化:
第1天 8 → 第2天 10 → 第3天 14 → 第4天 16 → 第5天 12
这个变化轨迹和单纯取平均值不一样。
如果我们只算平均白细胞,可能得到12。
但时间序列模型会看到:
它先升高,然后开始下降。
这在临床上很重要,因为趋势本身就是信息。
举例:
预测术后感染时,CRP从高到低,和CRP持续升高,临床意义完全不同。
4. 纵向数据模型:重复测量,关注个体变化
英文:longitudinal model
纵向数据模型也处理重复测量,但它更强调:
同一个患者自己和自己比,随时间怎么变。
比如我们研究化疗后血红蛋白下降:
- 有些患者本来Hb就低;
- 有些患者下降很快;
- 有些患者下降后能恢复;
- 有些患者持续下降。
纵向模型关心的不只是某次检查值,而是每个患者的变化模式。
举例:
如果你想研究“某药物是否让肾功能下降更快”,纵向数据模型可能比简单比较治疗前后肌酐更合适。
5. 序列模型:输入是一串按顺序排列的信息
英文:sequence model
序列模型不一定只处理实验室指标。它可以处理任何有顺序的信息。
比如:
- 入院 → 手术 → ICU → 抗生素 → 发热 → 血培养
- 门诊第1次 → 第2次 → 第3次随访
- 病程记录按时间排列
- 连续影像或连续照片
序列模型的核心是:
前面发生的事情会影响后面的判断。
举例:
一个患者先出现低血压,再出现乳酸升高,和先乳酸升高、后低血压,临床含义可能不同。
6. LSTM模型:一种常见的序列/时间模型
英文:long short-term memory model, LSTM
LSTM是一种神经网络,常用于处理时间序列或序列数据。
它的特点是:
模型可以在一定程度上“记住”前面的信息,再结合后面的变化作判断。
举例:
如果你有患者术前3天到术后7天每天的D-dimer、CRP、白细胞、血小板数据,LSTM可以尝试学习:
哪种变化轨迹更容易提示术后VTE?
但LSTM不是万能的。它通常需要:
- 样本量较大;
- 时间点比较规律;
- 每个时间点的变量比较完整;
- 事件数足够;
- 有清楚的预测时间点和结局定义。
如果只有几百例患者,事件数很少,强行用LSTM可能只是“看起来高级”,实际容易过拟合。
再来两个临床问题举例 - 小测验
问题1:入院时能不能预测住院期间VTE?
这个问题通常适合静态特征模型。
可选模型:
- 逻辑回归:适合样本量不大、想要解释清楚;
- XGBoost / Random Forest:适合变量多、关系可能非线性;
- Cox模型:如果你关心“多久发生VTE”,而不是单纯是否发生。
取决于什么?
- 预测时间点是否固定:比如入院24小时内;
- 结局时间窗是否固定:比如住院期间或30天内;
- 事件数是否足够(即真正发生VTE结局的数量不能太少);
- 是否需要给医生一个可信的风险概率;
- 是否报告校准、决策曲线和外部验证。
如果只是想知道“谁更高风险”,AUROC可能有帮助;如果要决定是否预防性抗凝,就必须关心校准和临床阈值。
问题2:术后每天的化验变化能不能提前预警感染或VTE?
这个问题可能不适合只做静态模型。
可选方案有几种:
如果数据少,可以先把时间变化压缩成静态特征:
- 最高值
- 最低值
- 平均值
- 变化幅度
- 上升速度
- 是否连续升高
然后用逻辑回归、XGBoost等模型。
如果数据多、时间点规律,可以考虑:
- 时间序列模型
- 序列模型
- LSTM / GRU等神经网络
如果你更关心某个指标随时间变化和结局的关系,可以考虑:
- 纵向数据模型
- 混合效应模型
- landmark prediction
- joint model
取决于什么?
- 每个患者是否都有相似的检测时间点;
- 数据是否缺失严重;
- 是要预测未来事件,还是解释指标变化;
- 样本量和事件数够不够;
- 医生是否需要可解释的结果;
- 模型输出是“报警”还是“风险概率”。
可以给所有变量填一张表,厘清以下问题:
| 医生先回答的问题 | 后续可能对应的方法 |
|---|---|
| 这个变量取一个时间点够不够? | 静态 logistic / Cox / Fine & Gray |
| 应该取哪个时间点? | baseline definition / landmarking |
| 需要一段时间内的最高值、最低值、均值、变化幅度吗? | window summary features |
| 变化趋势本身是否重要? | longitudinal model / joint model |
| 是否存在中间状态或多阶段事件? | multistate model |
| 是否需要在随访中不断更新预测? | landmarking / dynamic prediction |
| 变量不可测是否本身有意义? | special coding / missingness mechanism review |
那么现实问题来了。临床上,医生经常是结合趋势做判断的,岂不是大部分模型都应该要做动态建模?事实上大部分模型并没有动态建模,而表现并不比动态建模差差。
临床上看趋势 ≠ 统计建模一定要做动态模型。
更准确的说法是:
所有临床预测模型都应该先问:这个变量的“时间形态”是否对预测任务有意义。
但不是所有模型都需要非静态建模。
关键区别:趋势可以被“摘要”为静态特征
比如一个预测模型在急诊第 6 小时输出脓毒症恶化风险。医生当然关心乳酸、白细胞、血压、肌酐的变化趋势。但模型未必必须是 dynamic model。它可以把前 6 小时的信息压缩成几个特征:
| 原始临床过程 | 可以变成的静态特征 |
|---|---|
| 乳酸连续变化 | 初始乳酸、最高乳酸、6 小时乳酸、下降百分比 |
| 血压波动 | 最低 MAP、升压药使用、低血压持续时间 |
| 肌酐变化 | 入院肌酐、48 小时变化量、是否达到 AKI 标准 |
| CRP / PCT 变化 | 基线值、峰值、斜率、是否持续上升 |
这时模型本身仍然可以是 logistic regression、Cox、random forest、XGBoost 等“静态输入模型”,但它的输入特征已经带有时间信息。
所以先问:
这个变量应该取单点值,还是时间窗摘要,还是趋势,还是完整序列?
什么时候静态模型是合理的?
静态模型不是低级模型。它在很多临床任务中是合理甚至更好的选择。
比如:
1. 决策本来就发生在一个明确时间点。
例如术前评估、急诊首次分诊、入院时风险评估。医生在那个时点只能根据当时已经有的信息做决定。BMJ 的 step-by-step guide 也强调,预后模型只能纳入做出预后判断时可获得的 baseline predictors。
2. 趋势并没有比单点值增加太多信息。
例如某些稳定慢病风险评估中,最近一次 HbA1c、eGFR、LDL 已经足够代表当前状态。强行建趋势模型可能收益很小。
3. 数据质量不支持真正的动态建模。
真实世界数据里的检验时间常常不规则:有人一天测 5 次,有人三天测 1 次;病情越重测得越多。这种“测量频率本身受病情影响”的情况会带来偏倚。动态模型不是自动更真实,反而可能把医疗行为模式也学进去。
4. 样本量和事件数不够。
Steyerberg 反复强调,复杂模型需要更多数据;动态预测模型、joint model、multistate model 的设定和性能评价都比 baseline t = 0 的预测更复杂。书里明确说 dynamic predictions 更复杂,multistate、landmarking、joint models 可能有用,但模型设定和性能评估也更复杂。
什么时候应该考虑非静态或动态模型?
可以用一个实用判断:
如果“变量如何变化”本身就是临床判断的一部分,而不是仅仅反映当前状态,就应该至少考虑非静态表达。
典型情形:
| 临床情形 | 更适合的表达 |
|---|---|
| 预测 AKI | 肌酐变化量、尿量趋势,甚至纵向轨迹 |
| 预测感染恶化 | 乳酸清除率、PCT/CRP 趋势、升压药变化 |
| 预测 MS 复发 | 既往复发次数、距上次复发时间、MRI 新发病灶 |
| 预测糖尿病足 | HbA1c 长期模式、波动、累计暴露 |
| 预测 HIV 死亡 | CD4 纵向变化 |
Steyerberg 书里 joint model 的例子正是这类:HIV 患者根据 longitudinal CD4 cell count 预测死亡,糖尿病患者根据 HbA1c 变化模式预测并发症。书里还说,事件风险可以与 标志物的当前值、变化斜率、曲线下面积相关。
“非静态”分层级:
| 层级 | 医生语言 | 方法学含义 |
|---|---|---|
| 1 | 取一个时间点就够 | baseline/static predictor |
| 2 | 取最近一次或最可靠一次 | clinically selected baseline value |
| 3 | 取一个时间窗摘要 | max/min/mean/slope/change/AUC |
| 4 | 需要重复测量趋势 | longitudinal features / landmarking |
| 5 | 需要随时间不断更新预测 | dynamic prediction / joint model / multistate model |
大多数真实世界临床预测研究其实会落在第 2–3 层,而不是第 5 层。
最后提醒
临床数据建模不是先问“用不用机器学习”,而是先问:
我的临床问题是什么?
我的预测时间点在哪里?
我的数据是一张表,还是一段过程?
我需要排序、分类,还是可用于临床决策的风险概率?
模型只是工具。
真正决定研究质量的,是临床问题、时间结构、变量定义、验证方式和结果能不能被医生使用。
想进一步了解的链接
TRIPOD+AI:临床预测模型报告规范
https://www.tripod-statement.org/
BMJ TRIPOD+AI statement
https://www.bmj.com/content/385/bmj-2023-078378
scikit-learn:机器学习入门工具
https://scikit-learn.org/
scikit-learn probability calibration:概率校准
https://scikit-learn.org/stable/modules/calibration.html
scikit-learn TimeSeriesSplit:时间序列交叉验证
https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.TimeSeriesSplit.html
statsmodels GLM:广义线性模型,包括逻辑回归等
https://www.statsmodels.org/stable/glm.html
lifelines:Python生存分析工具
https://lifelines.readthedocs.io/
PyTorch:深度学习工具,可用于LSTM等神经网络
https://pytorch.org/