之前给大家写过一个临床预测模型:R数据分析:跟随top期刊手把手教你做一个临床预测模型,里面其实都是比较基础的模型判别能力discrimination的一些指标,那么今天就再进一步,给大家分享一些和临床决策实际相关的指标,主要是校准calibration和决策曲线Decision curve analysis。
做预测模型都应该报告校准曲线的:
Reporting on calibration performance is recommended by the TRIPOD (Transparent Reporting of a multivariable prediction model for Individual Prognosis Or Diagnosis) guidelines for prediction modeling studies
先给大家解释,预测模型为什么除了需要discrimination的一些指标外(比如tp,tn,fp,fn,roc,LR+,LR-等等)还需要做校准曲线:
Clinical predictive model performance is commonly published based on discrimination measures, but use of models for individualized predictions requires adequate model calibration
是因为:这些指标仅仅针对现有样本,很容易在过拟合的情况下,表现得很好。那么这种预测模型有没有用,敢不敢用?得打个问号。
in contrast to discrimination, which refers to the ability of a model to rank patients according to risk, calibration refers to the agreement between the estimated and the “true” risk of an outcome
依然是给大家举例子说明:一个区分度很好的预测模型,AUC很高,这个模型是以美国某个社区样本做的预测痴呆的模型,现在有人用这个模型预测全体社区老年人,发现按照模型的预测结果,美国将会有40%的老年人得痴呆,但是普查结果告诉我们美国痴呆患病率只有10%。这个就是一个过拟合的模型高估结局风险的例子(但这并不妨碍其在训练样本中表现的很好),但是这个模型不能用。
When predictive models are built based on a population that differs from the population in which they will be used, blind application of these models could result in large “residuals” (ie, a large difference between a model’s estimate and the true outcome) because of factors that are difficult to account for.
如何表示模型的上面的情况(预测值与实际值偏离)的严重程度,或者说如何评价模型能不能用,能不能换个样本也预测得准,就要评估模型的校准度,所以我们需要报告模型的校准曲线。
矫正曲线要做的就是对比模型预测概率和观测概率的一致性。因为我们是凭模型的预测概率判断具体病人阴阳性的,如果我的模型表现好,比如我依照0.5的预测概率划分阴阳,如果模型表现好,是不是应该100个预测概率是0.5的人会有50阳性?再来一个例子,比如我依照0.3的预测概率划分阴阳,如果模型表现好,是不是应该100个预测概率是0.3的人会有30阳性?
就是如果我的模型的校准度好,是不是就不会发生我刚刚据的痴呆预测的例子了,所以说:
Calibration plot is a visual tool to assess the agreement between predictions and observations in different percentiles (mostly deciles) of the predicted values.
校准曲线可以说明模型表现的另一个方面:Performance can further be quantified in terms of calibration (do close to x of 100 patients with a risk prediction of x% have the outcome?)
上面就是模型的矫正曲线来评估模型表现的理由,我们理想的情况就是我们的预测模型预测出来的Y和数据真实的Y之间的距离越小越好,如果我们的结局变量是连续变量,那么距离就是预测的y值和实际y值的差,如果结局是二分类变量那么距离就是阳性概率p和实际p的差:
The distance between the predicted outcome and actual outcome is central to quantify overall model performance from a statistical modeler’s perspective 32. The distance is Y −Ŷ for continuous outcomes. For binary outcomes, with Y defined 0 – 1, Ŷ is equal to the predicted probability p, and for survival outcomes it is the predicted event probability at a given time (or as a function of time)
在坐标系中,如果我们将模型预测概率放在横轴,实际概率放在纵轴,一个完美的预测模型的矫正曲线应该是一个45°向上过0的直线(Ideal),意味着模型预测概率和实际概率完全吻合。但是我们在论文中看到的矫正曲线一般是下图样子的:
[图片上传失败...(image-adc38-1655212435415)]
图中的Ideal线刚刚已经解释了(就是理想情况下模型预测和实际完全一致),图中还会有Apparent线和Bais-corrected线,这两个线就表示自己的模型的表现,Apparent线其中的意思是自己的训练的表现而Bais-corrected线表示样本经反复自助抽样后训练出的模型表现,其矫正了过拟合情况(另外一种理解:Apparent线为内部矫正,Bais-corrected线为模型的外部矫正曲线,外部数据怎么来的,自助抽样得来的)。此处不用纠结,发表的论文的中对矫正曲线的描述通常也就是一句话:
[图片上传失败...(image-a90e0a-1655212435415)]
所以大家只要把握住,打眼一看,两条线都在Ideal线的周围没有偏离的太离谱就可以。
以上就是模型校准的基础知识,内容大部分参见文献:
Yingxiang Huang, Wentao Li, Fima Macheret, Rodney A Gabriel, Lucila Ohno-Machado, A tutorial on calibration measurements and calibration models for clinical prediction models, Journal of the American Medical Informatics Association, Volume 27, Issue 4, April 2020, Pages 621–633, https://doi.org/10.1093/jamia/ocz228
评价一种诊断方法是否好用,一般是作ROC曲线,计算AUC。但是,ROC只是从该方法的特异性和敏感性考虑,追求的是准确。而临床上我要用预测结果决定是不是需要采取干预,准确就足够了吗?准确度较高的情况下就一定要依照模型预测结果进行干预吗?干预后患者就一定受益吗?也得打个问号。
就是模型预测再准确,也不能百分百准确,始终有假阳性和假阴性存在,我们却要根据模型的预测结果去干预病人,这里面就有一个干预划不划得来的问题:说的再具体点,比如我通过某个生物标志物预测患者是否患了某病,无论选取哪个值为临界值,都会遇到假阳性的可能,假阳性的病人也会接受干预(但其实是亏损的),我们希望自己做出来的预测模型在临床使用中,在任何时候依照模型结果进行干预净受益都比默认的好(最常见的默认情况就是全干预和全不干预)。
那么决策曲线要干的事情是啥?就是将依照模型干预的净受益和默认方法(全干预和不干预)干预的净受益进行比较:
In brief, decision curve analysis calculates a clinical “net benefit” for one or more prediction models or diagnostic tests in comparison to default strategies of treating all or no patients.
有点抽象哈,什么是净受益?
用干预来举例,在预测模型中,我们在全干预的情况下(全部人群无差别干预),我们使用这种策略时真的受益应该是true positives和false negatives,我们的代价就是false positives和true negatives,此时受益减去代价就叫做净受益:
In the case of diagnosis, the income is true positives (e.g., finding a cancer) and the expenditure is false positives (e.g., unnecessary biopsies), with the “exchange rate” being the number of false positives that are worth one true positive. The exchange rate will depend on the relative seriousness of the intervention and outcome. For instance, we will be willing to conduct more unnecessary biopsies to find one cancer if the biopsy procedure is safe vs. dangerous or the cancer is aggressive vs. more indolent. The exchange rate is calculated, as explained above, from the threshold probability. Another analogy is with net health benefit or net monetary benefit, which both depend on the willingness to pay threshold in their exchange of benefits in terms of health and costs
其实上面的描述还是不严谨,临床决策考虑是不是施加干预,肯定还要考虑干预本身的危害性,比如如果干预完全是对病人无害的,那么想都不用想,管它三七二十一,就算病人只有0.1的概率患病,我也要把干预直接搞起来,因为干预没损害的嘛。
但是干预存在副作用的时候,我们可以有这么一个换算关系:多少个真阳性的干预获益能抵得上一个假阳性的干预损失?
回到我们的实际情形:如果现在模型告诉我,病人患病的概率是100%,我一定会给病人施加干预,毫无疑问!如果模型告诉我病人患病的概率是98%,我估摸着也给个干预看看(尽管这个干预有一定危害),那么如果模型告诉我病人患病的概率是90%,干预还是不干预呢?这个时候我就不知道了,有点懵。
有人说还是应该干预,那么请继续往下读:
但是过往的经验告诉我(或者我本身就知道):一个副作用很强的干预,对于阳性病人干预的获益是对阴性病人干预损失的1/9(干预错的损失是干预一个真阳性获益的9倍),另一种理解就是我干预阳性病人9个人的获益和干预了1个阴性病人的损失可以抵消。此时如果模型告诉你,某病人阳性的概率是*****90%*****,请问你对不对它进行干预?
回答我!
聪明的你估计又想了想,好像这个时候不干预也行,因为这种时候干预在理论上其实是没有受益的(尽管模型告诉我它的病的概率达到90%,0.91/9=(1-0.9)1)。
上面的‘阳性的概率是90%’中的90%就叫做阈概率(Threshold Probability),表示的是只有病人的预测概率超过这个阈概率,干预才有受益,才值得干预:
threshold probabilities, defined as the minimum probability of disease at which further intervention would be warranted, as net benefit = sensitivity × prevalence – (1 – specificity) × (1 – prevalence) × w where w is the odds at the threshold probability
这个阈概率本身我们是不知道的,但是我们关心的是是不是我们的训练出来的模型在任何阈概率情况下都是有收益的,都是值得应用的,这就是DCA曲线要帮助我们回答的问题。
所以请大家记住:决策曲线要描述的对象是整个预测模型或者是某个测验,就是要看按照模型结果进行干预的净受益。
我们还是再看一眼DCA曲线:
[图片上传失败...(image-cbc81e-1655212435415)]
DCA曲线的横轴是阈概率,纵轴是净获益,可以看到阈概率在DCA曲线上展示的都是比较小的,刚刚给大家举的例子着实有点极端了。再回顾一下净获益,刚刚写了获益的意思是正确识别阳性,但是模型其实还有损失的嘛(就是错误的识别了阳性),因为对于阳性我们就得进行干预,但是干预有没有益处,得比较两个东西------就是真阳性的获益和假阳性的损失,两个做差就叫做净获益。
这样DCA曲线就可以描述随着阈概率变化,按照模型预测值进行干预的情况下净获益的变化。
注意曲线中有一条叫做“intervention for all”,就是极端情况,所有人都进行干预,这个时候只有真阳性才获益,如果阈概率从小到大变化(就是干预错的损失/干预的获益的值从小到大变化,比如看图中横轴的1:19到1:9)那么所有人都进行干预整体净获益肯定会从大到小变,就是随着阈概率的增大(干预的损失增大/干预获益的比值的增大)那么对所有人都进行干预的净获益也会逐渐减小(这就是为什么intervention for all的斜率是负的)。
注意曲线中有一条叫做“intervention for none”,就是极端情况,所有人都不进行干预,这个时候无论阈概率如何变化净获益肯定为0,很好理解,因为你都不干预嘛,哪里有干预获益的道理?。所以这条线一直是平的。
“intervention for all”这条线和“intervention for none”这条线还有一个交点,就是说在某个阈概率水平下,对于阳性病人采取全干预和全不干预的净获益都是一样的,就像刚刚给大家写的例子反过来:如果干预一个真阳性病人的获益是9,干预一个假阳性病人的损失是1,此时阈概率应该为1/(9+1)=0.1,就是说在这种情况下阈概率为0.1的时候两条线就会相交。
在换个思维再给大家举个例子,现在假设我知道我预测的人群的某病患病率为0.2,某干预方法的干预真阳性的受益是8,干预假阳性的损失是2,那么此时对应的阈概率为2/(2+8)=0.2,此时采用全干预策略的净获益为0.28-20.8=0,此时两条线相交。
通过上面两个例子,应该大家就可以理解了:在阈概率等于研究人群患病率的这个点,两条线会相交,也就是全干预策略的净受益为0。
上面的部分行文思路来源于文献,感兴趣的同学建议还是去阅读原文哦:
Vickers, A.J., van Calster, B. & Steyerberg, E.W. A simple, step-by-step guide to interpreting decision curve analysis. Diagn Progn Res 3, 18 (2019). https://doi.org/10.1186/s41512-019-0064-7
再回到下图就是一个DCA曲线的常见样子,不过这个曲线将预测模型和另外一个检测技术test,画在了一个图上,那么怎么读图呢?
首先图中两条实线是两个最极端的情况,一个叫做“intervention for all”,另一个叫做"intervention for none",刚刚解释过它们的意思了。
[图片上传失败...(image-55b7ae-1655212435414)]
可以从图中看出,随着阈概率的增加,模型的净受益会下降(更精确的说法是根据模型结果进行干预的净受益会下降),但是对于我们训练的Model来讲,按照Model的预测结果进行干预的话,除了阈概率很小的情况下,在其余的阈概率情形下模型的表现都是比较好的,并且模型表现始终比test好。
做好预测模型之后,咱们把这个图给亮出来,就相当于给编辑说明了我做的这个预测模型确实好,确实比现有的检测技术管用,赶紧发表出来吧,这个就是DCA曲线。
Hence, we can conclude that, except for a small range of low preferences, intervening on (i.e., biopsying) patients on the basis of the prediction model leads to higher benefit than the alternative strategies of biopsying all patients, biopsying no patients, or only biopsy those patients who are positive on the diagnostic test. For the prostate biopsy study, the conclusion is that using the model to determine whether patients should have a biopsy would lead to improved clinical outcome.
今天给大家介绍了临床预测模型中矫正曲线和决策曲线的意义(仅以2分类结局为例),本来想的是将做法一起写的,无奈写的太罗嗦,字符限制了,那就分为2期吧,下期就出实操,希望对大家有启发。
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度; 在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
我正在尝试在Rails上安装ruby,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手