怎样判断一个诊断(风险预测)模型的好坏?

有一类研究看似简单,其实水挺深的。

比如你觉得前列腺特异性抗原(PSA)用来筛查前列腺癌不准确,你收集临床样本做了个癌和癌旁组织的lncRNA检测,筛选出差异表达的,建立回归模型,看它们对前列腺癌的预测作用,再做个ROC曲线,哎哟,AUC > 0.75,太棒了3-5分在握!

但是转眼看别人好像也差不多嘛,对某现有诊断或风险预测方法不满意,根据既往零散报道的风险因素收集一些临床资料,建立回归模型然后ROC一下,为什么人家能冲上四大医刊,甚至被迫不及待写进指南呢?仅仅因为人家有N个中心上万个样本量吗?不,你肯定没在意另一些分析方法。

人家的诊断(预测)模型好,你的可能也不赖,但人家把它的好处说得很清楚、很有技术范呀,编辑和审稿人就喜欢这样。

评价一个模型的好坏,不仅关乎能发多少分的文章,也关乎临床医生的决策。近期JAMA上的一篇文章专门讨论了这个问题,我们一起来琢磨一下。

模型的区分度和校准度

一个好的预测模型应该能针对某个结局,把一群人的风险高低区分开来,这就是区分度(discrimination)。它跟患者在人群中的分布特征有关,模型中纳入的自变量(如性别、年龄、某些实验室检查等)如果有异质性,那么模型的区分度就好,否则就差。

区分度一般以我们熟悉的ROC曲线下面积(AUC)来评价,或称C统计量(C-statistics)。AUC越高,模型对高低风险人群的区分度越好。一个广泛接受的评判标准是,AUC在0.6以下为低区分度,0.6 – 0.75 是中区分度,0.75以上为高区分度。

但一个区分度很好的模型,却可能有着较差的校准度(calibration),或称拟合优度(Goodness of fit)。比如它能判断一个人发生某疾病的风险是另一个人的5倍,它判断这两人的风险分别为5%和1%,而实际上两人的风险是50%和10%,那这个模型也挺离谱的,这就是校准度不好。

模型的校准度可以用Hosmer-Lemeshow检验(H-L检验),若结果得到显著统计学意义,则表明预测值与观测值之间(即模型和真实之间)有差异。

但H-L检验有其不足。有统计学差异只能提示这个模型整体上跟观测值有差异,却无法展示更多细节。做出校准曲线来有可能会看到这样一种情况:

这是MAGGIC心衰风险评分量表的校准曲线,其用于评价心衰1年死亡风险。黄色曲线为模型预测值,蓝色带有误差线的点为观测值。可见它们前面一段低风险时吻合得不错,而有轻微高估;但30%开始,模型预测的风险低于实际观察值10%左右,自此拉开差距。

这个模型在外部验证集中检测的时候,AUC为0.77。像这种情况的模型是否毫无用处呢?

如果有其他研究表明(或行业内达成共识),风险高于20%的时候就一定要采取某种干预,那么后面的差异其实影响不大,这都是可以在讨论中Argue一下的,深入分析自己的模型的价值和适用范围,也可圈可点。

区分度和校准度对一个模型来说都是很重要的评价,许多新开发的模型没有得到充分的评价,就只好流散于苍茫文献海,泯然一滴水,后人遇到了还要辛苦甄别。有一项关于心血管系统风险预测模型研究的系统综述发现,只有63%的模型汇报了区分度,而汇报校准度的更少,才36%。

你的模型要和别人的模型来一场PK

如果你开发的风险预测模型是为了解决一个全新的问题,展示自己好也就够了。但更多时候是希望能改进现有的解决方案,那么当然还要表明它比现有的好(至少某一方面),才能有发表的机会呀。

区分度比较两者的AUC是可以的,但没什么细节。校准度的比较则可用赤池信息准则(Akaike Index Criterion, AIC)或贝叶斯信息准则(Bayesian Index Criterion, BIC),其值越低,校准度越好,但同样没什么细节,可能相对较好的那个模型离真实情况还是挺远的。但AIC和BIC见得更少了。

这里再重点介绍一种近年来应用愈发增多的指标,听说有的小伙伴已经遇到过审稿人要求返修做这个分析了,就是净重新分类指数(Net Reclassification Index, NRI)

听名字,这意思就是旧模型把一群人分为高风险和低风险,新模型会把其中几个人挪挪窝,有的挪对了有的挪错了,“挪对的 – 挪错的”就是净重分类。指数嘛,再除以总人数的百分比咯。

但还要分成两拨来看,即观测发生结局事件的和未发生结局事件的,因为它们分别代表假阴性和假阳性的概率。还是在一个情景中说明吧。

相加NRI(additive NRI)的值可以从200 ~ -200,即新模型完全分类正确(所有低风险的人都未发生结局事件,且所有高风险的人都发生了结局事件)为200,反之完全分类错误为-200。

它主要的局限性就是没有考虑发生与不发生事件的两拨人在总体中的分布情况。绝对NRI(absolute NRI)以总体为分母,则回避了这个局限。

