楼主: moonstone
75248 33

[程序分享] R绘制Nomogram图的学习笔记 [推广有奖]

已卖:1872份资源

讲师

74%

还不是VIP/贵宾

-

威望
0
论坛币
10498 个
通用积分
369.2883
学术水平
160 点
热心指数
169 点
信用等级
124 点
经验
274346 点
帖子
237
精华
1
在线时间
520 小时
注册时间
2007-4-27
最后登录
2024-12-6

楼主
moonstone 发表于 2015-12-4 11:01:14 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

Nomogram,中文常称为诺莫图或者列线图,简单的说是将Logistic回归或Cox回归的结果进行可视化呈现。它根据所有自变量回归系数的大小来制定评分标准,给每个自变量的每种取值水平一个评分,对每个患者,就可计算得到一个总分,再通过得分与结局发生概率之间的转换函数来计算每个患者的结局时间发生的概率。


下图显示的
logisitc回归的诺曼图。比如想知道年龄70岁的男性的患病风险,只需要将age=70岁向points轴投射,则points70;同理sex=male时,points65。两者相加则Total points=135;将此数值在Total points轴上向Risk概率轴投射,则可知风险大概为0.83左右。
logistic.jpg

对于Cox回归,则可以简便地获得不同预测变量单独或组合情况下的中位生存时间或预测的生存概率。

下图显示的中位生存时间的诺曼图,比如想看60岁女性的中位生存时间,同样,首先找到60岁女性对应的总点数,约为116分,对应的中位生存时间约为550天

中位生存时间.jpg

同理,可以通过下面生存概率的诺曼图,找到60岁女性的1年及2年的生存概率分别约为65%和40%

中位生存时间.jpg

从上可以看到,诺曼图相当于一个预测工具,预测效果的好坏则可以通过C-index(意义上等价于AUC,由于算法的不同,两者结果略有差异)和下面的校正曲线来评价:

校正曲线.jpg


以下是绘制上述图形的R编码及详细说明,为了方便重复,所以采用程序包自带的数据库:

  1. ## 绘制nomogram图
  2. ## 第一步 读取rms程序包及辅助程序包
  3. library(Hmisc); library(grid); library(lattice);library(Formula); library(ggplot2)
  4. library(rms)

  5. ## 第二步 读取数据,以survival程序包的lung数据来进行演示
  6. ## 列举survival程序包中的数据集
  7. library(survival)
  8. data(package = "survival")

  9. ## 读取lung数据集
  10. data(lung)

  11. ## 显示lung数据集的前6行结果
  12. head(lung)

  13. ## 显示lung数据集的变量说明
  14. help(lung)

  15. ## 添加变量标签以便后续说明
  16. lung$sex <-
  17.   factor(lung$sex,
  18.          levels = c(1,2),
  19.          labels = c("male", "female"))

  20. ## 第三步 按照nomogram要求“打包”数据,绘制nomogram的关键步骤,??datadist查看详细说明
  21. dd=datadist(lung)
  22. options(datadist="dd")

  23. ## 第四步 构建模型
  24. ## 构建logisitc回归模型
  25. f1 <- lrm(status~ age + sex, data = lung)

  26. ## 绘制logisitc回归的风险预测值的nomogram图
  27. nom <- nomogram(f1, fun= function(x)1/(1+exp(-x)), # or fun=plogis
  28.                 lp=F, funlabel="Risk")
  29. plot(nom)


  30. ## 构建COX比例风险模型
  31. f2 <- psm(Surv(time,status) ~ age+sex, data =  lung, dist='lognormal')
  32. med <- Quantile(f2) # 计算中位生存时间
  33. surv <- Survival(f2) # 构建生存概率函数

  34. ## 绘制COX回归中位生存时间的Nomogram图
  35. nom <- nomogram(f2, fun=function(x) med(lp=x),
  36.          funlabel="Median Survival Time")
  37. plot(nom)

  38. ## 绘制COX回归生存概率的Nomogram图
  39. ## 注意lung数据的time是以”天“为单位
  40. nom <- nomogram(f2, fun=list(function(x) surv(365, x),
  41.                              function(x) surv(730, x)),
  42.                 funlabel=c("1-year Survival Probability",
  43.                            "2-year Survival Probability"))
  44. plot(nom, xfrac=.6)

  45. ## 评价COX回归的预测效果
  46. ## 第一步 计算c-index
  47. rcorrcens(Surv(time,status) ~ predict(f2), data =  lung)

  48. ## 第二步 绘制校正曲线
  49. ## 参数说明:
  50. ## 1、绘制校正曲线前需要在模型函数中添加参数x=T, y=T,详细参考帮助
  51. ## 2、u需要与之前模型中定义好的time.inc一致,即365或730;
  52. ## 3、m要根据样本量来确定,由于标准曲线一般将所有样本分为3组(在图中显示3个点)
  53. ## 而m代表每组的样本量数,因此m*3应该等于或近似等于样本量;
  54. ## 4、b代表最大再抽样的样本量

  55. ## 重新调整模型函数f2,也即添加x=T, y=T
  56. f2 <- psm(Surv(time,status) ~ age+sex, data =  lung, x=T, y=T, dist='lognormal')
  57. ## 构建校正曲线
  58. cal1 <- calibrate(f2, cmethod='KM', method="boot", u=365, m=76, B=228)

  59. ## 绘制校正曲线,??rms::calibrate查看详细参数说明
  60. par(mar=c(8,5,3,2),cex = 1.0)
  61. plot(cal1,lwd=2,lty=1,
  62.      errbar.col=c(rgb(0,118,192,maxColorValue=255)),
  63.      xlim=c(0.25,0.6),ylim=c(0.15,0.70),
  64.      xlab="Nomogram-Predicted Probability of 1-Year DFS",
  65.      ylab="Actual 1-Year DFS (proportion)",
  66.      col=c(rgb(192,98,83,maxColorValue=255)))

  67. ## rms::nomogram的完整示例详见rms程序包的帮助文件
  68. ## rms程序包的帮助文件下载网址:https://cran.r-project.org/web/packages/rms/rms.pdf
  69. ## 代表性参考文献1:http://jco.ascopubs.org/content/26/8/1364.long
  70. ## 代表性参考文献2:http://jco.ascopubs.org/content/31/9/1188.long
