No Nama NIM
1 Muhammad Dafiq Nur 16231036
2 Novi Dyah Ramadhani 16231042
3 Rivaldo Rumimpunu 16231053
4 Siti Nailya 16231054
5 Syifa Izzati Daryoto 16231056

Pendahuluan

Analisis survival merupakan metode statistik yang digunakan untuk mempelajari waktu hingga terjadinya suatu peristiwa penting, seperti kematian, kegagalan alat, atau munculnya suatu kondisi tertentu. Berbeda dengan analisis data biasa, analisis survival memiliki karakteristik khusus karena sering melibatkan data tersensor, yaitu kondisi ketika waktu kejadian tidak diketahui secara pasti. Dalam tugas ini, digunakan model Cox Proportional Hazards, salah satu metode paling populer dalam analisis survival karena mampu mengukur pengaruh variabel-variabel kovariat terhadap risiko terjadinya peristiwa tanpa harus menentukan bentuk distribusi waktu kegagalan. Melalui penerapan model ini pada dataset lung atau ovarian, tujuan tugas adalah untuk memahami faktor-faktor yang berkontribusi terhadap peningkatan atau penurunan risiko kejadian, serta mengevaluasi apakah asumsi-asumsi model Cox terpenuhi.

Eksplorasi & Deskriptif

Identifikasi Dataset

## Warning in data(ovarian): data set 'ovarian' not found
##   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

Dataset ini berisi informasi mengenai waktu ketahanan hidup dari pasien kanker ovarium yang mengikuti sebuah penelitian klinis. Tujuan utama penelitian untuk melihat bagaimana beberapa faktor klinis memengaruhi risiko terjadinya suatu peristiwa, yaitu kematian pasien.

Terdiri dari 26 observasi (pasien) dan 6 variabel , yaitu:

  1. futime, adalah waktu ketahanan hidup pasien bertahan sejak awal penelitian sampai event atau hingga data tersensor dalam satuan hari

  2. fustat, adalah status kejadian. Dimana 1 menyimbolkan pasien mengalami event (meninggal) dan 0 menyimbolkan data tersensor (pasien masih hidup ketika penelitian berakhir)

  3. age, adalah usia pasien saat masuk penelitian dalam satuan tahun

  4. resid.ds, adalah tingkat residual disease yaitu ukuran sisa tumor setelah operasi, semakin besar nilainya maka kondisi penyakit lebih parah

  5. rx, adalah jenis pengobatan/terapi yang diterima pasien (variabel treatment untuk membandingkan efektivitas terapi tertentu)

  6. ecog.ps, adalah skor ECOG Performance Status yaitu ukuran kondisi fisik pasien. Dimana nilai rendah sebagai pasien masih aktif dan nilai tinggi sebagai pasien semakin lemah aktivitas fisiknya terbatas

Statistika 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

Variabel futime berkisar dari 59 hingga 1.227 hari dengan median 476 hari menunjukkan setengah pasien mengalami kejadian atau sensor sebelum 1,3 tahun. fustat memiliki median 0, yang berarti sebagian besar observasi merupakan kejadian belum terjadi (data tersensor). age berada pada rentang 38,9 hingga 74,5 tahun dengan rata-rata sekitar 56 tahun. Status residu tumor (resid.ds) setelah operasi didominasi nilai 1–2 yang menunjukkan tingkat hasil operasi berbeda pada tiap pasien. Variabel perlakuan (rx) dan kondisi performa pasien (ecog.ps) juga dari 1 hingga 2.

Event dan Tersensor

table(ovarian$fustat)
## 
##  0  1 
## 14 12

Dari seluruh pasien terdapat 14 pasien yang tersensor (fustat = 0) dan 12 pasien yang mengalami event/meninggal (fustat = 1). Artinya, sedikit lebih banyak pasien yang masih hidup hingga akhir periode penelitian dibandingkan yang mengalami kejadian.

Analisis Kaplan-Meier

surv_obj <- Surv(time = ovarian$futime, event = ovarian$fustat)

km_fit <- survfit(surv_obj ~ 1)
km_fit
## Call: survfit(formula = surv_obj ~ 1)
## 
##       n events median 0.95LCL 0.95UCL
## [1,] 26     12    638     464      NA

