• 使用 R 构建复杂设计调查加权(Survey-Weighted) Cox 模型的列线图


    列线图,又称诺莫图(Nomogram),它是建立在回归分析的基础上,使用多个临床指标或者生物属性,然后采用带有分数高低的线段,从而达到设置的目的:基于多个变量的值预测一定的临床结局或者某类事件发生的概率。列线图(Nomogram)可以用于多指标联合诊断或预测疾病发病或进展。
    近些年来在高质量SCI临床论文中用的越来越多。列线图将回归模型转换成了可以直观的视图,让结果更容易判断,具有可读性,例如:
    在这里插入图片描述
    对于复杂设计调查(Survey-Weighted)的数据,我们不能使用RMS包直接绘制预测模型列线图,这样会造成数据偏差,今天我们来介绍SvyNom绘制复杂设计调查(Survey-Weighted)的数据cox回归的列线图,先导入数据和R包

    library("rms")
    library("survey")
    library("SvyNom")
    set.seed(1234)
    noNA<-read.csv("E:/r/test/noNA.csv",sep=',',header=TRUE)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    上图只显示了一部分,这是一个转移性胃癌患者(Power、Capanu、Kelsen 和 Shah 2011)的数据(公众号回复:胃癌数据,可以获得数据),数据很多我们选取一部分建模,age_dx:年龄,group:分组变量,分为存活率小于2年的和大于两年的,inv_weight:概率权重,ssize:每个分组患者的人数,survival生存时间,surv_cens生存结局
    要建立调查加权,我们先要生成一个调查表,我们这里是根据患者是否能活超过24个月进行分层,

    dstr2 <- svydesign(id = ~1, strata = ~group, prob = ~inv_weight, 
      fpc = ~ssize, data = noNA)
    
    • 1
    • 2

    prob 指定的抽样概率对于长期幸存者组(≥ 24月)中的患者等于 1,对于存活不到 2 年的患者均等于 253/853=0.296。fpc 选项指定已在每个层中抽样的总人口,在 ≥ 24 组中等于 132,对于 <24 组中的患者等于 853。

    建立cox方程拟合包含患者年龄、ECOG 状态、白蛋白和血红蛋白水平、肿瘤分化、是否存在多个转移部位等变量

    svy.cox.fit <- svycoxph(Surv(survival, surv_cens) ~ ECOG + liver_only + 
      Alb + Hb + Age + Differentiation + Gt_1_m1site + lymph_only, x = TRUE, 
      design = dstr2)
    svy.cox.fit
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    对数据格式设定

    dd <- datadist(noNA)
    options(datadist = "dd")
    ss3 <- c(0.05, 0.2, 0.4, 0.6, 0.7, 0.8, 0.9, 0.95, 0.99)
    
    • 1
    • 2
    • 3

    构建列线图数据,design =填入我们的调查表,model=填入我们建立的模型,pred.at =这里我们预测两年生存率,所以填入24,fun.lab =这里生存列线图标签

    mynom <- svycox.nomogram(.design = dstr2, .model = 
      Surv(survival, surv_cens) ~ ECOG + liver_only + Alb + Hb + Age + 
      Differentiation + Gt_1_m1site + lymph_only, .data = noNA, pred.at = 24, 
      fun.lab = "Prob of 2 Yr OS")
    
    • 1
    • 2
    • 3
    • 4

    绘图

    plot(mynom$nomog)
    
    • 1

    在这里插入图片描述
    通过重抽样建立引导数据对列线图进行验证

    bootit <- 200
    cases <- which(noNA$group == "long")
    controls <- which(noNA$group == "<24")
    boot.index <- matrix(NA, nrow(noNA), bootit)
    for (i in 1:bootit)
      boot.index[, i] <- c(sample(cases, replace = TRUE), sample(controls, replace = TRUE))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    估值差异很小,说模型可信度不错。最后绘制校准曲线

    svycox.calibrate(mynom)
    
    • 1

    在这里插入图片描述
    在这里插入图片描述
    OK,本文结束,觉得有用的话请分享给需要的人哟。

  • 相关阅读:
    全国大学生智能汽车大赛(三):上下位机通信协议及代码
    FH511+TP4333组成一个户外移动电源照明野营灯方案。
    深度学习_6_实战_点集最优直线解_代码解析
    【微信小程序】自定义组件(一)
    是否需要提高代码阅读能力?这有技巧
    论文解析——异构多芯粒神经网络加速器
    win配置前端开发环境
    毕业设计-基于SpringBoot校园论坛管理系统
    基于Android studio图书馆自习室座位预约系统java
    企业内网远程桌面控制软件及解决方案
  • 原文地址:https://blog.csdn.net/dege857/article/details/125599631