원출처 : https://radhakrishna.typepad.com/summary---survivalanalysis-a-self-learning-text.pdf
Kaplan-Meier Survival Analysis에 대해서 알아본다.
Kaplan-Meier 생존분석은 시간이 지남에 따른 생존율을 구하는 방법이다. 100명의 사람이 있고 1월 1일 0시부터 실험이 시작되었다고 가정해보자.
매 시간마다 사람이 10명씩 죽는 것이 관측되었고 실험은 총 6시간 동안 진행되었다.
01시가 되었을 때, 100명의 사람 중 10명이 죽었을 것이고, 02시가 되었으면 죽은 10명을 뺀 90명의 사람 중 10명이 죽었다.
그렇다면 01시의 생존율은 100명 중 90명이 살아남았으므로 90%가 된다. 02시가 되면 90명 중 10명이 죽고 80명이 살아남는다.
따라서 02시의 생존율은 01시의 생존율인 \(0.9 * (80/90) = 0.8\)이 된다. 이런 식으로 시험이 종료될 때까지 반복하는 비교적 단순한 방법이다.
이러한 단순한 방법으로 인해 실제 논문 작성 시에 Kaplan-Meier 방식으로만 분석이 진행되기는 어렵다. 하지만 이 분석법을 사용하는 과정에서 어떠한 가정도 존재하지 않기 때문에 직관적으로 데이터를 이해하는데 도움이 된다.
실제 데이터를 이용하여 예시를 들어보자.
library(survival)
library(tidyverse)
raw.leukemia <- read.csv("leukemia.csv")
head(raw.leukemia)
## 癤퓁d group time failure logWBC
## 1 1 treat 6 1 2.31
## 2 2 treat 6 1 4.06
## 3 3 treat 6 1 3.28
## 4 4 treat 7 1 4.43
## 5 5 treat 10 1 2.96
## 6 6 treat 13 1 2.88
summary(raw.leukemia)
## 癤퓁d group time failure
## Min. : 1.00 Length:42 Min. : 1.00 Min. :0.0000
## 1st Qu.:11.25 Class :character 1st Qu.: 6.00 1st Qu.:0.0000
## Median :21.50 Mode :character Median :10.50 Median :1.0000
## Mean :21.50 Mean :12.88 Mean :0.7143
## 3rd Qu.:31.75 3rd Qu.:18.50 3rd Qu.:1.0000
## Max. :42.00 Max. :35.00 Max. :1.0000
## logWBC
## Min. :1.450
## 1st Qu.:2.303
## Median :2.800
## Mean :2.930
## 3rd Qu.:3.490
## Max. :5.000
raw.leukemia <- raw.leukemia %>%
rename(id = 癤퓁d)
## 치료제 처리군의 Kaplan-Meier analysis
treat_leukemia <- raw.leukemia %>%
filter(group == "treat")
surv.treat <- Surv(time = treat_leukemia$time, event = treat_leukemia$failure)
fit.1 <- survfit(surv.treat ~ 1, data = treat_leukemia, conf.type = "none")
summary(fit.1)
## Call: survfit(formula = surv.treat ~ 1, data = treat_leukemia, conf.type = "none")
##
## time n.risk n.event survival std.err
## 6 21 3 0.857 0.0764
## 7 17 1 0.807 0.0869
## 10 15 1 0.753 0.0963
## 13 12 1 0.690 0.1068
## 16 11 1 0.627 0.1141
## 22 7 1 0.538 0.1282
## 23 6 1 0.448 0.1346
## 대조군의 Kaplan-Meier analysis
placebo_leukemia <- raw.leukemia %>%
filter(group == "placebo")
surv.placebo <- Surv(time = placebo_leukemia$time, event = placebo_leukemia$failure)
fit.2 <- survfit(surv.placebo ~ 1, data = placebo_leukemia, conf.type = "none")
## 그룹 별 분석
surv.leukemia <- Surv(time = raw.leukemia$time, event = raw.leukemia$failure)
fit.3 <- survfit(surv.leukemia ~ group, data = raw.leukemia, conf.type = "none")
plot(fit.3, lty = 1:2)
legend("topright", legend = c("placebo", "treat"), lty = 1:2)
## 신뢰구간을 설정하고 싶으면 conf.int = T로 설정한다
plot(fit.2, conf.int = T, col = c("green", "red", "red"))
legend("topright", legend = c("placebo"), col = "green", lty = 1)
Kaplan-Meier survival curve의 비교는 log rank test 또는 Peto test를 이용하여 진행한다.
## log rank test
survdiff(surv.leukemia ~ group, data = raw.leukemia, rho = 0)
## Call:
## survdiff(formula = surv.leukemia ~ group, data = raw.leukemia,
## rho = 0)
##
## N Observed Expected (O-E)^2/E (O-E)^2/V
## group=placebo 21 21 10.7 9.77 16.8
## group=treat 21 9 19.3 5.46 16.8
##
## Chisq= 16.8 on 1 degrees of freedom, p= 4e-05
## 두 그룹은 유의한 차이가 존재한다.
## Peto test : 초기 event에 가중치를 둔다
survdiff(surv.leukemia ~ group, data = raw.leukemia, rho = 1)
## Call:
## survdiff(formula = surv.leukemia ~ group, data = raw.leukemia,
## rho = 1)
##
## N Observed Expected (O-E)^2/E (O-E)^2/V
## group=placebo 21 14.55 7.68 6.16 14.5
## group=treat 21 5.12 12.00 3.94 14.5
##
## Chisq= 14.5 on 1 degrees of freedom, p= 1e-04
## 마찬가지로 유의성이 존재한다.