社区所有版块导航
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学习  »  机器学习算法

机器学习!LCGA+XGBoost+282例样本预测

护理统计随笔 • 20 小时前 • 24 次点击  
亲爱的读者朋友,中午好!
以前我们公众号陆续讲过两块内容:一块是潜在类别增长分析(LCGA)这类"把人分成几类"的方法,另一块是机器学习预测模型。后台有同学问过,这两个东西能不能放在一篇研究里用。
巧了,最近看到一篇刚上线的论文,正好把这两个方法摆在同一项研究里用,而且分工特别清楚。今天就拿它当例子聊聊。

01
这项研究要解决什么问题?

先看背景。耐多药/利福平耐药结核(RR/MDR-TB)合并 HIV 感染,是公认最难啃的一块。治疗方案长、药物不良反应重,患者还要同时应付抗病毒治疗。
这其中最要命的是依从性。药吃不够,治不好,还会催生更严重的耐药。
过去评估依从性,大多靠患者自己说,或者数药片。这些都不太准。这项研究用上了电子监测设备(EDM):药盒里装芯片,每次打开都有记录,能实时传回来。
研究团队想知道两件事:
一是,最早在哪一周,就能比较靠谱地预判这个患者的结局?
二是,患者的用药轨迹能分成几类,哪一类最危险?
你看,这两个问题指向完全不同的答案:一个问"什么时候",一个问"谁"。这也决定了它们要用不同的方法。

02
两个方法,怎么分工?

第一个问题,用时间感知 XGBoost(time-aware XGBoost)。
这里的"时间感知"是关键,也是我觉得最值得学的地方。常规机器学习建模,随便把样本打乱切训练集和测试集就行。但纵向数据不能这么干:你如果拿后面的数据去预测前面的,模型表现会虚高,这叫时间泄漏。
作者是这么处理的:
  • 按入组时间顺序切分,前 70% 训练、后 30% 验证,而不是随机切。
  • 在第 k 周做预测时,只用第 k 周之前累积的信息,绝不偷看未来。
  • 每周的特征由前 3 周算出三个量:均值、方差、斜率(观察值不足 2 个时斜率不计算)。
还有个细节容易被忽略。研究里有些患者很早就死亡、治疗失败或者失访了,这些人如果直接删掉,样本就只剩"活得够久的人",会严重高估模型表现。作者用了逆概率删失加权(IPCW),从第 2 周开始给留下的样本加权,把这部分偏倚补回来。
至于"最早可操作窗口"怎么定,作者给了一个很实在的标准:AUROC > 0.80 且灵敏度 > 0.80 的第一周。不是拍脑袋,也不是只看 AUC,而是两个指标同时达标。
第二个问题,用潜在类别增长分析(LCGA)。
LCGA 的作用是:不看人群平均趋势,而是找出"存在几种不同的变化轨迹"。做过的同学知道,选几类不是拍脑袋的,要看 BIC、Entropy、Lo-Mendell-Rubin 检验。
这篇文章最终保留了三类别模型,指标都摆出来了:BIC = -41686,Entropy = 0.947,LMR 检验 p < 0.001,三类别人数分别是 171、78、33(都超过 10%)。Entropy 接近 0.95,说明分类很干净。
一句话总结这两个方法的分工:XGBoost 找时机,LCGA 找对象。

03
结果:第 4 周是道坎

先看预测时点。
基线(第 0 周)时模型还很一般:AUROC 0.77,灵敏度只有 0.54。也就是说刚入院时,光靠基线信息基本看不出谁会出问题。
到第 4 周,两个指标同时达标:
  • AUROC 0.80(95% CI 0.69–0.90)。
  • 灵敏度 0.80(95% CI 0.64–0.96)。
  • 特异度 0.74,F1 0.68。
  • Brier score 0.16,校准不错。
