knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE)
library(survival)
## Warning: package 'survival' was built under R version 4.4.3
library(survminer)
## Warning: package 'survminer' was built under R version 4.4.3
## Loading required package: ggplot2
## Loading required package: ggpubr
##
## Attaching package: 'survminer'
## The following object is masked from 'package:survival':
##
## myeloma
🧩 Pendahuluan
Analisis survival merupakan metode statistik yang digunakan untuk mempelajari waktu hingga terjadinya suatu kejadian, misalnya kekambuhan penyakit, kematian, atau kegagalan suatu sistem. Salah satu metode yang paling banyak digunakan adalah Cox Proportional Hazards (Cox PH) karena fleksibel dan tidak mengasumsikan bentuk distribusi khusus pada waktu survival.
Dalam tugas ini, analisis survival diterapkan pada dataset ovarian untuk memahami faktor-faktor yang memengaruhi risiko terjadinya kejadian (event). Analisis meliputi eksplorasi data, kurva Kaplan–Meier, uji log-rank, pemodelan Cox PH, serta uji asumsi proportional hazards.
📊 Eksplorasi & Deskriptif
data(ovarian)
head(ovarian)
## futime fustat age resid.ds rx ecog.ps
## 1 59 1 72.3315 2 1 1
## 2 115 1 74.4932 2 1 1
## 3 156 1 66.4658 2 1 2
## 4 421 0 53.3644 2 2 1
## 5 431 1 50.3397 2 1 1
## 6 448 0 56.4301 1 1 2
summary(ovarian)
## futime fustat age resid.ds
## Min. : 59.0 Min. :0.0000 Min. :38.89 Min. :1.000
## 1st Qu.: 368.0 1st Qu.:0.0000 1st Qu.:50.17 1st Qu.:1.000
## Median : 476.0 Median :0.0000 Median :56.85 Median :2.000
## Mean : 599.5 Mean :0.4615 Mean :56.17 Mean :1.577
## 3rd Qu.: 794.8 3rd Qu.:1.0000 3rd Qu.:62.38 3rd Qu.:2.000
## Max. :1227.0 Max. :1.0000 Max. :74.50 Max. :2.000
## rx ecog.ps
## Min. :1.0 Min. :1.000
## 1st Qu.:1.0 1st Qu.:1.000
## Median :1.5 Median :1.000
## Mean :1.5 Mean :1.462
## 3rd Qu.:2.0 3rd Qu.:2.000
## Max. :2.0 Max. :2.000
Distribusi Status (0 = censored, 1 = event)
table(ovarian$fustat)
##
## 0 1
## 14 12
Struktur Data
str(ovarian)
## 'data.frame': 26 obs. of 6 variables:
## $ futime : num 59 115 156 421 431 448 464 475 477 563 ...
## $ fustat : num 1 1 1 0 1 0 1 1 0 1 ...
## $ age : num 72.3 74.5 66.5 53.4 50.3 ...
## $ resid.ds: num 2 2 2 2 2 1 2 2 2 1 ...
## $ rx : num 1 1 1 2 1 1 2 2 1 2 ...
## $ ecog.ps : num 1 1 2 1 1 2 2 2 1 2 ...
📈 Analisis Kaplan–Meier 3. Kurva Kaplan–Meier berdasarkan Kelompok Treatment
Pada dataset ovarian, variabel rx = jenis treatment (1 atau 2)
km_fit <- survfit(Surv(futime, fustat) ~ rx, data = ovarian)
ggsurvplot(
km_fit, data = ovarian,
pval = TRUE,
risk.table = TRUE,
surv.median.line = "hv",
title = "Kurva Kaplan–Meier berdasarkan Treatment",
legend.title = "Treatment",
legend.labs = c("RX 1", "RX 2")
)
survdiff(Surv(futime, fustat) ~ rx, data = ovarian)
## Call:
## survdiff(formula = Surv(futime, fustat) ~ rx, data = ovarian)
##
## N Observed Expected (O-E)^2/E (O-E)^2/V
## rx=1 13 7 5.23 0.596 1.06
## rx=2 13 5 6.77 0.461 1.06
##
## Chisq= 1.1 on 1 degrees of freedom, p= 0.3
âš™ Pemodelan Cox Proportional Hazards 5. Estimasi Model Cox PH
Kita gunakan variabel prediktor: age, rx, resid.ds
fit <- coxph(Surv(futime, fustat) ~ age + rx + resid.ds, data = ovarian)
summary(fit)
## Call:
## coxph(formula = Surv(futime, fustat) ~ age + rx + resid.ds, data = ovarian)
##
## n= 26, number of events= 12
##
## coef exp(coef) se(coef) z Pr(>|z|)
## age 0.1285 1.1372 0.0473 2.718 0.00657 **
## rx -0.8489 0.4279 0.6392 -1.328 0.18416
## resid.ds 0.6964 2.0065 0.7585 0.918 0.35858
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## age 1.1372 0.8794 1.0365 1.248
## rx 0.4279 2.3371 0.1222 1.498
## resid.ds 2.0065 0.4984 0.4537 8.874
##
## Concordance= 0.812 (se = 0.066 )
## Likelihood ratio test= 16.77 on 3 df, p=8e-04
## Wald test = 14.63 on 3 df, p=0.002
## Score (logrank) test = 20.76 on 3 df, p=1e-04
🧪 Uji Asumsi Proportional Hazards 6. Uji PH Test
ph_test <- cox.zph(fit)
ph_test
## chisq df p
## age 0.210 1 0.65
## rx 0.631 1 0.43
## resid.ds 1.120 1 0.29
## GLOBAL 1.958 3 0.58
Plot Schoenfeld Residuals
ggcoxzph(ph_test)
🎯 Kurva Survival Terprediksi (Adjusted Survival Curve) 7. Prediksi Survival berdasarkan Treatment
ggadjustedcurves(
fit,
data = ovarian,
variable = "rx",
legend.title = "Treatment",
title = "Adjusted Survival Curves by Treatment"
)
🧾 Kesimpulan
Pada bagian ini kamu dapat menuliskan:
Ringkasan pola survival dari Kaplan–Meier
Hasil uji log-rank (apakah survival berbeda antar grup)
Interpretasi Hazard Ratio model Cox
Hasil uji asumsi proportional hazards
Kesimpulan akhir dari dataset ovarian