Survival Analysis
생존분석(Survival Analysis)은 시간에 따른 사건(event) 발생을 다루는 통계적 분석 방법입니다.
기본적으로 생존분석은 다음과 같은 개념을 사용합니다.
- 생존시간(survival time) : 어떤 사건이 발생하기까지 걸리는 시간
- 생존함수(survival function) : 어떤 시점까지 생존할 확률을 나타내는 함수
- 위험함수(hazard function) : 어떤 시점에서 사건이 발생할 위험성을 나타내는 함수
생존분석에서는 위의 개념을 사용하여 시간에 따라 생존함수와 위험함수를 추정합니다. 이를 통해 어떤 사건이 발생하기까지 걸리는 시간과 그 시간에 따른 생존확률을 예측할 수 있습니다.
생존분석에는 여러 가지 방법이 있지만, 가장 대표적인 방법은 코크스-매키스(Cox-Meier) 생존분석입니다. 이 방법은 다음과 같은 절차를 따릅니다.
- 데이터 수집 : 연구 대상이 되는 그룹의 데이터를 수집합니다.
- 데이터 전처리 : 수집한 데이터를 정리하고 필요한 변수를 선택합니다.
- 생존함수 추정 : 적합한 생존모형을 선택하여 생존함수와 위험함수를 추정합니다.
- 생존분석 결과 해석 : 추정된 생존함수와 위험함수를 시각화하고, 예측된 생존시간 등을 분석합니다.
생존분석은 데이터의 특성에 따라 다양한 모델을 사용할 수 있습니다.
일반적으로는 코크스-매키스 생존분석 외에도 침입(입원)한 경우를 대상으로 하는 Kaplan-Meier 생존분석 등이 사용됩니다.
이들 생존분석 방법은 시간에 따른 사건 발생률, 생존확률 등을 예측하는 데 유용합니다.
library(survival) # 생존분석 패키지
survfit 함수는 생존분석에서 Kaplan-Meier 생존곡선을 추정하는 함수입니다.
이 함수는 생존시간 데이터와 이벤트 발생 여부 데이터를 이용해 생존곡선을 추정하고, 추정된 생존곡선을 시각화할 수 있습니다.
survfit 함수를 사용하기 위해서는 먼저 생존시간과 이벤트 발생 여부 데이터를 Surv 함수를 이용해 생성해야 합니다.
Surv 함수는 생존분석에서 사용되는 시간과 상태(이벤트 발생 여부) 데이터를 담은 객체를 생성합니다. Surv 함수는 다음과 같은 형태로 사용됩니다.
Surv(time, event)
여기서 formula는 Surv 객체를 포함한 모형을 지정하는데 사용되는 공식을 나타내며, data는 데이터 프레임을 나타냅니다.
예를 들어, lung 데이터셋에서 생존시간과 이벤트 발생 여부 데이터를 추출하고, 이를 Surv 함수에 입력하여 생존곡선을 추정하려면 다음과 같이 작성할 수 있습니다.
예시 및 사용법
library(survival) # 생존분석 패키지 불러오기
data(lung) # R 내장 데이터셋인 lung 데이터 불러오기
<- Surv(time = lung$time, event = lung$status) # 생존시간과 이벤트 발생 여부 데이터 추출
surv_obj
<- survfit(surv_obj ~ 1) # Kaplan-Meier 생존곡선 추정 survfit_obj
<- survfit(surv_obj ~ 1) # Kaplan-Meier 생존곡선 추정
survfit_obj
summary(survfit_obj)
- Call: 사용한 함수 및 입력 정보를 보여줍니다.
- time n: 생존시간 데이터의 총 관측 수를 보여줍니다.
- events n: 이벤트 발생 여부 데이터 중 이벤트가 발생한 수를 보여줍니다.
- median: 생존곡선에서의 중위 생존시간을 보여줍니다.
- 0.95LCL, 0.95UCL: 생존곡선의 95% 신뢰구간을 보여줍니다.
- Call: 생존곡선 상태표를 출력합니다. 상태표는 생존시간의 범위와 이벤트 발생 여부에 따라 생존곡선의 상태를 표시합니다.
- n events: 이벤트 발생 여부 데이터 중 이벤트가 발생한 수를 보여줍니다.
- log-rank: 로그 랭크 검정에 대한 결과를 보여줍니다. 로그 랭크 검정은 생존곡선 간 차이의 유의성을 검정하는 검정 방법 중 하나입니다.
library(survminer) # 생존분석 결과 시각화 패키지
survminer 패키지는 생존 분석 결과를 시각화하기 위한 패키지로, 생존 함수, 생존 곡선, 누적 발생율 함수 등을 그래프로 그릴 수 있습니다. 이 패키지는 ggplot2 패키지를 기반으로 하여 만들어졌으며, ggplot2의 그래프 작성 방법과 유사합니다.
survminer 패키지에서 제공하는 함수와 예시를 설명하겠습니다.
- ggsurvplot 함수 ggsurvplot 함수는 생존 곡선을 그리기 위한 함수입니다. 예를 들어, 다음과 같이 생존 분석 결과를 이용하여 생존 곡선을 그릴 수 있습니다.
library(survival)
library(survminer)
data(lung)
<- survfit(Surv(time, status) ~ sex, data = lung)
fit
ggsurvplot(fit, data = lung, risk.table = TRUE)
위 코드에서는 lung 데이터셋에서 time과 status 변수를 이용하여 생존 분석을 수행한 뒤, 성별에 따른 생존 곡선을 그리도록 하였습니다. ggsurvplot 함수의 risk.table 인자를 TRUE로 설정하면, 위 그래프와 함께 위험표(risk table)도 함께 출력됩니다.
- ggcoxzph 함수 ggcoxzph 함수는 Cox 비례위험 모형 가정을 검정하기 위한 그래프를 그리기 위한 함수입니다. 예를 들어, 다음과 같이 Cox 비례위험 모형 가정을 검정하기 위한 그래프를 그릴 수 있습니다.
library(survival)
library(survminer)
data(lung)
<- coxph(Surv(time, status) ~ age + sex, data = lung)
fit
ggcoxzph(fit, linear.predictions = TRUE)
위 코드에서는 lung 데이터셋에서 age와 sex 변수를 이용하여 Cox 비례위험 모형을 적합한 뒤, 모형 가정을 검정하기 위한 그래프를 그리도록 하였습니다. ggcoxzph 함수의 linear.predictions 인자를 TRUE로 설정하면, 선형 예측값과 함께 그래프가 출력됩니다.
- ggforest 함수 ggforest 함수는 Cox 모형에서 변수의 효과를 비교하기 위한 그래프를 그리기 위한 함수입니다. 예를 들어, 다음과 같이 Cox 모형에서 변수의 효과를 비교하는 그래프를 그릴 수 있습니다.
library(survival)
library(survminer)
data(lung)
<- coxph(Surv(time, status) ~ age + sex + ph.ecog, data = lung)
fit
ggforest(fit, data = lung)
- ggcoxdiagnostics 함수 ggcoxdiagnostics 함수는 Cox 모형의 가정을 검정하기 위한 그래프를 그리기 위한 함수입니다. 예를 들어, 다음과 같이 Cox 모형의 가정을 검정하는 그래프를 그릴 수 있습니다.
library(survival)
library(survminer)
data(lung)
<- coxph(Surv(time, status) ~ age + sex + ph.ecog, data = lung)
fit
ggcoxdiagnostics(fit, type = "deviance")
위 코드에서는 lung 데이터셋에서 age, sex, ph.ecog 변수를 이용하여 Cox 모형을 적합한 뒤, 모형 가정을 검정하는 그래프를 그리도록 하였습니다. ggcoxdiagnostics 함수의 type 인자를 “deviance”로 설정하면, 잔차 그래프와 로그(-로그) 생존 함수 그래프가 출력됩니다.
- ggdag 함수 ggdag 함수는 DAG(Directed Acyclic Graph)를 그리기 위한 함수입니다. 예를 들어, 다음과 같이 DAG를 그릴 수 있습니다.
library(survminer)
ggdag(igraph::make_empty_graph(3) +
::make_edges(c(1,2,2,3))
igraph )
위 코드에서는 igraph 패키지를 이용하여 빈 그래프를 만든 뒤, 간선을 추가하여 DAG를 그리도록 하였습니다. ggdag 함수는 igraph 객체를 입력으로 받으며, 그래프를 그릴 때는 ggplot2의 기능을 이용합니다.