转载自品略图书馆 http://www.pinlue.com/article/2020/03/3020/5510072525626.html

建立一个模型后,我们常常会评价模型的区分度(discrimination)和校准度(calibration)。生存模型中,我们经常会看到使用calibration图来呈现模型的校准度。笔者近期查阅了网上许多绘制calibration图的R代码,发现很多代码忽略了time.inc参数的使用,甚至注释中提到了这个参数的重要性却仍然用错了。将愚见记录与此,若有理解错误,烦请大佬指正。

发现这个问题是源于丁香园中一个讨论(关于R语言做calibration curve的相关问题),其中一个人提出“需要注意的是cph()建立模型的时候,time.inc参数的数值应该和calibrate()函数中参数u保持一致,例如3年就都是36。”

笔者首先查阅网上的相关代码,有的代码中会注释到time.inc需与参数u一致,但是却将time.inc局限地理解为建立Nomogram时的利用predictor计算survival的生存函数中的time参数。实际上在建立cph()时就应该预先设定好相应的time.inc参数的值。之前笔者也不确定这个参数的设置是否真的这么重要,然后就在自己的数据中进行尝试和比较,发现得到的calibration图差别比较大,于是找到rms包的源代码,发现其中calibrate.cph.s文件中如下几行和这个问题相关:

#获取生存预测模型的summary

ssum <- fit$surv.summary

if(!length(ssum)) stop('did not use surv=TRUE for cph( )')

cat("Using Cox survival estimates at ", dimnames(ssum)[[1]][2],

" ", unit, "s\n", sep="")

#获取每个层的2nd time(即u时刻)的平均生存率S  #注意:此处不是基线风险函数h0

surv.by.strata <- ssum[2, , 1] #2nd time= at u, all strata

xb <- fit$linear.predictors   #获取Cox模型的predictor #注意:这里线性部分是减去了均值的

if(length(stra <- fit$strata))

surv.by.strata <- surv.by.strata[stra]

#根据公式计算每个样本的生存率

survival <- as.vector(surv.by.strata ^ exp(xb))

其中我们看到,计算的基线生存函数,是u时刻的基线生存函数,但是这个u值却直接取自fit的模型的summary中,并非我们之后在调用calibrate方法时设置的u参数(这么做也是为了使整体源代码更简洁,但却容易造成用户误用)。

根据这些,笔者认为,正确的calibration应该这么绘制(以下举例,且忽略了nomogram的绘制)

coxm <- cph(Surv(time, status==1)~Age.+Grade.+Stage.+Surgery.+Size.+Site.,

x=T,y=T,data=All.data, surv=T, time.inc=36)

cal<-calibrate(coxm,u=36,cmethod='KM',m=150, B=100)

plot(cal,xlim = c(0,1),ylim= c(0,1),

errbar.col=c(rgb(0,0,0,maxColorValue=255)),

col=c(rgb(255,0,0,maxColorValue=255)),

xlab = "Predicated 3-year CSS",

ylab = "Actual 3-year CSS")

abline(0,1,lty=3,lwd=2,col=c(rgb(0,0,255,maxColorValue= 255)))

以上愚见,欢迎大家一起进一步讨论这个问题!

