【问题标题】:Kaplan-Meier survival curve with manually fixed decline rate of patient pool手动固定患者池下降率的 Kaplan-Meier 生存曲线
【发布时间】:2015-12-03 14:48:39
【问题描述】:

我创建了一个包含两条 Kaplan-Meier 生存曲线的图形,以显示两种药物对患者生存的影响。该数据集包括 41 名患者,其中 26 名 (A1-A26) 已接受口服药物治疗,15 名 (B1-B15) 已接种疫苗。 x 轴显示天数,y 轴显示整个患者池的百分比。我只感兴趣从研究的 0-400 天绘制,这意味着不会显示“口服”(A25,A26)和“疫苗”(B14,B15)的两个数据点。此外,我想绘制在患者死亡时下降 1.45 个单位的 Kaplan-Meier 曲线(如数据列“生存”所示)。基于此,“口服”的曲线将停止在 62.32%,而“疫苗”的曲线将停止在 81.16%(不包括每个 > 400 天的两个数据点),因此 y 轴将从 60% 开始(而不是 0%)。然而,目前“口服”曲线下降了 26/100 单位,“疫苗”曲线下降了 15/100 单位,这是基于所有患者在试验结束时都将死亡的假设。因此,我很想知道:

  1. 患者池的下降率是否可以固定在1.45个单位,
  2. 如何显示数据点持续超过 400 天(实际上没有将曲线延伸到超过 400 天的数据点)和
  3. 我是否正确使用对象“状态”(即,我已将状态 1 分配给每位患者)。

下面是一个可重现的示例数据集和我目前使用的代码。

所需的软件包: 图书馆(生存), 库(ggplot2)

  1. 加载可重现的数据

    structure(list(patient = structure(c(1L, 12L, 20L, 21L, 22L, 
    23L, 24L, 25L, 26L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 
    13L, 14L, 15L, 16L, 17L, 18L, 19L, 27L, 34L, 35L, 36L, 37L, 38L, 
    39L, 40L, 41L, 28L, 29L, 30L, 31L, 32L, 33L), .Label = c("A1", 
    "A10", "A11", "A12", "A13", "A14", "A15", "A16", "A17", "A18", 
    "A19", "A2", "A20", "A21", "A22", "A23", "A24", "A25", "A26", 
    "A3", "A4", "A5", "A6", "A7", "A8", "A9", "B1", "B10", "B11", 
    "B12", "B13", "B14", "B15", "B2", "B3", "B4", "B5", "B6", "B7", 
    "B8", "B9"), class = "factor"), survival = c(98.55, 97.1, 95.65, 
    94.2, 92.75, 91.3, 89.85, 88.4, 86.95, 85.5, 84.05, 82.6, 81.15, 
    79.7, 78.25, 76.8, 75.35, 73.9, 72.45, 71, 69.55, 68.1, 66.65, 
    65.2, 49.9, 57.97, 98.55, 97.1, 95.65, 94.2, 92.75, 91.3, 89.85, 
    88.4, 86.95, 85.5, 84.05, 82.6, 81.15, 67.6, 72), days = c(103L, 
    105L, 110L, 121L, 124L, 126L, 140L, 144L, 152L, 173L, 176L, 181L, 
    185L, 200L, 206L, 211L, 223L, 247L, 253L, 261L, 276L, 281L, 309L, 
    334L, 402L, 489L, 148L, 216L, 255L, 257L, 280L, 290L, 306L, 325L, 
    305L, 307L, 334L, 329L, 343L, 560L, 610L), treatment = structure(c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("oral", "vaccine"
    ), class = "factor"), status = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L)), .Names = c("patient", "survival", "days", "treatment", 
    "status"), class = "data.frame", row.names = c(NA, -41L))
    
  2. 创建一个 Surv 对象并为您的数据估计一个幸存者函数

    fit.test <- survfit(Surv(days, status == 1) ~ treatment, data=test, conf.int=FALSE)
    
  3. 运行函数ggsurv

  4. 剧情

    ggsurv(fit.test, lty.est = 1) + 
    geom_text(data = NULL, size=5.0, col = "red", x = 39.0, y = 0.23,  label = "oral") +
    geom_text(data = NULL, size=5.0, col = "blue", x = 30.5, y = 0.12, label = "vaccine") +
    
    scale_x_continuous(expand=c(0.01,0.01),
                 limits=c(0,400),
                 breaks=c(0,50,100,150,200,250,300,350,400),
                 labels=c("0","50","100","150","200","250","300","350","400")) +
    scale_y_continuous(expand=c(0.005,0.01),
                 limits=c(0,1.0),   
                 breaks=c(0,0.2,0.4,0.6,0.8,1),
                 labels=c("0","0.2","0.4","0.6","0.8","1.0")) +
    
    xlab("Time") +
    ylab("Survival") + 
    
    theme_bw() +
    theme(legend.position="none") +
    theme(axis.title.x = element_text(vjust=0.1,face="bold", size=16),
    axis.text.x = element_text(vjust=4, size=14))+ 
    theme(axis.title.y = element_text(angle=90, vjust=0.70, face="bold", size=18),
    axis.text.y = element_text(size=14)) +
    theme(panel.grid.minor=element_blank(), panel.grid.major=element_blank()) +
    theme(panel.border = element_rect(size=2, colour = "black", fill=NA, linetype=1)) +
    theme(plot.margin = unit(c(-0.9,0.4,0.28,0.0),"lines"))
    

【问题讨论】:

  • 在您的数据中,每个人在试验结束时都有一个事件,所以在我看来,情节是预期的(因为每个患者的状态为 1)。在你的研究中,真正发生了什么?每个人都死了/有事件吗?还是你有审查?
  • @Heroka,是的,所有患者都已死亡。您是对的,可以根据状态预期该图,但我想知道是否可以手动将下降步骤固定为 1.45,这与每个处理的总样本量为 68 相关。 41 和 26 的样本大小代表子集。一种选择是创建总共 68 个虚拟患者,但我想知道是否有更优雅的方法。

标签: r ggplot2 survival-analysis


【解决方案1】:

通过创建survival 对象会出现问题。以您呈现数据的方式,看起来该组中的所有患者在口服 489 天和接种疫苗 610 天后都经历了该事件。但是您知道这只是数据的一部分,因为您有剩余可用患者的百分比。您可以为该组的最后一天未经历事件的患者添加行,并将其状态设为 0。或者,您只需使用 geom_step 来创建图,而不使用 ggsurv 函数。

round(100/1.45)
test <- test[ ,c(1,3:5)]
extra_patients <- 
  data.frame(patient = c(paste('A', 27:69, sep = ''), 
                        paste('B', 16:69, sep = '')),
            days = rep(c(489, 610), c(43, 54)),
            treatment = rep(c('oral', 'vaccine'), c(43, 54)),
            status = 0)
 full_test <- rbind(test, extra_patients)
 library(survival)
 fit.test <- survfit(Surv(days, status == 1) ~ treatment, data=full_test, conf.int=FALSE)
 library(GGally)
 ggsurv(fit.test) + coord_cartesian(xlim = c(0,400))

【讨论】:

  • 谢谢,这很有帮助。我不知道 geom_step 选项,对于这个所有患者都具有相同状态的示例,它的工作非常好。谢谢。
猜你喜欢
  • 2019-10-25
  • 2020-11-03
  • 2016-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多