R数据分析:生存数据的预测模型建立方法与评价
之前写了生存分析列线图的做法,列线图作为一个预测模型可视化工具,我们使用它的过程其实就是一个给新数据做预测的过程,其内在本身的模型就是我们基于现有数据训练的一个预测模型,今天也算是接着上一篇文章继续写生存分析的预测模型的效果评价。
生存数据预测模型和我们之前写的连续变量结局和分类结局的预测模型不同的地方就在于我们得考虑生存数据的删失和时间因素,通过这么一个预测模型,我们期望的目标是帮助临床医生去回答特定病人在某个时间的生存概率。从这个角度讲我们对模型评估和评价的标准就有一个锚定了。
Thus, survival prediction models differ from traditional prediction models for continuous or binary outcomes by appropriately accommodating censoring that is present in time-to-event data.to answer questions such as “What is the probability that this patient will be alive in 5 years, given their baseline covariate information?” This predicted probability can then be used by clinicians to make important decisions regarding patient care
比如说我收集了某个癌症病人的很大的有代表性的数据集,我通过我的数据学习出来了一个预测模型,再来一个新的癌症病人,模型可以告诉我,这个病人能活多久。
如果这个新数据本身有标签,我们通过对比实际标签(具体时间的生存概率)和模型预测结果(预测的具体时间的生存概率),就可以来评价模型优劣。逻辑和常规(分类结局和连续结局)的预测模型还是一样的。
先回顾生存分析
依然是先回顾下生存分析中的常见的术语:
我们的结局变量两个水平,一个是发生事件,另外一个是删失;同时这个结局还依赖于一个时间变量。
刚刚写了,我们做生存数据的预测,回答的是we are predicting the probability that an event happens at a particular time .----某个时刻发生事件的概率。所以这个时候常规的评价模型的指标都不好使了。
Due to the presence of the censoring in survival data, the standard evaluation metrics for regression such as root of mean squared error and ܴ R2 are not suitable for measuring the performance in survival analysis.
对于生存数据的预测模型,此时的评估模型的指标有下面3个:Concordance index (C-index),Brier score,Mean absolute error。今天的任务就是一个一个带大家捋一遍,希望能帮助大家理解在“个体特定时间的生存概率这个锚定标准下,这些指标为什么可以用来评价模型。”
Concordance index (C-index)
首先看C指数,这个一致性指数在分类结局的预测模型中给大家提到过,就是ROC曲线下面积,对于生存数据的预测模型来讲,这个指数和灵敏度特异度就没关系了,它比的是实际值和预测值的排序一致不一致。理解方法可以参考秩和检验。
For a binary outcome, C-index is identical to the area under the ROC curve (AUC).
The concordance index or C-index is a generalization of the area under the ROC curve (AUC) that can take into account censored data. It represents the global assessment of the model discrimination power.
其逻辑在于:每个个案通过模型都给它一个风险分,如果模型表现好,那么风险分高的个案应该会先发生事件,按照这个逻辑,然后我们用模型给每个个案都赋一个风险分,形成很多个可以对比的组(2个为一组):在组内确实满足刚刚讲的“风险分越大,事件越先发生”那么这个组就是一致性的组,否则就是不一致的组,这样一致性的组占所有对比组的比例就是C-index:
指数的计算方法如下:
其中,分子上是一致性的组,分母是所有组。那么这个值就是越大越好。
上面就是生存分析预测模型评价中C-index的内在逻辑,大家作为应用型科研工作者关注逻辑就好,请自动忽略掉数学表达。
Brier score
再来看第二个评价指标,叫做Brier score。这个Brier score是个案在t时间的生存状态减去t时间的预测生存概率的差的平方的均值。
其可以用来评价模型的逻辑在于:如果我的模型真的可以很好的预测特定时刻的生存概率,那么对于某个时刻我的生存状态确实是1,那么模型应该说我此时的生存概率无限大;反之模型应该说我的生存概率无限小。
因为牵扯到具体时间,这个指标只能截一个时间点去看,其算法如下:
we found that BS depends on the selection of time point t. Generally, the median of the observation time is selected as the time point.
就是个案在t时间的生存状态减去t时间的预测生存概率的差,比如在t时间个案实际观测到的是死亡(取0),那么这时候模型预测的生存概率应该越小越好;t时间个案实际观测到的是存活(取1),那么这个时候模型预测的生存概率应该是越大越好;肯定是减了之后的差越小越好嘛,也就是这个Brier score越小越好,并且得小于0.25才说明这个模型好过瞎猜。但是这指标只能看某个时间点模型的预测准确性。
上面就是生存分析预测模型评价中Brier score的内在逻辑,大家作为应用型科研工作者关注逻辑就好,自动忽略掉数学表达。
Mean absolute error
MAE这个指标在连续变量结局的预测模型中也有的,指的是预测值和实际值的差的绝对值的和,在生存分析的预测模型中,就是实际生存时间和模型预测生存时间的差的绝对值的和。算法如下:
这个指标只考虑了非删失数据,实际中就用得比较少。基本不用管。
模型评价实操
解释完指标之后我们再看实操做法,依然我们选取 JAMA Surg.的文章做参考,文章名如下:
Hyder O, Marques H, Pulitano C, et al. A Nomogram to Predict Long-term Survival After Resection for Intrahepatic Cholangiocarcinoma: An Eastern and Western Experience. JAMA Surg. 2014;149(5):432–438. doi:10.1001/jamasurg.2013.5168
文章中对模型评估的方法学介绍如下:
可以看到,这篇文章报告了C指数,用自助抽样样本画了校准曲线,还进行了模型的验证。我们首先来看C指数的做法,文章中报告了C指数的值和置信区间:
Predictive accuracy (discrimination) of the final model was measured by calculating the Harrell C index, which was 0.692 (95% CI, 0.624-0.762).
如果你是用coxph函数跑模型,那么模型的输出结果中自动会出来C指数C指数的标准误的,如下图:
比如我们就单独想要这个指数,可以直接运行下面代码:
cindex(formula, data)
要得到C指数的置信区间的话就得求助concordance.index函数,代码如下:
concordance.index(predict(c),surv.time = dt,surv.event = e,method = "noether")
输出如下,有C指数,标准误和对应置信区间上下限:
看完了C指数的操作我们再看校准曲线的画法,论文中给到的校准曲线长这样:
首先我们来理解什么是校准曲线,上图中横轴是模型预测的生存概率,纵轴是实际的生存概率。图中还有一条灰色的虚线,代表预测概率和实际的生存概率一致,最理想的情况下校准曲线是一条对角线(预测概率等于实际概率),我们实际写文章的时候只要看着不要偏太离谱就行。
Calibration plot is a visual tool to assess the agreement between predictions and observations in different percentiles (mostly deciles) of the predicted values.
还要理解的是我们本身生存概率的分布是连续的,而图中只是画了3个点,这是因为算法将数据进行了分箱处理,上图中就是将原始数据分成了3组,这个操作使用calibrate函数中的参数m进行控制
For survival models, "predicted" means predicted survival probability at a single time point, and "observed" refers to the corresponding Kaplan-Meier survival estimate, stratifying on intervals of predicted survival。
同时,对于生存数据我们本身做预测的时候也是需要限定时间的,所以需要设定参数u。
比如我们要自助抽样20次,数据分箱,每箱200个,做时间点6的校准曲线的示例代码如下:
cal <- calibrate(f, u=6, cmethod='KM', m=200, B=20)
plot(cal)
关于模型验证的结果,论文中通过报告重复抽样验证结果中训练数据和测试数据的C指数说明了模型并没有过拟合,原文如下:
Bootstrap validation of the model with 300 iterations revealed minimal evidence of model overfit. The training data set C statistic was 0.699, and the testing data set C statistic was 0.706, which represented the bias-corrected estimate of model performance in the future.
此部分的实现代码如下:
validate(f, B=300)
通过输出结果中便可推算出相应数据集的C指数。
D_{xy} are equal to 2 * (C - 0.5)where C is the C-index or concordance probability
然后我们再对比下训练数据和测试数据的C指数的差异就可以去得到我们自己模型的结论。
好了,到这儿本期按照JAMA surgery文章给大家写的生存数据预测模型的做法与评价方法就给大家写完了,其实生存数据的预测模型还有别的评价方法比如时间依赖的ROC,决策曲线等等,安排在下期,请持续关注。
R数据分析:生存数据的预测模型建立方法与评价的更多相关文章
- R数据分析:用R建立预测模型
预测模型在各个领域都越来越火,今天的分享和之前的临床预测模型背景上有些不同,但方法思路上都是一样的,多了解各个领域的方法应用,视野才不会被局限. 今天试图再用一个实例给到大家一个统一的预测模型的做法框 ...
- R数据分析:跟随top期刊手把手教你做一个临床预测模型
临床预测模型也是大家比较感兴趣的,今天就带着大家看一篇临床预测模型的文章,并且用一个例子给大家过一遍做法. 这篇文章来自护理领域顶级期刊的文章,文章名在下面 Ballesta-Castillejos ...
- 【视频】R语言生存分析原理与晚期肺癌患者分析案例|数据分享|附代码数据
原文链接:http://tecdat.cn/?p=10278 最近我们被客户要求撰写关于生存分析的研究报告,包括一些图形和统计输出. 生存分析(也称为工程中的可靠性分析)的目标是在协变量和事件时间之间 ...
- R数据分析:临床预测模型中校准曲线和DCA曲线的意义与做法
之前给大家写过一个临床预测模型:R数据分析:跟随top期刊手把手教你做一个临床预测模型,里面其实都是比较基础的模型判别能力discrimination的一些指标,那么今天就再进一步,给大家分享一些和临 ...
- (数据科学学习手札07)R在数据框操作上方法的总结(初级篇)
上篇我们了解了Python中pandas内封装的关于数据框的常用操作方法,而作为专为数据科学而生的一门语言,R在数据框的操作上则更为丰富精彩,本篇就R处理数据框的常用方法进行总结: 1.数据框的生成 ...
- R数据分析:生存分析与有竞争事件的生存分析的做法和解释
今天被粉丝发的文章给难住了,又偷偷去学习了一下竞争风险模型,想起之前写的关于竞争风险模型的做法,真的都是皮毛哟,大家见笑了.想着就顺便把所有的生存分析的知识和R语言的做法和论文报告方法都给大家梳理一遍 ...
- R数据分析:生存分析的列线图的理解与绘制详细教程
列线图作为一个非常简单明了的临床辅助决策工具,在临床中用的(发文章的)还是比较多的,尤其是肿瘤预后: Nomograms are widely used for cancer prognosis, p ...
- 极简 R 包建立方法--转载
https://cosx.org/2013/11/building-r-packages-easily/ 最近想试一下捣腾一个 R 包出来,故参考了一些教程.现在看到的最好的就是谢益辉大大之前写过的开 ...
- R数据分析:纵向数据如何做中介,交叉滞后中介模型介绍
看似小小的中介,废了我好多脑细胞,这个东西真的不简单,从7月份有人问我,我多重中介,到现在的纵向数据中介,从一般的回归做法,到结构方程框架下的路径分析法,到反事实框架做法,从中介变量和因变量到是连续变 ...
- R数据分析:潜类别轨迹模型LCTM的做法,实例解析
最近看了好多潜类别轨迹latent class trajectory models的文章,发现这个方法和我之前常用的横断面数据的潜类别和潜剖面分析完全不是一个东西,做纵向轨迹的正宗流派还是这个方法,当 ...
随机推荐
- /proc/sys/vm 使用
这些参数主要是用来调整virtual memory子系统的行为以及数据的写出(从RAM到ROM). 这些节点(参数)的默认值和初始化的过程大部分都可以在mm/swap.c中找到. 目前,/proc/s ...
- Guava中的Joiner和Splitter
目录 Guava 介绍 Joiner list转string map转string 处理嵌套集合 处理null值 Splitter string转list string转map 多个拆分符 输出 代码 ...
- 2. 说一下vue2和vue3的区别 ?
1. vue3 使用 proxy 替换Object.defineProperty 实现数据响应式 ,所以vue3 的性能得到了提升 : 2. vue3 使用组合式 API 替代了 vue2 中的选项式 ...
- centos7安装python3.12
centos7 安装升级 python3.12 centos7 默认的 gcc 和 g++ 版本都很低,在有 --enable-optimizations 选项时会编译报错,因此要在 scl 环境下编 ...
- 一文搞定 KubeKey 3.1.1 离线部署 KubeSphere 3.4.1 和 Kubernetes v1.28
本文将详细介绍,如何基于操作系统 openEuler 22.03 LTS SP3,利用 KubeKey 制作 KubeSphere 和 Kubernetes 离线安装包,并实战部署 KubeSpher ...
- Kubernetes 集群中流量暴露的几种方案
作者:KaliArch(薛磊),某 Cloud MSP 服务商产品负责人,熟悉企业级高可用 / 高并发架构,包括混合云架构.异地灾备,熟练企业 DevOps 改造优化,熟悉 Shell/Python/ ...
- [Go] 如何妥善处理 TCP 代理中连接的关闭
如何妥善处理 TCP 代理中连接的关闭 相比较于直接关闭 TCP 连接,只关闭 TCP 连接读写使用单工连接的场景较少,但通用的 TCP 代理也需要考虑这部分场景. 背景 今天在看老代码的时候,发现一 ...
- 微信小程序、uniapp、vue生命周期钩子函数
生命周期是指从创建到销毁的过程 一.微信小程序 小程序里面有两种生命周期函数,第一个:通过App()来注册一个小程序 ,第二个:通过Page()来注册一个页面 应用生命周期函数 app( ) ap ...
- QT creator中cmake管理项目,如何引入外部库(引入Eigen库为例)
在Eigen的官网下载压缩包[点我进入] 解压到当前项目的根目录(当然你也可以自己选择目录) 在当前项目的CMakeLists.txt任意位置加入这句话include_directories(${CM ...
- Selenium操作:测试form表单
from表单是经常测试的用例,用户登录.注册等都会用到form表单,本文简单设计了一个用户登录的form表单,并对该form表单进行测试 一.自定义form表单 1.用到的组件 如下图,图中定义了一个 ...