Median survival time adalah 638 hari, yang berarti, 50% pasien mengalami kematian sebelum hari ke-638, dan, 50% sisanya masih hidup setelah hari ke-638.

dari interval kepercayaan 95% adalah 464 hari, yang berarti, 95% dapat dipercayai bahwa median survival minimal berada di angka ≥ 464 hari. Dengan kata lain, ketahanan hidup median pasien tidak mungkin lebih pendek dari 464 hari berdasarkan data.

Kurva

plot(km_fit,
     xlab = "Waktu (hari)",
     ylab = "Probabilitas Survival",
     main = "Kurva Kaplan-Meier",
     conf.int = TRUE,   
     col = "blue",
     lwd = 2)

abline(h = 0.5, lty = 2, col = "red")

Median survival ini adalah ukuran paling penting dalam survival analysis. Penurunan pertama terjadi sekitar hari ke ~100-150 dari nilai ~1.0 ke ~0.9.

Penurunan yang lebih tajam terjadi antara hari ke ~300-500, di mana probabilitas survival turun dari ~0.8 ke ~0.5.

Setelah hari ~500, kurva relatif lebih landai menuju ~0.4 di akhir (~hari ke ~1000+).

Uji Log-Rank

logrank_test <- survdiff(Surv(futime, fustat) ~ rx, data = ovarian)
logrank_test
## 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

cox_model <- coxph(Surv(futime, fustat) ~ age + resid.ds + rx + ecog.ps,
data = ovarian)

summary(cox_model)
## Call:
## coxph(formula = Surv(futime, fustat) ~ age + resid.ds + rx + 
##     ecog.ps, data = ovarian)
## 
##   n= 26, number of events= 12 
## 
##              coef exp(coef) se(coef)      z Pr(>|z|)   
## age       0.12481   1.13294  0.04689  2.662  0.00777 **
## resid.ds  0.82619   2.28459  0.78961  1.046  0.29541   
## rx       -0.91450   0.40072  0.65332 -1.400  0.16158   
## ecog.ps   0.33621   1.39964  0.64392  0.522  0.60158   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
##          exp(coef) exp(-coef) lower .95 upper .95
## age         1.1329     0.8827    1.0335     1.242
## resid.ds    2.2846     0.4377    0.4861    10.738
## rx          0.4007     2.4955    0.1114     1.442
## ecog.ps     1.3996     0.7145    0.3962     4.945
## 
## Concordance= 0.807  (se = 0.068 )
## Likelihood ratio test= 17.04  on 4 df,   p=0.002
## Wald test            = 14.25  on 4 df,   p=0.007
## Score (logrank) test = 20.81  on 4 df,   p=3e-04

Estimasi Model

cox_model <- coxph(Surv(futime, fustat) ~ age + resid.ds + rx + ecog.ps,
                   data = ovarian)

summary(cox_model)
## Call:
## coxph(formula = Surv(futime, fustat) ~ age + resid.ds + rx + 
##     ecog.ps, data = ovarian)
## 
##   n= 26, number of events= 12 
## 
##              coef exp(coef) se(coef)      z Pr(>|z|)   
## age       0.12481   1.13294  0.04689  2.662  0.00777 **
## resid.ds  0.82619   2.28459  0.78961  1.046  0.29541   
## rx       -0.91450   0.40072  0.65332 -1.400  0.16158   
## ecog.ps   0.33621   1.39964  0.64392  0.522  0.60158   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
##          exp(coef) exp(-coef) lower .95 upper .95
## age         1.1329     0.8827    1.0335     1.242
## resid.ds    2.2846     0.4377    0.4861    10.738
## rx          0.4007     2.4955    0.1114     1.442
## ecog.ps     1.3996     0.7145    0.3962     4.945
## 
## Concordance= 0.807  (se = 0.068 )
## Likelihood ratio test= 17.04  on 4 df,   p=0.002
## Wald test            = 14.25  on 4 df,   p=0.007
## Score (logrank) test = 20.81  on 4 df,   p=3e-04

Hasil estimasi model Cox Proportional Hazards memberikan informasi mengenai pengaruh setiap variabel terhadap risiko kematian pasien.