相加NRI用得多一点,但其实它们各有意义,应该兼看。再看两个例子来理解它俩的差别吧。

例1: 样本20000人,观察下来,发生与未发生结局事件的两拨人各有10000。下图绿色表示正确重新分类,粉色表示错误重新分类,灰色表示没有重新分类。

计算下来,相加NRI为12,是正值;绝对NRI是6%,也是正值,如图下方的表格所示。也就是说,虽然未发生结局事件的有300人被错误重新分类,但总体上来说还是利大于弊的。

例2:样本是11000人,观察下来,发生与未发生结局事件的人比例不再是1:1了,分别为1000人与10000人。

如表所示,这回相加NRI和上边一样是12,还是正值。如果光看相加NRI,似乎新模型还是个好模型。但看绝对NRI,原来是个负值。

再看看细节,新模型对发生了结局事件的人做了更好的重分类,可遗憾的是,这拨人所占比例更小;而对于未发生结局事件的人,其重分类效果并不好,这部分人占的比例又比较大,最终绝对NRI是负的,暴露了新模型的局限性。

下面是一个研究中的真实案例,情况跟上边的例2差不多。评价术后发生心梗或心源性死亡的风险,原来有一个评分量表(Revised Cardiac Risk Index, RCRI),此为旧模型。研究者想看看加上冠脉造影(CCTA)能不能更好地预测风险,即CCTA + RCRI为新模型。

观察下来,结局发生与不发生在总体中的分布为7.7% : 92.3%,统计重新分类的情况,计算两个NRI,出现了相加NRI为正值、绝对NRI为负值的情况。

发生这种情况,又要拋弃新模型咯?粗看或许的是,但其实还有另一个讨论思路,这个思路在许多研究中都适用,就是假阴性与假阳性哪个后果更严重。

发生结局事件的人,当初被错误地分到低风险组,就是假阴性,让病人和医生都放松警惕,可能错过了及时干预的机会。未发生结局事件的人,当初被错误地分到高风险组,就是假阳性,让人提心吊胆草木皆兵,可能过度干预造成额外的负担。

如果结局事件挺严重的,比如本例中的心梗或心源性死亡,就算风险低我也想要极力避免,要干预,那么假阳性较多的模型也有其价值。如果结局事件不那么严重,或者即使发生了还有较好的补救方案,那么当初测试时它低估了我的风险我也不是太介意,假阴性多一点的模型也能接受。

总之,如果你的分析方法能看到更多细节,也就给了你更多更深入分析讨论的机会,为自己的研究成果找到亮点。

关于假阴性与假阳性的权衡,还有其他指标,比如净受益率,可以做决策曲线来分析。这个我们之前有过介绍,这里就不多说了,自己来复习→_→《ROC曲线老了,快来围观新晋小生DCA曲线!》

参考文献:Alba, A. C. et al. Discrimination and Calibration of Clinical Prediction Models: Users’ Guides to the Medical Literature. JAMA 318, 1377–1384 (2017).

### SVR 模型误差分析的方法和工具 #### 1. 理解SVR模型中的误差概念 支持向量回归(Support Vector Regression, SVR)旨在找到一条能够最好拟合数据的超平面,同时允许一定范围内的偏差。这种“宽容”的特性由ε-insensitive损失函数定义,在此范围内不惩罚任何预测错误[^1]。 #### 2. 使用交叉验证评估性能 为了有效估计SVR模型的表现并减少过拟合风险,通常采用k折交叉验证技术来分割训练集与测试集多次迭代计算平均得分作为最终评价指标[^3]。 ```python from sklearn.model_selection import cross_val_score from sklearn.svm import SVR svr = SVR() scores = cross_val_score(svr, X, y, cv=5) print(f'Cross-validation scores: {scores.mean():.3f} (+/- {scores.std() * 2:.3f})') ``` #### 3. 计算常见回归度量标准 对于给定的数据集X_test及其对应的真值y_true,可以通过多种方式衡量预测效果的好坏: - **均方根误差 (RMSE)**:反映的是观测值与其真实值之间的偏离程度; - **决定系数 R²** :表示因变量的变化中有多少比例能被自变量解释; 这些统计量可通过`sklearn.metrics`模块轻松获取。 ```python from sklearn.metrics import mean_squared_error, r2_score predictions = svr.predict(X_test) rmse = np.sqrt(mean_squared_error(y_true, predictions)) r2 = r2_score(y_true, predictions) print(f'Root Mean Squared Error: {rmse}') print(f'R-squared Score: {r2}') ``` #### 4. 可视化残差图辅助诊断 绘制实际输出减去预测值得到的残差分布情况有助于直观判断是否存在系统性的模式未被捕获,进而指导改进措施的选择。 ```python import matplotlib.pyplot as plt residuals = y_true - predictions plt.scatter(predictions, residuals) plt.xlabel('Predicted Values') plt.ylabel('Residuals') plt.axhline(0, color='red', linestyle='dashed') plt.show() ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值