2015-09-08 2 views
1

Я создал фигуру с двумя кривыми выживаемости Каплана-Мейера, чтобы отобразить эффект двух лекарств на выживаемость пациентов. Набор данных включает 41 пациента, 26 (A1-A26) получили пероральное лекарство и 15 (B1-B15) вакцину. Ось оси показывает дни, а ось y - процент от общего пула пациентов. Мне интересно только с 0-400 дней исследования, а это означает, что два набора данных для «устных» (A25, A26) и «вакцины» (B14, B15) не будут показаны. Более того, я хотел бы построить кривые Каплана-Мейера, которые упадут на 1,45 единицы после смерти пациента (как указано в колонке данных «выживание»). Исходя из этого, кривая для «устного» остановилась бы на 62,32%, а на «вакцине» - на 81,16% (что исключает два набора данных, каждый из которых составляет 400 дней), так что ось у начнется с 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. Run функция 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")) 
    
+0

В ваших данных у каждого имелось событие в конце испытания, поэтому сюжет - в моем ожидании - ожидается (как статус 1 для каждого пациента). В вашем кабинете, что на самом деле произошло? Все ли умирали/имели событие? Или у вас есть цензура? – Heroka

+0

@ Герока, да, все пациенты умерли. Вы правы, сюжет можно ожидать, основываясь на статусе, но я задаюсь вопросом, можно ли вручную отрегулировать шаги снижения до 1,45, что связано с общим размером выборки 68 для каждой обработки. Размеры выборки 41 и 26 представляют собой подмножества.Одним из вариантов было бы создание манекен-пациентов в общей сложности 68, но мне интересно, есть ли более элегантный подход. – tabtimm

ответ

0

Проблема возникает при создании 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)) 
+0

спасибо, это очень полезно. Я не знал о параметре geom_step, который отлично подходит для этого примера, когда все пациенты имеют одинаковый статус. Спасибо. – tabtimm

Смежные вопросы