Topic 19. 临床预测模型之输出每个患者列线图得分 (nomogramFormula)
点击关注,桓峰基因
临床列线表构建完成,怎么输出列线表每个患者总的得分?
这期就给大家介绍一下,保姆级教程,快来学习吧!
桓峰基因公众号推出基于R语言临床预测模型教程并配有视频在线教程,目前整理出来的教程目录如下:
Topic 1. 临床标志物生信分析常规思路
Topic 2. 生存分析之 Kaplan-Meier
Topic 3. SCI文章第一张表格–基线表格
Topic 4. 临床预测模型构建 Logistic 回归
Topic 5. 样本量确定及分割
Topic 6 计数变量泊松回归
Topic 7. 临床预测模型–Cox回归
Topic 8. 临床预测模型-Lasso回归
Topic 9. SCI 文章第二张表—单因素回归分析表
Topic 10. 单因素 Logistic 回归分析—单因素分析表格
Topic 11. SCI中多元变量筛选—单/多因素表
Topic 12 临床预测模型—列线表 (Nomogram)
Topic 13. 临床预测模型—一致性指数 (C-index)
Topic 14. 临床预测模型之校准曲线 (Calibration curve)
Topic 15. 临床预测模型之决策曲线 (DCA)
Topic 16. 临床预测模型之接收者操作特征曲线 (ROC)
Topic 17. 临床预测模型之缺失值识别及可视化
Topic 18. 临床预测模型之缺失值插补方法
Topic 19. 临床预测模型之输出每个患者列线图得分 (nomogramFormula)
前 言
我们通过Cox回归等方法构建临床预测模型,然后根据模型参数把患者的生存概率可视化为Nomogram。“Nomogra”中文常翻译为诺模图或列线图,其本质就是回归方程的可视化。它根据模型中所有自变量回归系数的大小来制定评分标准,据此给每个自变量的每种取值水平一个评分,这样对每个患者,就可以计算得到一个总分,再通过总分与结局发生概率之间的转换函数来计算每个患者的生存概率。
对于从Nomogram中获得单个患者的得分与相应的生存概率并不困难,但这里有两个技术问题一直困扰着很多研究者:
(1) 如何根据Cox回归列线图精确计算某个患者的风险得分与生存概率?
(2) 如何根据Cox回归列线图精确计算数据集中所有患者得分与生存概率?
实际上,列线图只是Cox回归方程的可视化,无论精确计算单个患者的得分还是预测概率,其依据都是回归方程而非列线图本身。
软件包安装
在输出每个患者总得分,我们需要使用rms软件包构建模型以及绘制列线表,然后进行得分的输出,软件包 nomogramFormula 安装如下:
if(!require(nomogramFormula))install.packages("nomogramFormula")
参数说明
参数有四个,读入预测模型公式,然后选择输出的points是原始数据格式,还是线性预测的结果。
Usage points_cal(formula, rd, lp, digits = 6)
Arguments
formula: the formula of total points with raw data or linear predictors
rd:raw data, which cannot have missing values
lp:linear predictors
digits:default is 6
但是原始数据不能有缺失,有缺失怎么办,看桓峰基因公众号:
Topic 17. 临床预测模型之缺失值识别及可视化
Topic 18. 临床预测模型之缺失值插补方法
例子实操
我们这里举两个例子,一个是软件包 nomogramFormula 自带的例子,另一个我们使用之前讲过Topic 12 临床预测模型—列线表 (Nomogram) 的例子。
例子一
数据读取,如下:
library(rms) # needed for nomogram
library(nomogramFormula)
set.seed(2018)
n <- 2019
age <- rnorm(n, 60, 20)
sex <- factor(sample(c("female", "male"), n, TRUE))
sex <- as.numeric(sex)
weight <- sample(50:100, n, replace = TRUE)
time <- sample(50:800, n, replace = TRUE)
units(time) = "day"
death <- sample(c(1, 0, 0), n, replace = TRUE)
df <- data.frame(time, death, age, sex, weight)
head(df)
## time death age sex weight
## 1 55 0 51.54032 1 81
## 2 770 1 29.00244 1 100
## 3 685 0 58.71141 2 76
## 4 78 1 65.41763 1 81
## 5 340 0 94.70567 1 78
## 6 54 0 54.70578 1 58
ddist <- datadist(df)
oldoption <- options(datadist = "ddist")
构建模型并绘制列线图:
f <- cph(formula(Surv(time, death) ~ sex + age + weight), data = df, x = TRUE, y = TRUE,surv = TRUE, time.inc = 3)
surv <- Survival(f)
nomo <- nomogram(f, lp = TRUE, fun = list(function(x) surv(365, x), function(x) surv(365 *2, x)), funlabel = c("1-Year Survival Prob", "2-Year Survival Prob"))
plot(nomo)
使用nomogramFormula包中formula_lp()函数及points_cal()函数直接提取训练集中的线性预测值linear.predictors,计算列线图得分,展示前6行。但这种方式仅仅能计算训练集中单个患者的列线图得分。
options(oldoption)
# get the formula by the best power using formula_lp
results <- formula_lp(nomo)
results$formula
## b0 x^1
## linear predictor 131.9182 821.7001
points <- points_cal(formula = results$formula, lp = f$linear.predictors)
head(points)
## 1 2 3 4 5 6
## 104.02111 146.65643 177.84712 94.76958 70.88473 68.48810
使用nomogramFormula包中formula_rd()函数及points_cal()函数根据训练集、验证或全集中自变量取值计算列线图得分,并将计算的得分做为新的列添加至对应的数据集中。我们推荐使用这种方法来计算。
# get the formula by the best power using formula_rd
results <- formula_rd(nomogram = nomo)
results$formula
## b0 x^1
## sex -85.87254 85.872536
## age 93.33333 -0.666667
## weight -72.65806 1.453161
df$points = points_cal(formula = results$formula, rd = df)
head(df)
## time death age sex weight points
## 1 55 0 51.54032 1 81 104.02109
## 2 770 1 29.00244 1 100 146.65641
## 3 685 0 58.71141 2 76 177.84709
## 4 78 1 65.41763 1 81 94.76955
## 5 340 0 94.70567 1 78 70.88469
## 6 54 0 54.70578 1 58 68.48808
计算训练集、验证集与全集的线性预测值。训练集的线性预测值从模型cph中直接提取即可,并做为新的列加入到训练集中。
例子二
构建模型并绘制列线图:
library(survival)
library(rms)
data(package = "survival")
lung$sex = factor(lung$sex)
lung = na.omit(lung)
dd <- datadist(lung)
options(datadist = "dd")
head(dd)
## $limits
## inst time status age sex ph.ecog ph.karno pat.karno
## Low:effect 3 174.5 1 57.0 <NA> 0 70 70
## Adjust to 11 268.0 1 64.0 1 1 80 80
## High:effect 15 419.5 2 70.0 <NA> 1 90 90
## Low:prediction 1 53.0 1 44.3 1 0 60 60
## High:prediction 26 737.3 2 75.0 2 2 100 100
## Low 1 5.0 1 39.0 1 0 50 30
## High 32 1022.0 2 82.0 2 3 100 100
## meal.cal wt.loss
## Low:effect 619.0 0.0
## Adjust to 975.0 7.0
## High:effect 1162.5 15.0
## Low:prediction 320.5 -5.0
## High:prediction 1477.5 35.4
## Low 96.0 -24.0
## High 2600.0 68.0
##
## $values
## $values$status
## [1] 1 2
##
## $values$sex
## [1] "1" "2"
##
## $values$ph.ecog
## [1] 0 1 2 3
##
## $values$ph.karno
## [1] 50 60 70 80 90 100
##
## $values$pat.karno
## [1] 30 40 50 60 70 80 90 100
cph <- cph(Surv(time, status) ~ age + sex + ph.ecog + ph.karno, data = lung, x = TRUE,y = TRUE, surv = TRUE)
cph
## Cox Proportional Hazards Model
##
## cph(formula = Surv(time, status) ~ age + sex + ph.ecog + ph.karno,
## data = lung, x = TRUE, y = TRUE, surv = TRUE)
##
## Model Tests Discrimination
## Indexes
## Obs 167 LR chi2 23.46 R2 0.131
## Events 120 d.f. 4 R2(4,167)0.110
## Center 2.9977 Pr(> chi2) 0.0001 R2(4,120)0.150
## Score chi2 23.50 Dxy 0.273
## Pr(> chi2) 0.0001
##
## Coef S.E. Wald Z Pr(>|Z|)
## age 0.0129 0.0114 1.13 0.2586
## sex=2 -0.5239 0.1978 -2.65 0.0081
## ph.ecog 0.7426 0.2086 3.56 0.0004
## ph.karno 0.0205 0.0113 1.81 0.0699
##
survival <- Survival(cph)
survival1 <- function(x) survival(365, x)
survival2 <- function(x) survival(730, x)
nom <- nomogram(cph, fun = list(survival1, survival2), fun.at = c(0.05, seq(0.1,0.9, by = 0.05), 0.95), funlabel = c("1 year survival", "2 year survival"))
plot(nom)
计算每个患者的总得分:
# get the formula by the best power using formula_lp
results <- formula_lp(nom)
points <- points_cal(formula = results$formula, lp = cph$linear.predictors)
head(points)
## 1 2 3 4 5 6
## 79.39907 106.36008 79.44563 104.16493 96.71219 85.66158
# get the formula by the best power using formula_rd
results <- formula_rd(nomogram = nom)
lung$points <- points_cal(formula = results$formula, rd = lung)
head(lung)
## inst time status age sex ph.ecog ph.karno pat.karno meal.cal wt.loss
## 2 3 455 2 68 1 0 90 90 1225 15
## 4 5 210 2 57 1 1 90 60 1150 11
## 6 12 1022 1 74 1 1 50 80 513 0
## 7 7 310 2 68 2 2 70 60 384 10
## 8 11 361 2 71 2 2 60 80 538 1
## 9 1 218 2 53 1 1 70 80 825 16
## points
## 2 79.39909
## 4 106.36010
## 6 79.44564
## 7 104.16495
## 8 96.71220
## 9 85.66160
整个过程是不是非常简单好用?学会了都是自己的本事,想学更多本领快来关注桓峰基因公众号,更多的免费文字版教程结合视频版教程相结合,保证您来了就有收获!!!
桓峰基因,铸造成功的您!
有想进生信交流群的老师可以扫最后一个二维码加微信,备注“单位+姓名+目的”,有些想发广告的就免打扰吧,还得费力气把你踢出去!
References:
- nomogramFormula: Calculate Total Points and Probabilities for Nomogram. Version: 1.2.0.0
Topic 19. 临床预测模型之输出每个患者列线图得分 (nomogramFormula)相关推荐
- Topic 17. 临床预测模型之缺失值识别及可视化
桓峰基因公众号推出基于R语言临床预测模型构建方法教程并配有视频在线教程,目前整理出来的教程目录如下: Topic 1. _临床_标志物生信分析常规思路 Topic 2. 生存分析之 Kaplan-Me ...
- Topic 15. 临床预测模型之决策曲线 (DCA)
点击关注,桓峰基因 桓峰基因 前言 DCA (Decision Curve Analysis) 是一种评估临床预测模型.诊断试验和分子标记物的简单方法.传统的诊断试验指标如:敏感性,特异性和ROC曲线 ...
- Topic 12 临床预测模型之列线表 (Nomogram)
点击关注,桓峰基因 在临床上列线表已经占据大样本临床研究的半壁江山,非常流行,这个简单的回归模型结合临床上大规模的研究数据,发一篇10+还是非常轻松的! 前言 线图(Alignment Diagram ...
- Topic 8. 临床预测模型-Lasso回归
Lasso回归在决定哪些因素可以纳入模型提高模型的稳健性,以及相应的给出各种可用图表,在做生物标志物筛选时,效果非常好! 我们从最简单的线性回归(Linear Regression)开始了解如何使用 ...
- Topic 14. 临床预测模型之校准曲线 (Calibration curve)
点击关注,桓峰基因 桓峰基因 生物信息分析,SCI文章撰写及生物信息基础知识学习:R语言学习,perl基础编程,linux系统命令,Python遇见更好的你 57篇原创内容 公众号 前言 Calibr ...
- 临床预测模型评鉴(PMID: 34007195)-非肥胖患者5年内发生2型糖尿病的风险
临床预测模型评鉴(PMID: 34007195) 模型评价原则: 参见其他发表的文章 模型信息表: 表中罗列了模型应用重要的参数. 模型简评: 模型参数达到要求:样本量足够:有一定的借鉴价值:模型根据 ...
- R语言怎么比较两个模型C指数,手把手教你用R语言评价临床预测模型,一文就够(附代码)...
(三)Logistic回归模型评价: 在常用的临床模型构建中,主要分为两种,包括临床预测模型(Cox回归模型)和临床诊断模型(Logstic回归模型).在之前的内容中,阿琛给大家介绍了如何使用Nomo ...
- R数据分析:临床预测模型中校准曲线和DCA曲线的意义与做法
之前给大家写过一个临床预测模型:R数据分析:跟随top期刊手把手教你做一个临床预测模型,里面其实都是比较基础的模型判别能力discrimination的一些指标,那么今天就再进一步,给大家分享一些和临 ...
- R数据分析:跟随top期刊手把手教你做一个临床预测模型
临床预测模型也是大家比较感兴趣的,今天就带着大家看一篇临床预测模型的文章,并且用一个例子给大家过一遍做法. 这篇文章来自护理领域顶级期刊的文章,文章名在下面 Ballesta-Castillejos ...
- R语言临床预测模型:分层构建COX生存回归模型STRATIFIED COX MODEL、KM生存曲线、PH假设检验...
全文链接:http://tecdat.cn/?p=32046 stratified cox model是针对协变量不满足PHA提出的,这里的思想是对协变量分层(点击文末"阅读原文" ...
最新文章
- LeetCode简单题之判断路径是否相交
- Spring Bean配置方式之一:Java配置
- linux开机启动遇到grub启动_Linux如何跳过grub启动
- ISP采用的 ISIS链接状态路由协议
- Android dumpsys命令详细使用
- C++:构造函数之初始化列表
- VRAR应该是工具,而不是“玩具”
- 2016/2/13 《计算机系统要素》(The Elements of Computing Systems)读书笔记(1)
- C#利用委托跨线程更新UI数据
- E-BERT: 电商领域语言模型优化实践
- 安全加固脚本及解析等保2.0(仅供参考)
- 五线谱音名和组别对照表_钢琴音区名称及琴键名称对照表
- MIPI.DSI.LCD點屏筆記_AT070TN92(800x480)_THC63LVDF84B_深圳富元智FX6
- 三七互娱U3D面试记录
- NepCTF2022 Writeup
- csr与服务器连接中断,CSR Racing 2无法连接服务器如何解决
- 用最新技术优化深度学习BTC交易机器人
- OPenGL 学习笔记之 Mesh 网格知识
- uniapp 小程序点击事件如何获取event对象
- intel ME 禁用 研究
热门文章
- 堆栈宽度学习Stacked BLS的简单python代码实现
- 电容 电阻0201/0402/0603/等封装长宽高定义
- Linux Centos7 测试硬盘IO速度
- 【Mac】 自带的播放器quicktimeplayer 如何带声音2倍速播放
- 2022年最新BIM计费标准,涉及14省市
- 探索艾利特机器人丨EC66在物流行业的应用
- 跨境转运常用运费计算方式
- python打印购物清单_实例9:用Python自动生成Excel档每日出货清单
- 回顾过去三年工作中对区块链技术的一点心得
- Java通过cad图生成3d模型,将CAD图纸转换为SolidWorks三维模型