logistic回归列线图(nomogram)的多种绘制方法

获取更多R语言知识,请关注公众号:医学和生信笔记

医学和生信笔记,专注R语言在临床医学中的使用,R语言数据分析和可视化。主要分享R语言做医学统计学、meta分析、网络药理学、临床预测模型、机器学习、生物信息学等。

列线图(Alignment Diagram),又称诺莫图(Nomogram图),用来把多因素回归分析结果(logistic回归和cox回归)用图形方式表现出来,将多个预测指标进行整合,然后采用带有刻度的线段,按照一定的比例绘制在同一平面上,从而用以表达预测模型中各个变量之间的相互关系。

根据模型中各个影响因素对结局变量的贡献程度(回归系数的大小),给每个影响因素的每个取值水平进行赋分,然后再将各个评分相加得到总评分,最后通过总评分与结局事件发生概率之间的函数转换关系,从而计算出该个体结局事件的预测值。

列线图在生信文章中都快被用烂了,但是大部分都是垃圾,纯粹是为了凑图而已。

安装R包

install.packages("rms")
install.packages("DynNom")
install.packages("regplot")
devtools::install_local("D:/R/R包/VRPM_1.2.tar.gz"# 需要下载压缩包本地安装

logistic回归的列线图

使用lowbirth数据集,这个数据集是关于低出生体重儿是否会死亡的数据集,其中dead这一列是结果变量,0代表死亡,1代表存活,其余列都是预测变量。

注意:需要把分类变量因子化,对于无序分类变量,需要设置哑变量!

列线图1

rm(list = ls())
library(rms)
## 载入需要的程辑包:Hmisc
## 载入需要的程辑包:lattice
## 载入需要的程辑包:survival
## 载入需要的程辑包:Formula
## 载入需要的程辑包:ggplot2
## 
## 载入程辑包:'Hmisc'
## The following objects are masked from 'package:base':
## 
##     format.pval, units
## 载入需要的程辑包:SparseM
## 
## 载入程辑包:'SparseM'
## The following object is masked from 'package:base':
## 
##     backsolve

lowbirth <- read.csv("../000files/lowbirth.csv")

查看一下数据:

dim(lowbirth) # 565行,10列
## [1] 565  10
str(lowbirth) 
## 'data.frame': 565 obs. of  10 variables:
##  $ birth   : num  81.5 81.6 81.6 81.6 81.6 ...
##  $ lowph   : num  7.25 7.06 7.25 6.97 7.32 ...
##  $ pltct   : int  244 114 182 54 282 153 229 182 361 378 ...
##  $ race    : chr  "white" "black" "black" "black" ...
##  $ bwt     : int  1370 620 1480 925 1255 1350 1310 1110 1180 970 ...
##  $ delivery: chr  "abdominal" "vaginal" "vaginal" "abdominal" ...
##  $ apg1    : int  7 1 8 5 9 4 6 6 6 2 ...
##  $ vent    : int  0 1 0 1 0 0 1 0 0 1 ...
##  $ sex     : chr  "female" "female" "male" "female" ...
##  $ dead    : int  0 1 0 1 0 0 0 0 0 1 ...

简单的把人种分为白色和黑色人种(无序分类变量需要设置哑变量),再去掉race这一列,然后其余分类变量因子化。

library(dplyr)
## 
## 载入程辑包:'dplyr'
## The following objects are masked from 'package:Hmisc':
## 
##     src, summarize
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

tmp <- lowbirth %>% 
  mutate(across(where(is.character),as.factor),
         vent = factor(vent),
         black = ifelse(race == "black",1,0),
         white = ifelse(race == "white",1,0),
         other = ifelse(race %in% c("native American","oriental"),1,0)
         ) %>% 
  select(- race)

glimpse(tmp)
## Rows: 565
## Columns: 12
## $ birth    <dbl> 81.514, 81.552, 81.558, 81.593, 81.610, 81.624, 81.626, 81.68~
## $ lowph    <dbl> 7.250000, 7.059998, 7.250000, 6.969997, 7.320000, 7.160000, 7~
## $ pltct    <int> 244, 114, 182, 54, 282, 153, 229, 182, 361, 378, 255, 186, 26~
## $ bwt      <int> 1370, 620, 1480, 925, 1255, 1350, 1310, 1110, 1180, 970, 770,~
## $ delivery <fct> abdominal, vaginal, vaginal, abdominal, vaginal, abdominal, v~
## $ apg1     <int> 7, 1, 8, 5, 9, 4, 6, 6, 6, 2, 4, 8, 1, 8, 5, 9, 9, 9, 6, 2, 1~
## $ vent     <fct> 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1~
## $ sex      <fct> female, female, male, female, female, female, male, male, mal~
## $ dead     <int> 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0~
## $ black    <dbl> 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0~
## $ white    <dbl> 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1~
## $ other    <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0~

然后是打包数据。

dd <- datadist(tmp)
options(datadist="dd")

构建模型:

fit1 <- lrm(dead ~ birth + lowph + pltct + bwt + delivery + apg1 + vent + sex + black + white,data = tmp,x=T,y=T)

接下来就是构建列线图模型,然后画图。

nom1 <- nomogram(fit1, fun=plogis,
                 fun.at=c(0.001,0.1,0.25,0.5,0.75,0.9,0.99),
                 lp=T# 是否显示线性概率
                 funlabel="Risk of Death")  
plot(nom1) 
image-20220511210451830
image-20220511210451830

从这个 图来看,sexdeliveryapg1对模型的贡献很小,几乎可以忽略不计,下面我们去掉这两个变量再看看。

fit2 <- lrm(dead ~ birth + lowph + pltct + bwt + vent + black + white,
            data = tmp,x=T,y=T)
nom2 <- nomogram(fit2, fun=plogis,
                 fun.at=c(0.001,0.01,0.1,0.25,0.5,0.75,0.9,0.99),
                 lp=T
                 maxscale = 100# 最大得分数
                 conf.int = F# 添加置信区间,很难看,可以不要
                 funlabel="Dead")  
plot(nom2,
     col.grid=c("tomato","grey")
     #conf.space = c(0.3,0.5) # 置信区间位置
     ) 
image-20220511210507072
image-20220511210507072

列线图2

动态列线图,会跳出一个窗口。

library(DynNom)

fit2 <- glm(dead ~ birth + lowph + pltct + bwt + vent + black + white,
            data = tmp, family = binomial)
DynNom(fit2,DNtitle = "nomogram",DNxlab = "probability")

列线图3

library(regplot)

fit2 <- lrm(dead ~ birth + lowph + pltct + bwt + vent + black + white,
            data = tmp,x=T,y=T)
regplot(fit2,
        plots = c("violin""boxes"), ##连续性变量形状,可选"no plot" "density" "boxes" "ecdf" "bars" "boxplot" "violin" "bean" "spikes";分类变量的形状,可选"no plot" "boxes" "bars" "spikes"
        observation = tmp[1,], #用哪行观测,或者T F
        center = T# 对齐变量
        subticks = T,
        droplines = T,#是否画竖线
        title = "nomogram",
        points = T# 截距项显示为0-100
        odds = T# 是否显示OR值
        showP = T# 是否显示变量的显著性标记
        rank = "sd"# 根据sd给变量排序
        interval="confidence"# 展示可信区间
        clickable = F # 是否可以交互
        )
## Regression  fit2 lrm formula:
## dead `~` birth + lowph + pltct + bwt + vent + black + white
## CI: 0.00496(0.00106,0.0233)
## [[1]]
##   white Points
## 1   0.0     26
## 2   0.4     34
## 3   0.8     42
## 
## [[2]]
##   black Points
## 1   0.0     17
## 2   0.4     29
## 3   0.8     40
## 
## [[3]]
##       vent Points
## vent1    0     34
## vent2    1     99
## 
## [[4]]
##    bwt Points
## 1  400     87
## 2  600     72
## 3  800     57
## 4 1000     42
## 5 1200     27
## 6 1400     12
## 
## [[5]]
##   pltct Points
## 1     0     42
## 2   300     30
## 3   600     18
## 
## [[6]]
##    lowph Points
## 1    6.5    103
## 2    6.6     93
## 3    6.7     83
## 4    6.8     74
## 5    6.9     64
## 6    7.0     54
## 7    7.1     44
## 8    7.2     34
## 9    7.3     25
## 10   7.4     15
## 11   7.5      5
## 12   7.6     -5
## 
## [[7]]
##   birth Points
## 1  81.5     43
## 2  84.5     34
## 3  87.5     26
## 
## [[8]]
##   Total Points    Pr(  )
## 1          100 3.798e-05
## 2          150 3.144e-04
## 3          200 2.598e-03
## 4          250 2.112e-02
## 5          300 1.516e-01
## 6          350 5.967e-01
## 7          400 9.245e-01
## 8          450 9.902e-01
2022051120501
2022051120501

列线图4

library(VRPM)

fit2 <- glm(dead ~ birth + lowph + pltct + bwt + vent + black + white,
            data = tmp, family = binomial)

colplot(fit2,coloroptions = 3)

#df <- tmp[1,c("birth","lowph","pltct","bwt","vent","black","white")]
#ccchart(fit2,df)
20220511210511234
20220511210511234

获取更多R语言知识,请关注公众号:医学和生信笔记

医学和生信笔记,专注R语言在临床医学中的使用,R语言数据分析和可视化。主要分享R语言做医学统计学、meta分析、网络药理学、临床预测模型、机器学习、生物信息学等。

本文由 mdnice 多平台发布

  • 12
    点赞
  • 139
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
众所周知,人工智能是当前最热门的话题之一, 计算机技术与互联网技术的快速发展更是将对人工智能的研究推向一个新的高潮。 人工智能是研究模拟和扩展人类智能的理论与方法及其应用的一门新兴技术科学。 作为人工智能核心研究领域之一的机器学习, 其研究动机是为了使计算机系统具有人的学习能力以实现人工智能。 那么, 什么是机器学习呢? 机器学习 (Machine Learning) 是对研究问题进行模型假设,利用计算机从训练数据中学习得到模型参数,并最终对数据进行预测和分析的一门学科。 机器学习的用途 机器学习是一种通用的数据处理技术,其包含了大量的学习算法。不同的学习算法在不同的行业及应用中能够表现出不同的性能和优势。目前,机器学习已成功地应用于下列领域: 互联网领域----语音识别、搜索引擎、语言翻译、垃圾邮件过滤、自然语言处理等 生物领域----基因序列分析、DNA 序列预测、蛋白质结构预测等 自动化领域----人脸识别、无人驾驶技术、图像处理、信号处理等 金融领域----证券市场分析、信用卡欺诈检测等 医学领域----疾病鉴别/诊断、流行病爆发预测等 刑侦领域----潜在犯罪识别与预测、模拟人工智能侦探等 新闻领域----新闻推荐系统等 游戏领域----游戏战略规划等 从上述所列举的应用可知,机器学习正在成为各行各业都会经常使用到的分析工具,尤其是在各领域数据量爆炸的今天,各行业都希望通过数据处理与分析手段,得到数据中有价值的信息,以便明确客户的需求和指引企业的发展。
好的,以下是R语言中绘制logistic回归的代码以及nomogram、c-index和校正曲线绘制的示例代码: 首先,我们需要准备一个数据集,这里我们使用R自带的乳腺癌数据集: ```R data("breast_cancer", package = "rpart") # 将目标变量转换为二分类变量 breast_cancer$Class[breast_cancer$Class == "negative"] <- 0 breast_cancer$Class[breast_cancer$Class == "positive"] <- 1 ``` 接下来,我们使用glm函数来拟合一个logistic回归模型: ```R model <- glm(Class ~ Age + Menopause + Tumor.Size + Inv.Nodes, data = breast_cancer, family = binomial(link = "logit")) ``` 接下来,我们可以使用rms包中的nomogram函数来绘制一个nomogram: ```R library(rms) # 绘制nomogram nom <- nomogram(model, fun = function(x) 1/(1+exp(-x))) print(nom) ``` 然后,我们可以使用rms包中的validate函数来计算c-index和绘制校正曲线: ```R # 计算c-index valid <- validate(model, B = 100) valid$c.index # 绘制校正曲线 plot(valid$cal, ylim = c(0, 1), xlab = "Predicted Probabilities", ylab = "Observed Probabilities") ``` 最后,我们可以使用ggplot2包中的ggplot函数来绘制logistic回归的曲线: ```R library(ggplot2) # 计算预测概率 breast_cancer$pred_prob <- predict(model, type = "response") # 绘制曲线 ggplot(breast_cancer, aes(x = Age, y = pred_prob, color = Class)) + geom_smooth(method = "glm", method.args = list(family = "binomial"), se = FALSE) + scale_color_manual(values = c("#999999", "#E69F00")) + labs(title = "Logistic Regression Curve", x = "Age", y = "Predicted Probability", color = "Class", subtitle = "Breast Cancer Data") + theme_bw() ``` 希望这些代码能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值