Koefisien model menunjukkan arah hubungan, sedangkan nilai exp(coef) mengindikasikan seberapa besar perubahan risiko yang ditimbulkan oleh masing-masing kovariat. Variabel age, resid.ds, rx, dan ecog.ps diuji secara simultan untuk mengetahui apakah faktor usia, sisa tumor setelah operasi, jenis terapi, serta kondisi fisik pasien berperan dalam meningkatkan atau menurunkan risiko kejadian.

Nilai p-value yang ditampilkan membantu menentukan apakah pengaruh masing-masing variabel signifikan secara statistik dalam memprediksi waktu ketahanan hidup.

Hazard Ratio

hr <- exp(coef(cox_model))
ci <- exp(confint(cox_model))

hr
##      age resid.ds       rx  ecog.ps 
## 1.132937 2.284590 0.400717 1.399635
ci
##              2.5 %    97.5 %
## age      1.0334572  1.241992
## resid.ds 0.4860602 10.738073
## rx       0.1113613  1.441919
## ecog.ps  0.3961928  4.944509

Hazard Ratio (HR) mengukur seberapa besar perubahan risiko kematian yang terkait dengan setiap kovariat dalam model. Nilai HR > 1 menunjukkan bahwa variabel tersebut meningkatkan risiko kematian, sedangkan HR < 1 berarti variabel tersebut menurunkan risiko.

Interval kepercayaan 95% yang dihasilkan menjelaskan rentang nilai HR yang paling mungkin, sehingga membantu menilai kestabilan pengaruh variabel.

Melalui HR dan interval kepercayaannya, dapat diketahui apakah variabel seperti usia, ukuran sisa tumor, jenis terapi, atau kondisi fisik pasien memberikan dampak nyata terhadap probabilitas bertahan hidup.

Uji Asumsi Proportional Hazards (Schoenfeld Test)

# Uji asumsi proportional hazards

ph_test <- cox.zph(cox_model)
ph_test
##          chisq df     p
## age      0.170  1 0.680
## resid.ds 1.155  1 0.282
## rx       0.595  1 0.440
## ecog.ps  2.928  1 0.087
## GLOBAL   4.455  4 0.348
# Plot Schoenfeld residual

plot(ph_test,
var = 1:4,
main = "Plot Schoenfeld Residual – Uji Proportional Hazards")

Hasil dari Uji Schoenfeld Residuals menunjukkan bahwa asumsi Proportional Hazards (PH) untuk model regresi Cox telah terpenuhi secara kuat. Secara statistik, nilai p untuk setiap variabel prediktor (age, resid.ds, rx, dan ecog.ps) dan untuk model secara keseluruhan (uji GLOBAL) semuanya lebih besar dari 0.05 (pGLOBAL = 0.348$). Hal ini mengindikasikan bahwa tidak ada bukti signifikan untuk menolak hipotesis nol, yang menyatakan bahwa koefisien regresi adalah konstan seiring waktu. Kesimpulan ini diperkuat oleh pemeriksaan visual dari plot Schoenfeld Residuals, di mana garis halus yang mewakili tren koefisien seiring waktu menunjukkan perilaku mendekati nol dan tetap berada di dalam batas interval kepercayaan 95% sepanjang periode pengamatan, menunjukkan stabilitas efek prediktor terhadap risiko bahaya. Oleh karena itu, koefisien model Cox dapat diinterpretasikan sebagai ukuran efek yang valid dan konstan sepanjang waktu.

Pemeriksaan Residual (Martingale & Deviance)

martingale_res <- residuals(cox_model, type = "martingale")

par(mfrow = c(1, 2))

plot(ovarian$age, martingale_res,
main = "Martingale Residual vs Age",
xlab = "Age",
ylab = "Martingale Residual",
pch = 19, col = "darkblue")

plot(ovarian$resid.ds, martingale_res,
main = "Martingale Residual vs Residual Disease",
xlab = "resid.ds",
ylab = "Martingale Residual",
pch = 19, col = "darkred")

dev_res <- residuals(cox_model, type = "deviance")

plot(dev_res,
main = "Deviance Residual",
ylab = "Deviance Residual",
pch = 19, col = "purple")
abline(h = 0, lty = 2)

