Email: imeldasianturi85@gmail.com
RPubs: hhttps://rpubs.com/imelda123
Analisis Survival adalah suatu studi tentang metode untuk menganalisis data, dimana variabel responnya adalah waktu sampai terjadinya suatu peristiwa tertentu. Dapat disebut juga sebagai data waktu ke peristiwa yang terdiri dari waktu mulai dan waktu akhir yang berbeda.
Analisis Survival secara umum banyak digunakan di bidang kesehatan, namun sekarang metode ini sudah banyak diaplikasikan di beberapa bidang, contohnya:
Dalam Studi Kanker, pertanyaan yang biasanya di tanyakan adalah sebagai berikut:
Metode analisis data waktu ke peristiwa tertentu, banyak dimanfaatkan di berbagai bidang, tidak terkecuali dalam bidang:
Karena Analisis Survival banyak digunakan diberbagai bidang, maka namanya pun berbeda ditiap bidangnya, seperti:
Tujuan dari pembelajaran ini adalah untuk mendeskripsikan konsep dasar dari analisis survival. Dalam studi kanker, kebanyakan metode analisis survival yang digunakan adalah:
Saya akan menjelaskan konsep penting dari analisis survival, termasuk:
Kemudian, saya akan melanjutkan dengan mendeskripsikan analisis multivariat menggunakan model proporsional hazard Cox.
Dengan \(i\) sebagai subjek:
Waktu Peristiwa Terjadi \(T_i\)
Waktu Sensoring \(C_i\)
Indikator Peristiwa \(\delta_i\):
Waktu Observasi \(Y_i = \min(T_i, C_i)\)
Contohnya:
Dalam data lung, sepanjang waktu yang diamati dan indikator peristiwa disediakan.
Dataset lung tersedia dalam package survival dalam R. Data ini berisi subjek dengan kondisi stadium lanjut dari North Central Cancer Treatment Group. Beberapa variabel yang akan saya gunakan dalam mendemostrasikan metode ini adalah:
## inst time status age sex ph.ecog ph.karno pat.karno meal.cal wt.loss
## 1 3 306 2 74 1 1 90 100 1175 NA
## 2 3 455 2 68 1 0 90 90 1225 15
## 3 3 1010 1 56 1 0 90 90 NA 15
## 4 5 210 2 57 1 1 90 60 1150 11
## 5 1 883 2 60 1 0 100 90 NA 0
## 6 12 1022 1 74 1 1 50 80 513 0
Referensi : RICH JT, NEELY JG, PANIELLO RC, VOELKER CCJ, NUSSENBAUM B, WANG EW. A PRACTICAL GUIDE TO UNDERSTANDING KAPLAN-MEIER CURVES. Otolaryngology head and neck surgery: official journal of American Academy of Otolaryngology Head and Neck Surgery. 2010;143(3):331-336. doi:10.1016/j.otohns.2010.05.007.
Suatu subjek dapat disensor dikarenakan:
Secara khusus, hal diatas ini adalah contoh dari sensoring di bagian kanan.
Sensoring bagian kiri dan sensoring interval juga dapat terjadi. Jenis data yang memiliki sensoring bagian kiri dan sensoring interval juga ada metode untuk menganalisisnya. Namun, analisis nya akan dibatasi pada sensoring kanan.
Dalam contoh diatas, bagaimana kita akan menghitung proporsi bebas dari peristiwa dalam 10 tahun?
Subjek 6 dan 7 bebas dari peristiwa dalam 10 tahun, yang artinya subjek 6 dan 7 tidak meninggal ataupun tidak sembuh dalam penelitian yang berjangka 10 tahun.
Subjek 2,9, dan 10 memiliki peristiwa dalam 10 tahun, yang artinya subjek 2,9 dan 10 meninggal/sembuh dalam penelitian yang berjangka 10 tahun.
Subjek 1,3,4,5, dan 8 sensoring sebelum 10 tahun, artinya adalah kita tidak tahu apakah mereka meninggal atau tetap hidup dalam penelitian berjangka 10 tahun itu. Lalu yang menjadi pertanyaan adalah bagaimana kita bisa memasukkan subjek ini ke dalam perkiraan kita?
Data yang kita miliki sering sekali dalam kondisi tanggal mulai - tanggal akhir, daripada perhitungan waktu survive nya. Langkah pertama untuk kita adalah memastikan formatnya berbentuk format tanggal dalam R.
Berikut ini adalah contoh dari dataset kecil dengan variabel sx_date sebagai tanggal operasi dan last_fup_date sebagai tanggal tidak lanjut.
library(tibble)
date_ex <- tibble(
sx_date = c("2007-06-22", "2004-02-13", "2010-10-27"),
last_fup_date = c("2017-04-15", "2018-07-04", "2016-10-31")
)
date_ex## # A tibble: 3 x 2
## sx_date last_fup_date
## <chr> <chr>
## 1 2007-06-22 2017-04-15
## 2 2004-02-13 2018-07-04
## 3 2010-10-27 2016-10-31
Kita bisa melihat bahwa kedua variabel ini jenisnya adalah karakter, kejadian ini sering kali terjadi. Kita butuh untuk membuat formatnya menjadi format tanggal. Cara untuk mengubahnya adalah sebagai berikut:
library(dplyr)
date_ex %>%
mutate(
sx_date = as.Date(sx_date, format = "%Y-%m-%d"),
last_fup_date = as.Date(last_fup_date, format = "%Y-%m-%d")
)## # A tibble: 3 x 2
## sx_date last_fup_date
## <date> <date>
## 1 2007-06-22 2017-04-15
## 2 2004-02-13 2018-07-04
## 3 2010-10-27 2016-10-31
Catat! Dalam R format harus menyertakan pemisah serta simbol. Contohnya, jika tanggal anda dalam format m/d/Y maka anda memerlukan format = "% m /% d /% Y"
Klik link ini untuk melihat daftar lengkap format simbol tanggal https://www.statmethods.net/input/dates.html
Kita juga bisa menggunakan package lubridate untuk format tanggal. Kasus dibawah ini, menggunakan fungsi ymd
## # A tibble: 3 x 2
## sx_date last_fup_date
## <date> <date>
## 1 2007-06-22 2017-04-15
## 2 2004-02-13 2018-07-04
## 3 2010-10-27 2016-10-31
Catat! Tidak seperti opsi dasar R, pemisah tidak perlu ditentukan
Halaman bantuan untuk ?Dmy akan menampilkan semua opsi format
Setelah membuat format tanggal, kita perlu untuk menghitung perbedaan antara waktu mulai dan waktu berakhir dalam beberapa unit, biasanya dalam bulan atau tahun.
Dalam R, gunakan difftime untuk menghitung jumlah hari antara dua tanggal, dan mengubahnya menjadi nilai numerik menggunakan as.numeric. Kemudian ubah ke tahun dengan membaginya dengan 365,25 (jumlah rata-rata hari dalam setahun).
date_ex %>%
mutate(
os_yrs =
as.numeric(
difftime(last_fup_date,
sx_date,
units = "days")) / 365.25
)## # A tibble: 3 x 3
## sx_date last_fup_date os_yrs
## <chr> <chr> <dbl>
## 1 2007-06-22 2017-04-15 9.82
## 2 2004-02-13 2018-07-04 14.4
## 3 2010-10-27 2016-10-31 6.01
Menggunakan package lubridate, operator %--% akan menetapkan interval waktu, yang mana akan di ubah menjadi jumlah detik yang telah berlalu menggunakan as.duration, dan akhirnya diubah lagi menjadi tahun, dengan membaginya menggunakan dyears(1), yang memberikan jumlah detik dalam tahun.
## # A tibble: 3 x 3
## sx_date last_fup_date os_yrs
## <chr> <chr> <dbl>
## 1 2007-06-22 2017-04-15 9.82
## 2 2004-02-13 2018-07-04 14.4
## 3 2010-10-27 2016-10-31 6.01
lubridate lalu menjalankannya dengan library(lubridate) untuk dapat mengakses operator khusus (lakukan hal yang sama untuk setiap kasus ingin menggunakan package tertentu)Untuk komponen dari survival data, saya menjelaskan dua indikator peristiwa:
Indikator peristiwa \(\delta_i\):
Namun, dalam R fungsi dari Surv dapat ditulisakan sebagai TRUE/FALSE (TRUE = peristiwa) atau bisa juga di tuliskan 1/2 (2 = peristiwa).
Dalam data lung, kita memiliki:
Dalam fungsi matematika peluang bahwa subjek akan survive (bertahan) melebihi waktu yang ditentukan, dirumuskan sebagai berikut:
\[S(t) = Pr(T>t) = 1 - F(t)\]
dimana:
Secara teori, fungsi survive (bertahan hidup) itu mulus; dalam praktiknya saya mengamati peristiwa pada skala waktu yang berbeda.
Metode Kaplan-Meier adalah cara yang paling banyak digunakan untuk memperkirakan waktu survive seseorang dan juga peluangnya. Metode ini merupakan pendekatan non-parametrik yang menghasilkan fungsi langkah, dimana ada penurunan dalam setiap kali suatu peristiwa terjadi.
Surv dari package survival membuat objek survival yang digunakan sebagai respons dalam perumusan modelnya. Akan ada satu data untuk setiap subjek yaitu survival time (waktu bertahan hidup), yang di ikuti dengan + jika subjek mengalami sensoring. Mari lihat 10 observasi pertama:## [1] 306 455 1010+ 210 883 1022+ 310 361 218 166
survfit digunakan untuk membuat kurva survival berdasarkan dari formula yang ada. Mari buat kurva survival (kelangsungan hidup) secara keseluruhan untuk semua kelompok, tetapkan ke objek f1, lalu lihat names dari object tersebut:## [1] "n" "time" "n.risk" "n.event" "n.censor" "surv"
## [7] "std.err" "cumhaz" "std.chaz" "type" "logse" "conf.int"
## [13] "conf.type" "lower" "upper" "call"
Beberapa komponen kunci dari objek survfit, akan digunakan untuk membuat kurva survival antara lain:
time, yang berisi titik awal dan akhir dari setiap interval waktusurv, yang berisi peluang survive (bertahan hidup) yang sesuai untuk setiap timeSekarang kita plot objek survfit dalam R untuk mendapatkan plot Kaplan-Meier.
plot(survfit(Surv(time, status) ~ 1, data = lung),
xlab = "Days",
ylab = "Overall survival probability")R menunjukkan fungsi langkah (garis penuh) dengan interval kepercayaan (garis putus-putus).mark.time = TRUE)Sebagai alternatif, fungsi ggsurvplot dari package survminer yang dibangun diatas ggplot2 dan dapat digunakan untuk membuat plot Kaplan-Meier. Lihat cheatsheet untuk package survminer.
library(survminer)
ggsurvplot(
fit = survfit(Surv(time, status) ~ 1, data = lung),
xlab = "Days",
ylab = "Overall survival probability")ggsurvplot menunjukkan fungsi langkah (garis solid) dengan pita kepercayaan yang terkait (area yang berbayang).censor=FALSESatu kuantitas yang sering menjadi perhatian dalam analisis survival adalah peluang untuk survive melebihi jumlah (\(x\)) tahun tertentu.
Sebagai contoh, untuk mengestimasi peluang survive sampai 1 tahun, gunakan summary dengan argumen times (Perhatikan variabel time di data lung sebenarnya dalam hari, jadi kita perlu menggunakan times = 365,25)
## Call: survfit(formula = Surv(time, status) ~ 1, data = lung)
##
## time n.risk n.event survival std.err lower 95% CI upper 95% CI
## 365 65 121 0.409 0.0358 0.345 0.486
Kita bisa melihat bahwa peluang survival (kelangsungan hidup) selama 1 tahun dalam penelitian ini adalah sebesar 41%
Batas bawah dan atas yang terkait dari interval kepercayaan 95% juga ditampilkan.
Peluang survival (kelangsungan hidup) 1-tahun adalah titik pada sumbu y yang sesuai dengan 1 tahun pada sumbu x untuk kurva survival (kelangsungan hidup)
Apa yang terjadi jika kita menggunakan perkiraan “naif”?
121 dari 228 pasien meninggal dalam 1 tahun, jadi: \[\Big(1 - \frac{121}{228}\Big) \times 100 = 47\%\]
Kamu akan mendapatkan perkiraan yang salah tentang kemungkinan survive selama 1 tahun, ketika kamu mengabaikan fakta bahwa 42 pasien sensoring (hilang/tidak diketahui kondisinya) sebelum 1 tahun.
Hal penting lain yang menarik dalam analisis survival adalah waktu survive rata-rata, yang kita ukur menggunakan median. Waktu survive tidak diharapkan terdistribusi secara normal sehingga nilai meannya bukan ringkasan yang tepat.
Kita dapat memperoleh ini langsung dari objek survfit kita dengan memakai data lung:
## Call: survfit(formula = Surv(time, status) ~ 1, data = lung)
##
## n events median 0.95LCL 0.95UCL
## 228 165 310 285 363
Kita bisa melihat median waktu survive adalah 310 hari batas bawah dan atas dari interval kepercayaan 95%.
Median survival adalah waktu yang sesuai dengan peluang survive 0,5:
Dalam plot diatas, kita bisa melihat bahwa rata-rata survival dari subjek yang diteliti adalah dibawah 12 bulan. Dengan kata lain, peluang seorang untuk bertahan hidup (survive) di atas 12 bulan bernilai kurang dari sama dengan 0,5 (\(\leq 0.5\))
Apa yang terjadi jika kita menggunakan perkiraan “naif”? Rangkuman waktu median survival di antara 165 pasien yang meninggal
## median_surv
## 1 226
lung di presentasikan oleh warna biru sebagai perbandingan terhadap kurva yang mengabaikan sensoring.?Survdiff untuk melihat opsi tes lainnya yang berbeda)Kita akan mendapatkan nilai p-value dari tes log-rank menggunakan fungsi survdiff. Misalnya, kita dapat menguji apakah ada perbedaan waktu survive (bertahan hidup) menurut jenis kelamin di data lung
## Call:
## survdiff(formula = Surv(time, status) ~ sex, data = lung)
##
## N Observed Expected (O-E)^2/E (O-E)^2/V
## sex=1 138 112 91.6 4.55 10.3
## sex=2 90 53 73.4 5.68 10.3
##
## Chisq= 10.3 on 1 degrees of freedom, p= 0.001
Untuk mengekstraksi nilai p-value dari hasil survdiff sebenarnya agak merepotkan. Berikut adalah cara untuk melakukannya:
## [1] 0.001311165
Atau juga kita dapat menggunakan fungsi sdp dalam package ezfun, yang mana bisa kita install menggunakan devtools::install_github("zabore/ezfun"). Ini berguna untuk mengembalikan nilai p-value yang di format
## [1] 0.001
Kita mungkin ingin mengukur ukuran efek untuk satu variabel, atau memasukkan lebih dari satu variabel ke dalam model regresi untuk memperhitungkan efek dari beberapa variabel.
Model regresi Cox merupakan model semi parametrik yang dapat digunakan untuk menyesuaikan model regresi univariabel dan multivariabel yang memiliki hasil survival.
\[h(t|X_i) = h_0(t) \exp(\beta_1 X_{i1} + \cdots + \beta_p X_{ip})\]
Beberapa poin asumsi dari model tersebut:
Catat! : model regresi parametrik untuk hasil survival juga tersedia, tetapi model tersebut tidak akan dibahas dalam pembahasan ini.
Kita dapat menyesuaikan model regresi untuk data survival menggunakan fungsi coxph, yang mengambil objek Surv di sisi kiri dan memiliki sintaks standar untuk rumus regresi dalam R di sisi kanan.
## Call:
## coxph(formula = Surv(time, status) ~ sex, data = lung)
##
## coef exp(coef) se(coef) z p
## sex -0.5310 0.5880 0.1672 -3.176 0.00149
##
## Likelihood ratio test=10.63 on 1 df, p=0.001111
## n= 228, number of events= 165
Kita dapat melihat output versi tidy menggunakan fungsi tidy dari package broom:
library(kableExtra)
broom::tidy(
coxph(Surv(time, status) ~ sex, data = lung),
exp = TRUE
) %>%
kable()| term | estimate | std.error | statistic | p.value |
|---|---|---|---|---|
| sex | 0.5880028 | 0.1671786 | -3.176385 | 0.0014912 |
Atau kita bisa menggunakan tbl_regression dari package gtsummary:
library(gtsummary)
coxph(Surv(time, status) ~ sex, data = lung) %>%
gtsummary::tbl_regression(exp = TRUE) | Characteristic | HR1 | 95% CI1 | p-value |
|---|---|---|---|
| sex | 0.59 | 0.42, 0.82 | 0.001 |
|
1
HR = Hazard Ratio, CI = Confidence Interval
|
|||
Kuantitas yang menarik dari model regresi Cox adalah rasio bahaya/ hazard ratio(HR). HR mewakili rasio bahaya antara dua kelompok pada titik waktu tertentu.
HR diartikan sebagai tingkat peristiwa sesaat dari peristiwa yang menarik bagi mereka yang masih berisiko untuk peristiwa tersebut. Ini bukan risiko, meskipun secara umum ditafsirkan seperti itu
Jika kita memiliki parameter regresi \(\beta\) (dari kolom estimate dalam coxph kami) maka HR = exp (\(\beta\)).
HR bernilai < 1 menunjukkan pengurangan bahaya kematian sedangkan HR bernilai > 1 menunjukkan peningkatan bahaya kematian.
Jadi HR kita adalah = 0,59 menyiratkan bahwa sekitar 0,6 kali lebih banyak wanita yang meninggal daripada pria, pada waktu tertentu.