Я создал фигуру с двумя кривыми выживаемости Каплана-Мейера, чтобы отобразить эффект двух лекарств на выживаемость пациентов. Набор данных включает 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,45 единиц,
- как его можно отобразить, что точки данных продолжают за 400 дней (без фактического расширения кривых к тем точкам данных> 400 дней) и
- правильно ли я использую статус объекта (т.е. я дал статус 1 каждому пациенту).
Ниже приведены воспроизводимые примеры данных и код, который я использую в настоящее время.
Необходимые пакеты: библиотека (выживание), библиотека (ggplot2)
нагрузки воспроизводимые данные
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))
Создать объект Surv и оценки функции выживший для данных
fit.test <- survfit(Surv(days, status == 1) ~ treatment, data=test, conf.int=FALSE)
Run функция ggsurv
Участок
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, но мне интересно, есть ли более элегантный подход. – tabtimm