关于nomogram核心函数的time.inc函数的设定相关推荐

  1. x264代码剖析(十四):核心算法之宏块编码函数x264_macroblock_encode()

    x264代码剖析(十四):核心算法之宏块编码函数x264_macroblock_encode() 宏块编码函数x264_macroblock_encode()是完成变换与量化的主要函数,而x264_m ...

  2. binarytreenode”使用 类 模板 需要 模板 参数列表_c++1117 模板核心知识(一)—— 函数模板...

    目录 定义函数模板 使用函数模板 两阶段翻译 Two-Phase Translation 模板的编译和链接问题 多模板参数 引入额外模板参数作为返回值类型 让编译器自己找出返回值类型 将返回值声明为两 ...

  3. 《linux命令行与shell脚本编程大全》第三版 - 核心笔记(3/4):函数与图形化脚本

    <linux命令行与shell脚本编程大全> 全书4部分: ☆ [1]linux命令行(1-10章) ☆ [2]shell脚本编程基础(11-16章) ☆ [3]高级shell脚本编程(1 ...

  4. javaScript核心学习 (二)函数和对象,继承原型链

    javaScript的函数和对象,继承原型链 一.函数 1.初始函数 2.创建函数 2.1 参数设置 2.2 函数声明 来创建函数 2.3 函数表达式创建函数 3.变量作用域 4.匿名函数 5.回调函 ...

  5. c 函数多次声明_C++核心准则C.132:不要没有理由就将函数声明为虚函数

    岫玉 C.132: Don't make a function virtual without reason C.132:不要没有理由就将函数声明为虚函数 Reason(原因) Redundant v ...

  6. python核心底层_大话Python函数底层逻辑 - 北门吹雪 - 开发者的网上家园

    函数 叫 子过程或子程序 描叙的更为贴近实际应用场景 这和数学中的函数实现上不同但语义上相识,如 f(x) = expressiom, 给定一个确定的输入必然返回一个确定的输出 数学中函数的关系是通过 ...

  7. 【Python核心】不可或缺的自定义函数

    一个规范的值得借鉴的Python程序,除非代码量很少(比如 10 行.20 行以下),基本都应该由多个函数组成,这样的代码才更加模块化.规范化 函数是Python程序中不可或缺的一部分 事实上,在前面 ...

  8. python装饰器函数-【python3】 函数 装饰器

    第一步 : 了解装饰器 装饰器模式,重点在于装饰,装饰的核心仍是被装饰的对象. 举一个栗子:我今天穿了一件短袖,但是突然一阵风,短袖没办法为我御寒,我想到的办法是将短袖变得更厚更长,但是改造之后,它就 ...

  9. 【C 语言】二级指针作为输入 ( 二维数组 | 抽象业务函数 | 二维数组打印函数 | 二维数组排序函数 )

    文章目录 一.抽象 二维数组 业务函数 1.二维数组 打印函数 2.二维数组 排序函数 二.完整代码示例 一.抽象 二维数组 业务函数 1.二维数组 打印函数 注意 , 二维数组 作为 函数参数 输入 ...

  10. 虚函数和纯虚函数的区别

    首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数. 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数. 定义一个函数为纯虚函数,才代表函数没有被实现. 定义纯虚函数是为了实 ...

最新文章

  1. IBatis.Net学习笔记九--动态选择Dao的设计分析
  2. 活久见!新泽西州长急聘COBOL程序员!网传去应聘的程序员最小年龄都在 60 岁以上!...
  3. Istio 1.1 版本发布,性能和可用性提升
  4. Codeforces Round #443 (Div. 2) B. Table Tennis
  5. arima模型 p q d 确定_时间序列分析第07讲(ARIMA模型,季节时间序列模型,均值的估计)...
  6. 20211028 Stabilizability
  7. leetcode 662. Maximum Width of Binary Tree | 662. 二叉树最大宽度(BFS)
  8. JavaScript设计模式(一)-- 简单工厂模式
  9. 在Windows Mobile上隐藏你的应用程序
  10. java简单租车系统 慕课手记_Java租车系统(新手)
  11. 高斯消元法、LU分解法与克莱姆法则解方程组的C++实现
  12. js打开新窗口的方法总结
  13. Apple Pay 接入
  14. django jwt token 令牌
  15. [爬虫系列(三)]用多线程爬取百度贴吧默认表情
  16. ppt太大无法上传怎么压缩变小?
  17. 持久内存指令(PMDK)简介
  18. 手把手教你使用Java生成助记词、私钥、地址|Java区块链钱包生成助记词、地址
  19. python 视频截取 利用ffmpeg截取MP4视频片段
  20. 不准把水放在计算机旁英语翻译,英语翻译translationpra水ctice.ppt

热门文章

  1. 我不相信长夜将至,因为火把就在自己手中。
  2. 长芯微LCM1118 16 位模数转换器 P2P替代ADS1118
  3. 微信h5缓存清理技巧
  4. 小程序学习笔记5---导航跳转
  5. 用ajax表单全部提交
  6. 多年编码经验血泪史总结,你若想学Python,必须看完这几点再做决定
  7. [学习笔记]Java如何处理EXCEL的读取
  8. 【T001】win10开机 自动打开 chrome word excel
  9. 登录页面(使用数据库)
  10. HiveHive创建数据库与创建数据库表