复制代码


为了方便学习,所以编码中只涉及了nomogram里面最常用也最核心的参数,其他参数的使用欢迎大家跟帖交流。^_^



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Nomogram 学习笔记 gram RAM OMO points 自变量 中文

已有 3 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
bigbigbigbigbig + 1 + 1 + 1 精彩帖子
viscera + 1 + 1 + 1 为数不多的好资料:详细讲解R语言做nomogra.
tmdxyz + 3 + 3 + 3 精彩帖子

总评分: 论坛币 + 3  学术水平 + 5  热心指数 + 5  信用等级 + 2   查看全部评分

本帖被以下文库推荐

沙发
tmdxyz 发表于 2015-12-5 16:44:53
谢谢 学习了 还是沙发哟

藤椅
viscera 发表于 2016-3-22 19:26:01
谢谢楼主分享,详细讲解nomogram的为数不多的好资料!
一处不解,还请楼主指点:
代码41行,为何用psm,而非cph?

板凳
yangming98 发表于 2016-3-22 20:02:29 来自手机
moonstone 发表于 2015-12-4 11:01
Nomogram,中文常称为诺莫图或者列线图,简单的说是将Logistic回归或Cox回归的结果进行可视化呈现。它根据所 ...
好的?

报纸
bigbigbigbigbig 发表于 2016-3-23 15:55:57
谢谢楼主分享!受教!

地板
chenfop 发表于 2016-4-1 12:27:16
为什么我进行到第41步就不行了,出现这种情况 失败.jpg

7
moonstone 发表于 2016-4-2 19:43:33
chenfop 发表于 2016-4-1 12:27
为什么我进行到第41步就不行了,出现这种情况
是否正确安装rms 程序包?library(rms)是否提示有错误?

8
moonstone 发表于 2016-4-2 20:40:55
viscera 发表于 2016-3-22 19:26
谢谢楼主分享,详细讲解nomogram的为数不多的好资料!
一处不解,还请楼主指点:
代码41行,为何用psm,而 ...
psm         Accelerated failure time parametric survival model
cph         Cox proportional hazards regression
两个是不同的模型,可以在41行之后添加如下语句来比较两种模型的差异,具体原理的差异需要参考相关资料。
  1. f2.1 <- cph(Surv(time,status) ~ age+sex, data =  lung, dist='lognormal')
  2. summary(f2)
  3. summary(f2.1)
复制代码


至于为什么选psm模型,nomogram函数里面示例采用的也是psm,是否可以采用cph构建的回归模型来绘制nomogram图,自己可以试试,理论上可以的。
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
viscera + 1 + 1 + 1 观点有启发

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

9
chenfop 发表于 2016-4-3 12:24:42
谢谢楼主~我用自己的数据做nomogram时也会出现问题:
> bc <- read.spss("C:/Users/Administrator/Desktop/NPC.sav", use.value.labels=F, to.data.frame=T)
警告信息:
In read.spss("C:/Users/Administrator/Desktop/NPC.sav", use.value.labels = F,  :
  C:/Users/Administrator/Desktop/NPC.sav: Unrecognized record type 7, subtype 18 encountered in system file

不管他,继续往下做,还是有问题:
> nom <- nomogram(f, fun=list(function(x) surv(36, x), function(x) surv(60, x)), lp=F, funlabel=c("3-year survival", "5-year survival"), maxscale=100, fun.at=c(0.95, 0.9, 0.85, 0.8, 0.75, 0.7, 0.6, 0.5))
错误于approx(fu, xseq, fat, ties = mean) :
  need at least two non-NA values to interpolate

请问这是什么问题,该怎么解决呢?

10
chenfop 发表于 2016-4-3 12:27:29
chenfop 发表于 2016-4-3 12:24
谢谢楼主~我用自己的数据做nomogram时也会出现问题:
> bc  nom
后面三行文字里的横线不知道怎么就加上去了,可忽略~

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-6 21:23