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

  1. Memanggil Dataset Ovarian
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
  1. Statistik Deskriptif
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")
)

  1. Uji Log-Rank
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