Emails \(\hspace{0.6cm}:\) 1.
\(\hspace{1.9cm}\) 2.
Instagram \(\hspace{0.03cm}:\) https://www.instagram.com/j.hodawya/
Linked In \(\hspace{0.2cm}:\) https://www.linkedin.com/in/juenzy-hodawya-a310ab1a3/
RPubs \(\hspace{0.67cm}:\) https://rpubs.com/JHodawya
Kaggle \(\hspace{0.6cm}:\) https://www.kaggle.com/juenzyhodawya
GitHub \(\hspace{0.52cm}:\) https://github.com/JuenzyHodawya


1 Apa yang Telah Kita Pelajari Sebelumnya?

  • Dasar-dasar analisis survival termasuk fungsi survival Kaplan-Meier dan regresi Cox.
  • Analisis penanda (landmark) dan kovariat yang bergantung pada waktu.
  • Kejadian kumulatif dan regresi untuk analisis risiko yang bersaing.

2 Apa yang Belum Kita Pelajari?

Beberapa hal kecil yang mungkin dapat terjadi dan berguna untuk diketahui:

  • Menilai asumsi hazard proporsional.
  • Membuat plot survival yang mulus berdasarkan kelangsungan hidup \(x\)-tahun menurut kovariat berkelanjutan.
  • Kelangsungan hidup bersyarat.

3 Menilai Hazard Proporsional

Salah satu asumsi dari model regresi hazard proporsional Cox adalah bahwa hazard proporsional pada setiap titik waktu selama masa follow-up. Bagaimana kita dapat memeriksa apakah data kita memenuhi asumsi ini?

Gunakan fungsi cox.zph dari package survival. Ini menghasilkan dua hal utama:

  • Uji hipotesis tentang apakah pengaruh setiap kovariat berbeda menurut waktu, dan uji global semua kovariat sekaligus.
    • Ini dilakukan dengan menguji efek interaksi antara kovariat dan log (waktu).
    • Nilai p yang signifikan menunjukkan bahwa asumsi hazard proporsional dilanggar.
  • Plot residu Schoenfeld.
    • Penyimpangan dari garis kemiringan nol merupakan bukti bahwa asumsi hazard proporsional dilanggar.
library(survival)
mv_fit <- coxph(Surv(time, status) ~ sex + age, data = lung)
cz <- cox.zph(mv_fit)
print(cz)
##        chisq df    p
## sex    2.608  1 0.11
## age    0.209  1 0.65
## GLOBAL 2.771  2 0.25
plot(cz)

3.1 Plot Survival yang Halus (Smooth)

Terkadang Anda ingin memvisualisasikan perkiraan survival menurut variabel kontinu. Fungsi sm.survival dari package sm memungkinkan Anda melakukan ini untuk sebuah kuantil distribusi data survival. Kuantil default adalah p = 0.5 untuk median survival.

library(sm)

sm.options(
  list(
    xlab = "Age (years)",
    ylab = "Time to death (years)")
  )

sm.survival(
  x = lung$age,
  y = lung$time,
  status = lung$status,
  h = sd(lung$age) / nrow(lung)^(-1/4)
  )

  • Tanda x mewakili peristiwa
  • Huruf o mewakili sensor
  • Garis adalah perkiraan rata-rata survival menurut usia
    • Dalam hal ini, garisnya terlihat sangat halus!

Opsi h adalah parameter penghalusan. Ini harus terkait dengan deviasi standar kovariat kontinu, \(x\). Disarankan untuk memulai dengan \(\frac{sd(x)}{n^{-1/4}}\) lalu kurangi dengan 1/2, 1/4, dll untuk mendapatkan jumlah penghalusan yang baik. Plot sebelumnya terlalu halus jadi mari kita kurangi 1/4.

sm.survival(
  x = lung$age,
  y = lung$time,
  status = lung$status,
  h = (1/4) * sd(lung$age) / nrow(lung)^(-1/4)
  )

3.2 Survival Bersyarat

Kadang-kadang menarik untuk menghasilkan perkiraan kelangsungan hidup di antara sekelompok pasien yang telah bertahan selama beberapa waktu.

\[S(y|x)=\frac{S(x+y)}{S(x)}\]

  • y: jumlah tahun kelangsungan hidup tambahan yang diinginkan
  • x: jumlah tahun pasien telah bertahan hidup

Referensi: Zabor, E., Gonen, M., Chapman, P., & Panageas, K. (2013). Dynamic prognostication using conditional survival estimates. Cancer, 119(20), 3589-3592.

3.3 Perkiraan Survival Bersyarat

Perkiraan mudah dibuat dengan matematika dasar Anda sendiri.

Sebagai alternatif, saya memiliki package sederhana dalam pengembangan yang disebut condsurv untuk menghasilkan perkiraan dan plot yang terkait dengan kelangsungan hidup bersyarat. Kita dapat menggunakan fungsi conditional_surv_est untuk mendapatkan taksiran dan 95% interval keyakinan. Mari kita kondisikan kelangsungan hidup sampai 6 bulan.

# remotes::install_github("zabore/condsurv")
library(condsurv)
library(tidyverse)
library(kableExtra)

fit1 <- survfit(Surv(time, status) ~ 1, data = lung)

prob_times <- seq(365.25, 182.625 * 5, 182.625)

purrr::map_df(
  prob_times, 
  ~conditional_surv_est(
    basekm = fit1, 
    t1 = 182.625, 
    t2 = .x) 
  ) %>% 
  mutate(months = round(prob_times / 30.4)) %>% 
  select(months, everything()) %>% 
  kable()
months cs_est cs_lci cs_uci
12 0.58 0.49 0.66
18 0.36 0.27 0.45
24 0.16 0.10 0.25
30 0.07 0.02 0.15

Ingatlah bahwa perkiraan kelangsungan hidup 1 tahun awal kita adalah 0.41. Kita melihat bahwa untuk pasien yang sudah bertahan hidup 6 bulan, angka ini meningkat menjadi 0.58.

3.4 Plot Bertahan Hidup Bersyarat

Kita juga dapat memvisualisasikan data kelangsungan hidup bersyarat berdasarkan lama waktu bertahan yang berbeda. Fungsi condsurv::condKMggplot bisa membantu dengan ini.

cond_times <- seq(0, 182.625 * 4, 182.625)

gg_conditional_surv(
  basekm = fit1, 
  at = cond_times,
  main = "Conditional survival in lung data",
  xlab = "Days"
  ) +
  labs(color = "Conditional time")

Plot yang dihasilkan memiliki satu kurva kelangsungan hidup untuk setiap waktu yang kita kondisikan. Dalam hal ini, baris pertama adalah kurva survival secara keseluruhan karena dikondisikan pada waktu 0.

library(knitr)
knit_exit()