Secara keseluruhan, pemeriksaan residual model Cox menunjukkan bahwa model sudah pas dan bentuk hubungannya sudah benar. Plot Martingale Residuals (terhadap Age dan resid.ds) meyakinkan karena titik-titik tersebar acak di sekitar garis nol, artinya model sudah berhasil menangkap hubungan prediktor dengan risiko bahaya (hazard). Kita tidak perlu mengubah variabel ini ke bentuk non-linear. Namun, plot Deviance Residuals menemukan beberapa data yang aneh atau ekstrem (outliers), ditandai oleh nilai yang melewati batas \(\pm 2\) (sekitar Indeks 10 dan 22-23). Meskipun ada pencilan ini—yang berarti prediksi model meleset untuk pasien tertentu—fakta bahwa sebagian besar titik residual berkumpul di dekat nol menunjukkan bahwa kemampuan prediksi model Anda masih memuaskan untuk sebagian besar data.

Kurva Survival Terprediksi

# Survival prediksi untuk tiap kategori rx

newdata_rx <- data.frame(
age = mean(ovarian$age),
resid.ds = mean(ovarian$resid.ds),
ecog.ps = mean(ovarian$ecog.ps),
rx = c(1, 2)
)

cox_fit_rx <- survfit(cox_model, newdata = newdata_rx)

plot(cox_fit_rx,
col = c("blue", "red"),
lwd = 2,
xlab = "Waktu (hari)",
ylab = "Probabilitas Survival",
main = "Kurva Survival Terprediksi Berdasarkan Jenis Terapi (rx)")

legend("bottomleft",
legend = c("rx = 1", "rx = 2"),
col = c("blue", "red"),
lwd = 2)

Kurva ini membandingkan seberapa besar kemungkinan pasien bisa bertahan hidup antara dua kelompok terapi, yaitu \(\text{rx}=1\) (garis biru) dan \(\text{rx}=2\) (garis merah), selama lebih dari seribu hari. Terlihat jelas bahwa pasien yang menerima terapi \(\text{rx}=2\) memiliki tingkat harapan hidup yang jauh lebih baik daripada pasien \(\text{rx}=1\). Sebagai contoh, setelah sekitar 600 hari, kelompok \(\text{rx}=2\) masih memiliki peluang bertahan hidup di atas 60%, sementara peluang untuk kelompok \(\text{rx}=1\) sudah turun drastis hingga di bawah 40%. Kesimpulannya, terapi \(\text{rx}=2\) tampak lebih efektif dan sangat disarankan karena berhubungan dengan risiko kematian yang lebih rendah dan masa hidup yang lebih panjang.

Kesimpulan

Analisis terhadap data survival pasien kanker ovarium (total 26 observasi, 12 kejadian kematian) menggunakan model Regresi Cox Proportional Hazards telah berhasil mengidentifikasi faktor-faktor yang memengaruhi waktu ketahanan hidup pasien.

  1. Kualitas dan Validitas Model Model Cox yang dibentuk menunjukkan kualitas yang tinggi dan validitas yang teruji.
  1. Faktor Risiko Signifikan (Hazard Ratio) Dari empat variabel kovariat yang diuji secara simultan, hanya satu faktor yang ditemukan signifikan secara statistik memengaruhi risiko kematian pasien:
  1. Implikasi Klinis Terapi (rx) Walaupun variabel terapi (rx) secara statistik tidak signifikan (\(p=0.16158\)), perbandingan Kurva Survival Terprediksi memberikan implikasi klinis yang kuat:

Rubrik Penilaian (100 poin)

Komponen Deskripsi Penilaian Sesuai Isi Laporan Poin
Eksplorasi & Deskriptif Identifikasi dataset ovarian, statistik deskriptif, tabel event/sensoring 20
Analisis Kaplan–Meier Estimasi KM, interpretasi median survival, kurva KM, dan uji Log-Rank 20
Model Cox Proportional Hazards Pemodelan Cox (age, resid.ds, rx, ecog.ps), interpretasi koefisien & HR, CI 25
Uji Asumsi PH (Schoenfeld) Uji cox.zph, grafik residual Schoenfeld, interpretasi asumsi terpenuhi 15
Residual Model Martingale residual, deviance residual, identifikasi outlier & interpretasi 10
Kurva Survival Terprediksi Prediksi survival berdasarkan rx & visualisasi 5
Laporan & Reproducibility Struktur laporan rapi, bahasa ilmiah, kode dapat dijalankan tanpa error 5
Total 100