1f4bb

【医生向】临床预测模型:收集数据“切片”还是数据趋势?

2026/06/16 发布 2026/06/16

在进入介绍之前,先说一个理念:医生做临床数据科研,并不等于要自己变成算法工程师。但是,“不同的方法适用于不同的情景”,对于这个事实要心中有数。

真正的第一步,正是在医生自己手上——把感兴趣的临床问题说清楚。手里的数据是什么样的?某个指标是采集一个时间点的,还是随着病程不断变化而持续采集?

比如:

“我有一批患者资料,能不能建个模型预测某个结局?”

但真正开始分析前,需要先问一个更基础的问题:

我的数据到底是什么形态?

是每个患者一行资料,每个检查只取了某个时间点的结果?
还是每个患者有很多次检查,可以呈现一个趋势?
是只看入院时状态?
还是要看病情随时间变化?

这些问题会决定你应该用什么模型。

因为,医生最不可被替代的工作是把临床逻辑、数据来源、时间顺序和研究目标先梳理出来。后续用数据科学的方法,交给统计师、数据科学家、工程师合作来完成。否则直接用数据科学(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/

还没有评论,赶紧评论下,抢个沙发?