第 8 周模型最好(AUROC 0.89,F1 0.75),但作者要的是可操作性:早一周就能多一周干预的时间,第 4 周够用了。
再看轨迹。LCGA 把 282 人分成三类:
第一类,高依从组(171 人):全程接近满勤,中位依从性 98%。
第二类,中等但稳定组(78 人):中位依从性 93%,略有起伏但整体平稳。
第三类,早期下降组(33 人):一开始就低,而且持续往下掉,中位依从性只有 81%。
结局差距出来了:
类别
有利结局
死亡
高依从组
77%
12%
中等稳定组
76%
13%
早期下降组
55%
36%
有利结局三组比较 p = 0.023,死亡 p = 0.002。Cox 模型校正了年龄、BMI、病毒载量、住院情况等一堆变量之后,早期下降组的不良结局风险依然显著更高。
死亡率高出约三倍。
这里有个反直觉的地方值得琢磨:中等稳定组(93%)和高依从组(98%)的结局几乎一样(76% vs 77%)。差 5 个百分点的依从性,结局却没差别。作者的解释是,含贝达喹啉的方案本身够强,对早期依从性的小波动有一定"宽容度"。
真正危险其实是一开始就往下掉。
还有个数据支持这个判断:第 4 周的依从性,与紧接着的第 5–8 周依从性相关性达到 ρ = 0.87(p < 0.001),到第 24 周仍有 0.70。早期什么样,后面大概率还是什么样。

04
我们能学到什么?

第一,方法框架可以直接迁移。 EDM 实时监测 + 机器学习找窗口 + LCGA 分轨迹,这套组合不只适用于结核。高血压、糖尿病、抗凝治疗、器官移植后免疫抑制剂——凡是"长期用药 + 依从性决定结局"的场景都能套。
第二,外部验证是现成的口子。 作者自己在局限里写明了:282 例样本量不算大,且仅来自南非夸祖鲁-纳塔尔省,需要外部验证。换个人群、换个地区做验证研究,是标准且稳妥的选题。
第三,"第 4 周检查点"本身就是干预研究题目。 现在证明的是"第 4 周能预测",但"在第 4 周介入能不能真的改善结局"还没有答案。作者明确说这需要实用性临床试验来验证。从预测到干预,这一步谁先做出来谁就有分量。
第四,方法细节值得抄。 我特别建议大家去看看原文处理删失和切分数据集的那部分。很多人做纵向预测模型,随手随机切分训练集,结果看着漂亮,实际是泄漏。这篇文章的做法,是按时间顺序切分、只用历史信息、IPCW 加权。这些是可以照搬到自己研究里的规范动作。

05
几句实话

这篇文章也不是没有短板,结合文章的局限性,以及我个人的看法:
一是EDM 测的是"开盒",不是"吃药"。设备记录的是药盒被打开,患者有没有真的把药咽下去,它不知道。所以依从性大概率被高估了。不过话说回来,这已经比自我报告和数药片强不少。
二是样本量与外推。282 例、单一地区、高负担人群。要在国内推广,得先做本地验证。
三是残余混杂。心理健康、病耻感、伴随用药情况这些都没测,而这些恰恰可能影响依从性。
四是观察性研究的老问题:它证明了"早期轨迹能预测结局",但没证明"干预早期轨迹能改变结局"。这两件事之间的差距,正是下一个研究的机会所在。
我个人最喜欢这篇的地方,是它没有堆方法,而是先想清楚"我要回答哪两个问题",再给每个问题配一个合适的工具。方法服务于问题,不是为了用而用。这个顺序希望做科研的同学能体会到。
如果你也在做纵向数据、依从性研究或者预测模型,欢迎在评论区聊聊你卡在哪个环节。
好了,本期内容就到这里。

06
参考文献

[1] Early adherence predicts treatment outcomes and mortality in people living with HIV and multidrug-resistant tuberculosis. Annals of Epidemiology, 2026
本文仅供学习、分享使用,如有侵权,请联系我们删除,谢谢。
祝你在护理创新的星辰大海中,发现属于你的新大陆!
本文编者:北游,微信:hulitongjisuibi

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