社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Git

25年Lancet Digit Health因果深度学习文章-2

灵活胖子的科研进步之路 • 1 周前 • 31 次点击  
文章首页
文章首页
开源代码库
开源代码库
思维导图
思维导图

因果深度学习模型:REACT(基于因果蒸馏的实时评估与预测模型)

文献中已广泛讨论,若深度学习模型基于变量间的“相关性”而非“因果性”构建,会导致预测结果不稳定,且难以有效泛化(参见附录第4页)[29]。为解决这一问题,我们提出了REACT模型——该模型将为时间序列数据定制的显式因果图[30,31]融入深度神经网络,从高维数据集中提取出与心脏手术相关急性肾损伤(CSA-AKI)相关的格兰杰因果变量(参见附录第7-9页)。

具体而言,我们设计了“双阶段学习策略”,以揭示稳定的潜在因果结构并实现更具泛化性的预测结果:

  1. 预测阶段:模型以患者当前及历史数据为输入。其中,动态时间序列数据(如心率、实验室指标时序变化)通过长短期记忆网络(LSTM)处理,以捕捉时序特征;静态数据(如年龄、合并症)则通过多个全连接层处理。两类数据生成的特征经聚合后,再通过额外的全连接层和SoftMax层,最终输出未来发生CSA-AKI的风险评分。

  2. 因果发现阶段:模型通过对所有变量进行反事实推理来模拟干预,以此评估各变量的格兰杰因果效应(因果学习中的核心概念,用于判断某一时间序列的历史数据能否预测另一时间序列的未来数据,进而体现变量间的方向性影响;参见附录第4-5页),并逐步提炼因果变量以剔除虚假关联变量。在该阶段,模型会迭代移除对预测影响极小的变量:通过随机掩盖输入变量来模拟干预(参见附录第7-9页),并测试模型性能是否因此下降——若某变量移除后,预测精度几乎无损失,则判定该变量为非因果变量并从模型中剔除。

通过上述方式,模型将初始的1328个变量逐步蒸馏为6个影响最强的因果因素。这两个阶段会进行迭代训练,这两个阶段会协同训练(见图2)。该模型的损失函数同时包含预测误差与因果正则化误差,通过迭代优化以实现损失最小化。 在因果发现阶段,若某一变量的变化不再对模型性能产生影响(即其格兰杰因果效应低于阈值λ),则该变量会被排除在预测阶段的输入之外。然而,在神经网络参数层面,模型仍会保留所有变量(包括已排除的变量)对预测精度的影响(相关数学细节与假设详见附录第10页)。

图 2:REACT 模型总览
图 2:REACT 模型总览

(图表各板块说明)

  • A板块:数据库预处理
    原始数据库来源于接受心脏手术患者的电子健康记录,后续处理步骤包括:合并名称不同但指代相同的项目、剔除出现频率极低的变量、转换单位与时间戳、排除异常数据、将文本形式的检验结果映射为实数值。

  • B板块:患者个体时间序列构建
    从预处理后的数据库中提取每位患者的动态变量,随后将其采样为时间间隔为2小时的结构化时间序列。每个变量的存在与缺失状态通过额外特征进行标识。在预测时间点(t_{0}),模型输入包含从(t_{0})前7天至(t_{0})前12小时的所有特征,并在(t_{0})时刻生成预警。在每个评估时间点,结合多个预测窗口(即未来6小时、12小时、24小时或48小时内发生心脏手术相关急性肾损伤)确定心脏手术相关急性肾损伤(CSA-AKI)标签。所有“数据-标签”对被划分为训练集、内部(或分布内)验证集和外部(或分布外)测试集。

  • C板块:因果深度学习模型
    REACT模型包含两个迭代阶段:预测阶段负责在每个时间点预测CSA-AKI风险;因果发现阶段则利用固定的预测模型学习因果图,通过模拟干预来复刻随机对照试验,逐步提炼因果变量以剔除虚假关联变量。

  • D板块:模型评估
    本研究方法仅以6个因果变量作为输入,评估指标包括受试者工作特征曲线下面积(AUROC)、精确率-召回率曲线下面积(AUPRC)及其他标准。此处排除了模糊标签(即相应预测窗口内无血清肌酐检测数据的情况)。

缩略词说明:

  • AKI=急性肾损伤(acute kidney injury)
  • AUPRC=精确率-召回率曲线下面积(area under the precision-recall curve)
  • AUROC=受试者工作特征曲线下面积(area under the receiver operating characteristic curve)
  • BUN=血尿素氮(blood urea nitrogen)
  • CSA-AKI=心脏手术相关急性肾损伤(cardiac surgery-associated acute kidney injury)
  • LDH=乳酸脱氢酶(lactate dehydrogenase)
  • MB=心肌带(myocardial band)
  • REACT=基于因果蒸馏的实时评估与预测模型(Real-time Evaluation and Anticipation with Causal Distillation)。

