qcustomplot绘制动态曲线_R绘制别样的列线图(Nomogram):基于DynNom

** 本文首发布在微信公众号:统计联盟丁香园**

用于预测模型可视化的列线图(Nomogram,诺模图)已为大家所熟知,很多朋友在自己的文章中也用过。不过,大家使用的列线图一般是下图这样的(见图1)。

0f551822aabe679ae0c5ed4056132f83.png
图1. 普通列线图

对于这样的列线图,观赏性可能要大于实用性。如果让你用这样的图去说明某特征患者的3年生存率是多少,你会怎么做?拿着直尺画垂直线,然后将各个特征对应的points加起来,根据Total points再画垂直线吗?这样的话,实用性和可操作性可就太低了。或许,你会说可以在列线图上加垂直的网格线,像下图这样(见图2)。但,还是需要手动计算,且精确性也不好。

a47fea92a783e6ed33f326fa29593aea.png
图2. 改进版列线图

总而言之,这样的列线图解释起来和实际运用起来都有点麻烦。那如何才能让列线图发挥实用性呢?说到这里,肯定会有朋友想到R package:regplot,regplot可以绘制出交互式列线图,是一个很好的解决方案;有的朋友还会想到另外一个R package:nomogramEx,它配合常用的列线图使用,可以得到一个Total points的计算公式。

今天,暂时不说上述两个R packages,说说另外一个R package:DynNom,即动态列线图。这个R package使用起来很简单,在建立模型后直接使用即可。下面以骨髓异常增生综合征(MDS)患者的生存资料为例,简单介绍一下DynNom的使用

根据2019年新发布的MDS诊疗指南和前期的变量筛选,多因素Cox回归模型纳入了年龄分组(Agecat:≤44、45-64、≥65)、修订版国际预后评分系统(IPSS-R:Lower-risk、Int-risk、High-risk)、基因是否突变(TP53、EZH2、SF3B1、IDH1)6个变量。使用coxph( )建立的模型情况如下图。

e788d9f3afee97c91a89ee2af8cfa6db.png
图3. 多因素Cox回归模型结果

接下来,我们根据已建立的模型应用nomogram( )先绘制了如图1所示的普通列线图。在这里我们不妨先试着算一下年龄≥65、IPSS-R为High-risk、TP53未突变、SF3B1突变、EZH2和IDH1未突变的患者Total points和1-year survival probability。根据图1,大概得知具有上述特征患者的Total points和1-year survival probability分别约为190和0.72。下面开始用DynNom ( )绘制动态列线图,主要代码如下:

fcox <- cph(Surv(time, status) ~ Agecat + IPSSR + TP53 + SF3B1 + EZH2 + IDH1, surv=T, data=dat)

DynNom(fcox, dat) ##注意,数据框的名字不要用data,会报错(遇到过这一问题)

96f49709af87090c960c431595e972ac.png
图4. 动态列线图

代码运行后会生成一个动态网页,如图4。在图的左边是患者特征,就像excel的下拉菜单,可以选择不同的亚组。选择相应的特征后,点击Predict按钮,即可生成上图右侧的生存率及其95%置信区间;勾选左侧下方的Predicted Survival at this Follow Up,拖动按钮,即可得到不同随访时间的生存率和生存曲线。另外点击上部的Numerical Summary和Survival Plot可以得到与上图对应的数据表格和生存曲线,如图5、图6。

c7d13a0eabe7587388048686d6d8a20b.png
图5. 不同特征和随访时间的患者对应的生存率

cdff848b9ec67562f4ea2d065a1f7357.png
图6. 不同特征和随访时间的患者生存曲线

前面我们根据图1计算过一个患者的1年生存率(约0.72),现在请看图5的第一行。我们可以看到,具有前述特征的患者1年生存率为0.730(95%CI:0.620~0.860)。这里不仅给出了一个精确的数字,而且给出了95%置信区间。这么一看,是不是要比普通的列线图更具有操作性和实用性呢?

除了Cox模型,DynNom还可以用于线性模型(lm)、logistic模型(lrm)、广义线性模型(glm)、广义相加模型(gam)等的预测结果可视化,用法也是一样的简单直接。

总结一下,从上面的介绍可知,动态列线图(Dynamic Nomogram)可以很好的解决列线图好看而不好用的问题,同时还将生存曲线融合了进来,可以说是功能多样化了。但是,问题来了,这样的图如何放到文章里呢?有人说可以生成在线网页使用。各位朋友,有对动态列线图更加了解或者已经实际运用过的吗?欢迎各位畅所欲言呀!欲获取详细代码代码,请至丁香园联系墨点星沟。

下篇文章将介绍如何将动态列线图放到网页内。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是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() ``` 希望这些代码能对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值