RICH JT, NEELY JG, PANIELLO RC, VOELKER CCJ, NUSSENBAUM B, WANG EW. A PRACTICAL GUIDE TO UNDERSTANDING KAPLAN-MEIER CURVES. Otolaryngology head and neck surgery: official journal of American Academy of Otolaryngology Head and Neck Surgery. 2010;143(3):331-336. doi:10.1016/j.otohns.2010.05.007.
: 사건 발생 시간
: censoring (중도절단) 발생 시간
Ovserved time = min(, ), 관측시간
Event indicator (중도절단여부, censoring indicator)
-> 1 :
-> 0 :
즉, 데이터는 형태를 띄게 된다. 여기에서 는 = 이면 censoring time, = 이면 survival time을 의미한다.
시간과 사건(Event) 사이의 예측 회귀 모형을 만드는 통계법으로, KM method는 타겟하는 특성 외의 다른 요인들을 통제할 수 없는 것에 반해, Cox 비례위험모형은 다양한 관측치들에 대해 사건 발생에 미치는 영향을 분석하는 다변량 분석법임.
Cox 모형의 결과는 HR(Hazard Ratio, 위험비율)로 해석함. 비례 가정이 만족되지 않을 경우 time dependent covariate approach.
위험 함수 (Hazard Function) : t 시점까지는 생존했다고 가정하고 바로 직후 사망할 확률.
생존시간 에 영향을 주는 변수(공변량)들 , , , .... , 가 존재할 때, 위험함수는 다음과 같다.
= + ... +
= +
= baseline hazard, 즉, 모든 들이 0일 때의 위험 함수
Hazard Ratio (위험비율) : 특정 시점(t)에서 두 그룹간의 위험 비율을 의미.
HR 1 : 사망 위험 증가
HR 1 : 사망 위험 감소
ex)
남자 : t = +
여자 : t = +
두 로그위험함수식의 차를 구하면 회귀계수()과 일치함.
Hazard ratio : = e
# library
library(survival)
library(survminer)
library(lubridate)
library(tidyverse)
# data
date_ex <-
tibble(
sx_date = c("2007-06-22", "2004-02-13", "2010-10-27"),
last_fup_date = c("2017-04-15", "2018-07-04", "2016-10-31")
)
date_ex
# Formatting dates
# base R
date_ex %>%
mutate(
sx_date = as.Date(sx_date, format = "%Y-%m-%d"),
last_fup_date = as.Date(last_fup_date, format = "%Y-%m-%d")
)
# Lubridate package
date_ex %>%
mutate(
sx_date = ymd(sx_date),
last_fup_date = ymd(last_fup_date)
)
# Calculating survival times
# base R
date_ex %>%
mutate(
os_yrs =
as.numeric(
difftime(last_fup_date,
sx_date,
units = "days")) / 365.25
)
# lubridate package
date_ex %>%
mutate(
os_yrs =
as.duration(sx_date %--% last_fup_date) / dyears(1)
)
# Creating survival objects
Surv(lung$time, lung$status)[1:10]
# Estimating survival curves with the Kaplan-Meier method
f1 <- survfit(Surv(time, status) ~ 1, data = lung)
names(f1)
# Kaplan-Meier plot
# base R
plot(survfit(Surv(time, status) ~ 1, data = lung),
xlab = "Days",
ylab = "Overall survival probability")
# ggsurvplot
ggsurvplot(
fit = survfit(Surv(time, status) ~ 1, data = lung),
xlab = "Days",
ylab = "Overall survival probability")
# Estimating x-year survival
summary(survfit(Surv(time, status) ~ 1, data = lung), times = 365.25)
# Estimating median survival time
survfit(Surv(time, status) ~ 1, data = lung)
# Median survival is often estimated incorrectly
lung %>%
filter(status == 2) %>%
summarize(median_surv = median(time))
# Comparing survival times between groups
survdiff(Surv(time, status) ~ sex, data = lung)
# Extracting information from a survdiff object
sd <- survdiff(Surv(time, status) ~ sex, data = lung)
1 - pchisq(sd$chisq, length(sd$n) - 1)+
ezfun::sdp(sd)
# The Cox regression model
coxph(Surv(time, status) ~ sex, data = lung)
# Formatting Cox regression results
broom::tidy(
coxph(Surv(time, status) ~ sex, data = lung),
exp = TRUE
) %>%
kable()
coxph(Surv(time, status) ~ sex, data = lung) %>%
gtsummary::tbl_regression(exp = TRUE)