AI知识补充

格兰杰因果效应(Granger Causal Effect):定义、核心逻辑与在REACT模型中的应用

格兰杰因果效应是时间序列分析中用于判断变量间时序因果关联的核心概念,由计量经济学家克莱夫·格兰杰(Clive Granger)提出,其核心思想是“若一个变量的历史信息能显著提升对另一个变量未来变化的预测精度,则前者为后者的格兰杰原因”。它并非哲学意义上的“绝对因果”,而是聚焦于“时间维度上的预测关联性”,尤其适用于医疗等动态数据场景(如患者术后生理指标变化与并发症风险的关联分析)

一、核心定义:从“预测能力”界定因果关联

在时间序列数据中(如患者术后每2小时的血清肌酐、心率等连续监测数据),若变量X的历史观测值(如过去12小时的血清肌酐变化)能让模型对变量Y的未来值(如未来24小时是否发生CSA-AKI)的预测误差显著降低,且这种提升无法通过其他变量(如心率、尿素氮)的历史信息实现,则称“X对Y存在格兰杰因果效应”。

  • 关键特征
  1. 时序依赖性:必须满足“原因变量(X)的变化先于结果变量(Y)的变化”,这与临床中“生理指标异常先于疾病发生”的逻辑一致(如血清肌酐升高先于CSA-AKI确诊)。
  2. 预测增量价值:X的历史数据需为Y的预测“提供额外信息”,而非重复其他变量的预测作用(例如,若仅用尿素氮已能精准预测CSA-AKI,而加入尿酸后预测精度无提升,则尿酸对CSA-AKI无格兰杰因果效应)。
  3. 非绝对因果:不代表“X直接导致Y”,而是“X的变化包含Y未来变化的关键信号”,更贴近医疗场景中“指标异常是疾病前兆”的实际关系(如乳酸脱氢酶升高是肾脏缺氧损伤的信号,而非直接导致AKI的原因)。

二、判断逻辑:如何验证格兰杰因果效应?

以REACT模型中“血清肌酐(X)对CSA-AKI(Y)的因果效应判断”为例,核心步骤如下:

  1. 构建基准预测模型:仅用除X外的其他变量(如年龄、尿素氮、心率)的历史数据,训练预测Y(未来48小时CSA-AKI风险)的模型,记录预测误差(如均方误差MSE₁)。
  2. 构建加入X的扩展模型:在基准模型中加入X的历史数据(如过去72小时的血清肌酐时序变化),重新训练模型并记录预测误差(MSE₂)。
  3. 比较误差差异:若统计检验(如F检验)显示MSE₂显著小于MSE₁,且这种差异无法由随机波动解释,则判定“血清肌酐对CSA-AKI存在格兰杰因果效应”;反之则无。

在REACT模型中,这一逻辑被进一步升级为“动态干预验证”:通过随机掩盖X的历史数据(模拟“X未发生变化”的干预场景),若模型预测精度显著下降,说明X对Y的预测至关重要,即X的格兰杰因果效应显著。

三、在REACT模型中的具体应用:筛选核心因果变量

