大家好,我是北游。没想到预测模型的meta分析越来越热门了,以至于一直有网友通过微信私聊咨询我具体方法。
其实,早在去年,我们就介绍了临床预测模型系统评价的基本思路与步骤,分享了具体的实现方法(R软件版)。当时笔者也隐约觉得这种类型会有一定的热度,但似乎还是低估了它。鉴于很多朋友不知道具体做法,在这里,我就把以前的帖子拿出来,送给今年才关注我们公众号的广大网友。在此之前,奉上以前写的相关知识的链接:
1、告别群魔乱舞的时代!首个预测模型系统评价的报告学清单新鲜出炉!
简单说明下:
第一篇介绍了全球首个预测模型系统评价报告规范。
第二篇是笔者自己对预测模型系统评价的所见所闻,写在首个报告规范还没有出现之前,可能有些许错误或不完整的地方,仅供参考。
第三篇同样如此,属于理论层面的东西。
接下来,附上去年分享过的预测模型meta分析步骤(注意:仅包含数据分析,即对AUC或C统计量以及校准指标的meta合并方法,其他系统评价流程请自己阅读报告清单)。
注意:AUC的合并有一定的要求,请尽量采用验证集上的结果,不要用训练集的。
一、Meta分析工具与示例介绍
1、工具
我们需要通过R软件使用metamisc包,该包是学者Debray TP的团队开发的,在国际上应用颇受欢迎。
此包内置的valmeta函数是用于评价预测模型性能的meta分析函数,可以实现对C统计量以及校准度的合并,其中校准度的合并是通过汇总O:E比率进行估计(校准度指标无法获取)。
先安装此包,然后导入,打开帮助文档,看看valmeta函数的具体用法。
Usage
valmeta(
measure = "cstat",
cstat,
cstat.se,
cstat.cilb,
cstat.ciub,
cstat.cilv,
sd.LP,
OE,
OE.se,
OE.cilb,
OE.ciub,
OE.cilv,
citl,
citl.se,
N,
O,
E,
Po,
Po.se,
Pe,
data,
method = "REML",
test = "knha",
verbose = FALSE,
slab,
n.chains = 4,
pars,
...
)
这是做C统计量合并的用法,参数非常多,简单解释下:
cstat是C统计量(二分类预测模型中就是AUC值),cstat.se是C统计量的标准误差,cstat.cilb是C统计量的置信区间下界限,cstat.ciub是C统计量的置信区间上界限,cstat.cilv用于指定置信区间的水平,比如0.95=95%ci。
OE是实际观测到的事件数与预测事件数之比,OE.se是OE的标准误差,method是指定拟合模型是固定效应还是随机效应,默认为REML随机效应;slab是研究的文字标签,n.chains用于贝叶斯,其余也是类似的,就不一一解释了。
这么多参数,是不是意味着需要录入这么多数据?
不需要,我们不需要也无法收集到这么多的数据,实际上也没有几篇原始研究会报告这么多指标,有些预测模型甚至只会给出1个C统计量,其余全部缺失。
2、数据集
接下来,我们看下R包开发者示例用的数据集,进一步了解该如何录入数据。
该数据集包含对欧洲心脏手术风险评估系统(EuroSCORE,是一个预测模型 )在心脏手术患者中的预测性能的估计。结果是基于原始开发研究和Guida等人确定的22个验证,共23行数据。注意,这些验证研究都是基于EuroSCORE这同一个模型的。
可以看到,这个数据集中一些指标有很多缺失值,可见很多数据无法从原始的预测模型研究获得的,所以就需要我们利用软件结合已有的数据去进行估计。
二、代码演示
提示:仅演示基于频率的二元结局模型的meta分析,基于生存资料的模型与贝叶斯方法暂不介绍。
1、对C统计量进行Meta分析
# 先安装并导入metamisc包
library(metamisc)
#导入数据集
data(EuroSCORE)
# 拟合数据
fit <- valmeta(cstat=c.index, cstat.se=se.c.index,
cstat.cilb=c.index.95CIl,
cstat.ciub=c.index.95CIu,
cstat.cilv=0.95, N=n, O=n.events,
slab=Study, data=EuroSCORE)
# 绘制C统计量的森林图
plot(fit)
由森林图可知,汇总C统计量为0.79[0.76,0.81],近似预测区间为0.79[0.68, 0.87],预测区间还是有些宽的。
当提取的数据不完整时,也没关系,可以尝试执行下面的代码进行估计。
valmeta(cstat=c.index, N=n, O=n.events, slab=Study,
data=EuroSCORE)
能拿到跟前面几乎一样的结果。
2、通过O:E对校准度进行合并
(1)前面的推文解释过,校准度一些参数很难获取,所以有学者建议采用O:E反映模型的校准情况。用法也比较简单:
# 试试看
valmeta(measure="OE", O=n.events, E=e.events, N=n,
slab=Study, data=EuroSCORE)
可以看到,O:E=1.10, 意味着实际发生的事件比预测的高,表示该模型有点低估发生风险。预测的95%CI是[0.90, 1.36], 95%预测区间是[0.43, 2.86]。
(2)去掉总样本和研究的标签,照样可以正常计算汇总O:E,如下:
valmeta(measure="OE", O=n.events, E=e.events, data=EuroSCORE)
略微有些差异,但基本是一样的。
(3)当无法收集到事件数O与非事件数E的时候,可以通过对应的概率来估算。
valmeta(measure="OE", Po=Po, Pe=Pe, N=n, data=EuroSCORE)
此时就有明显差异了。总体来说,这个包的用法挺简单,很方便研究者分析数据,大家可以自由体验。
另外,本公众号定期分享一些护理科研与统计有关的新内容,如果大家有想要了解的知识,可以后台私信,也可以加交流群,我看到消息后会汇总需求。
最后,提醒下大家,本文仅供参考,不保证步骤完全正确,简单测试发现过年的代码今日仍可以跑起来,但我没有去认真验证原作者是否调整了R包,功能是否有变请各位注意甄别。
喜欢此文的朋友可以帮忙点个赞吗?谢谢
参考文献:
[1]Debray TP, Damen JA, Snell KI, Ensor J, Hooft L, Reitsma JB, Riley RD, Moons KG. A guide to systematic review and meta-analysis of prediction model performance. BMJ. 2017 Jan 5;356:i6460. doi: 10.1136/bmj.i6460.
[2]Debray TP, Damen JA, Riley RD, Snell K, Reitsma JB, Hooft L, Collins GS, Moons KG. A framework for meta-analysis of prediction model studies with binary and time-to-event outcomes. Stat Methods Med Res. 2019 Sep;28(9):2768-2786. doi: 10.1177/0962280218785504.