REACT模型将格兰杰因果效应作为“变量蒸馏”的核心依据,解决了传统深度学习“变量冗余、泛化性差”的问题,具体应用体现在两个关键环节:

  1. 变量筛选阈值(λ)设定
    模型预设一个格兰杰因果效应阈值λ(如“预测误差降低率<5%”),对1328个初始变量逐一验证:

  • 若某变量(如“术后体温”)的格兰杰因果效应低于λ(即移除该变量后,CSA-AKI的预测精度几乎无下降),则判定为“非因果变量”,排除在预测阶段的输入之外;
  • 最终仅保留6个格兰杰因果效应高于λ的核心变量(年龄、血清肌酐、尿素氮、尿酸、乳酸脱氢酶、肌酸激酶),这些变量的历史数据能持续为CSA-AKI预测提供关键增量信息。
  • 损失函数中的因果约束
    REACT的损失函数不仅包含“预测误差”(衡量风险评分与实际AKI发生的偏差),还加入“因果正则化误差”——该误差项会惩罚“对格兰杰因果效应强的变量赋予低权重”的模型参数,强制模型优先依赖因果效应显著的变量,避免因“虚假关联”(如“术后检查频率”与AKI的偶然关联)导致的预测偏差。

  • 四、与“传统因果”的区别:为何适合医疗时间序列数据?

    维度
    格兰杰因果效应
    传统哲学/生理因果(如“吸烟导致肺癌”)
    核心逻辑
    基于“预测增量价值”的时序关联
    基于“直接作用机制”的绝对因果关系
    数据依赖
    需时间序列数据(变量随时间的动态变化)
    可基于横截面/实验数据(如随机对照试验)
    临床适配性
    契合“指标异常→疾病发生”的动态预警需求
    更适用于解释疾病发病机制
    结果解读
    “X是Y的预警信号”
    “X是Y的直接原因”

    在CSA-AKI预测场景中,医生更需要“通过早期指标变化预警疾病”而非“解释疾病发生的根本机制”,因此格兰杰因果效应的“时序预警属性”比传统因果更具临床实用价值——例如,REACT通过血清肌酐的历史变化(格兰杰原因)预警CSA-AKI,无需完全阐明肌酐升高与肾脏损伤的分子机制,即可为临床干预争取时间。

    总结

    格兰杰因果效应为REACT模型提供了“从高维时序数据中筛选关键变量”的科学依据,其核心是通过“预测能力验证”识别变量间的时序关联,既避免了传统统计工具“过度简化因果”的局限,又解决了常规深度学习“混淆关联与因果”的问题。在医疗场景中,这种基于“时序预警信号”的因果判断逻辑,更贴合临床“早发现、早干预”的需求,也是REACT模型能在跨中心、跨人群验证中保持稳定性能的关键技术之一。


    模型评估

    我们采用受试者工作特征曲线下面积(AUROC)和精确率-召回率曲线下面积(AUPRC)评估模型性能。AUPRC在不平衡数据集中尤为重要,因为它聚焦于与阳性类别相关的性能表现,在处理稀有事件时能提供更具参考价值的衡量标准。AUROC和AUPRC的95%置信区间(CI)通过自助法(bootstrap method)计算得出。我们还报告了模型的敏感性(sensitivity)、特异性(specificity)、阳性预测值(positive predictive value)和阴性预测值(negative predictive value)。

    为比较不同模型的鉴别能力,我们采用德龙检验(DeLong’s test)对相关的受试者工作特征曲线进行分析,若95%置信区间无重叠,则认为模型间的性能差异具有统计学意义。模型的校准度(calibration)通过布里尔分数(Brier score)和校准图(calibration plot)进行评估。

    我们将REACT模型与四种算法进行了性能对比,分别是极端梯度提升树(XGBoost)、多层感知器(multilayer perceptron)、长短期记忆网络(LSTM network)和Transformer模型。所有模型均经过微调与优化,超参数搜索的详细信息参见附录第11页和第19页。此外,我们还按年龄、性别、手术类型和入院年份进行了亚组分析,以探究模型在不同患者人群中的性能表现。

    模型应用

    为方便临床应用,我们开发了REACT模型的网页版计算器和小程序(详见附录第54页),供临床医生使用。这些工具已在中国人民解放军总医院第一医学中心和南京鼓楼医院完成部署与验证。

    医生可通过手动输入,或上传经光学字符识别(OCR)技术处理的实验室报告图像,录入患者的人口统计学信息、手术细节和实验室检查结果。所有数据均会进行标准化处理,时间戳将自动记录。用户可请求预测患者未来6小时、12小时、24小时或48小时内发生心脏手术相关急性肾损伤(CSA-AKI)的风险,通常在获取新的检查结果时或医护交接期间触发预测。该系统允许调整预警阈值,以减少轻度AKI的假阳性预测和中重度AKI的假阴性预测。

    统计分析

    分类变量采用卡方检验(χ² test)或费希尔精确检验(Fisher’s exact test)进行分析;连续变量则根据莱文检验(Levene’s test)的方差齐性结果,酌情采用学生t检验(Student’s t test)或韦尔奇t检验(Welch’s t test)进行组间比较。所有检验均为双侧检验,P值小于0.05被认为具有统计学意义。

    此外,我们还比较了首次确诊为1期CSA-AKI的队列与首次确诊为2期或3期CSA-AKI的队列之间的住院死亡率,采用风险比(risk ratio)及95%置信区间进行描述。所有统计分析均使用R软件(4.1.2版本)完成。

    to be continued

    相关课程推荐

    国内首发-基于AI辅助Python编程的机器学习与因果推断在医学研究中的应用培训班

    Python社区是高质量的Python/Django开发社区
    本文地址:http://www.python88.com/topic/187465