Email: theodoraputrina@gmail.com
RPubs: https://rpubs.com/Theodora
Data waktu ke acara umum yang termasuk pada banyak bidang, tetapi tidak terbatas pada:
Karena Analisis Survival umum pada banyak bidang lainnya, maka ada juga beberapa sebutan lainnya
tujuan dari bab ini adalah untuk mendeskripsikan konsep dasar dari analisis survival. dalam studi kanker, sebagian besar analisis survival menggunakan metode berikut:
Disini, kita akan mulai dengan menjelaskan konsep esensial analisis kelangsungan hidup, termasuk:
Kemudian, kita akan melanjutkan dengan mendeskripsikan analisis multivariat menggunakan model proporsional hazard Cox.
Untuk subjek \(i\)
Waktu yang diamati dan indikator kejadian disediakan dalam data lung
dataset lung tersedia dari survival paket pada R. Data berisis subjek dengan kanker paru-paru stadium lanjut dari North Central Cancer Treatment Group. Beberapa variabel yang akan kami gunakan untuk mendemonstrasikan metode hari ini termasuk
Refernsinya adalah: 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 karena:
Secara khusu ini adalah contoh rights sensor.
Sensor kiri dan sensor interval jadi dimungkinkan, dan ada metode untuk menganalisis jenis data ini, tetapi pelatihan ini akan dibatasi pada sensor kanan.
Dalam contoh ini, bagaiman kita menghitung proporsi yang bebas peristiwa pada 10 tahun?
Subjek 6 dan 7 bebas acara pada 10 tahun. subjek 2, 9, dan 10 memiliki kejadian tersebut sebelum 10 tahun. Subjek 1, 3, 4, 5, dan 8 *disensor sebelum 10 tahun, jadi kita tidak tahu apakah mereka memiliki acara tersebut atau tidak hingga 10 tahun - bagaiman kita bisa memasukkan subjek ini ke dalam perkiraan kita?
#Berurusan dengan tanggal di R{.tabset .tabset-fade .tabset-pills}
Data sering kali datang dengan tanggal awal dan akhir daripada waktu kelangsungan hidup yang telah dihitung sebelumnya. Langkah pertaa adalah memastikan ini diformat sebagi tanggal di R.
Mari kita buat contoh kecil dataset dengan variabel sx_date untuk tanggal opersi dan last_fup_date untuk tanggal tindak lanjur terakhir.
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 melihat ini adalah kedua variabel karakter, yang akan sering terjadi, tetapi kita membutuhkannya untuk diformat sebagai tanggal di R.
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
format="%m/%d/%Y"Kita juga bisa menggunakan lubdridate untuk memformat tanggal. Dalam kasus ini, gunakan 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
?Dmy akan menampilkan semua ospi formatSekarang setelah tanggal diformat, kita perlu menghitung perbedaan antara waktu mulai dan berkahir dalam beberpa unit, biasanya bulan atau tahun. Dalam basis R, gunakan difftime untuk menghitung jumlah hari antara dua tanggal kita dan mengubahnya menjadi nilai numerik menggunakan as.numeric. Kemudian ubahke tahun dengan membaginya dengan 365,25, jumlah rata-rat 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
Dengan menggunakan paket lubridate, operator %--% menetapkan interval waktu, yang kemudian diubah menajdi jumlah detik yang telah berlalu menggunakan as.duration dan akhirnya diubah menjadi tahun dengan membagi dengan 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 menggunakan panggilan ke library agar dapat mengakses operator khusus (mirip dengan situasi dengan pipa)Untuk komponen data survival saya sebutkan indikator kejadian:
Indikator kejadian \(δ_i\): * 1 jika kejadian diamati (yaitu \(T_i≤C_i\)) * 0 jika disnsor (yaitu \(T_i>C_i\))
Namun, di R fungsi Surv juga akan menerima TRUE/FALSE (TRUE=event) atau 1/2 (2=event).
Pada data lung, kita tau:
Probabilitas bahwa subjek akan bertahan melebihi waktu tertentu
\[S(t) = Pr(T>t) = 1 - F(t)\] \(S(t)\): fungsi bertahan hidup \(F(t)=Pr(T≤t)\): distribusi kumulatif
Secara teori, fungsi bertahan hidup itu mulus, dalam praktiknya kita mengamati peristiwa pada skala waktu yang berbeda.
Metode Kaplan-Meier adalah cara paling umum untuk memperkirakan waktu kelangsungan hidup dan probabilitas. Ini adalah pendekatan non-parametik yang menghasilkan fungsi langkah, dimana ada penuruan setiap kali suatu peristiwa terjadi.
## [1] 306 455 1010+ 210 883 1022+ 310 361 218 166
survfit menciptakan kurva kelangsungan hidup berdasarkan rumus. Mari buat kurva kelangsungan hidup keseluruhan untuk seluruh kelompok, tetapkan ke objek f1, dan lihat name objek itu:## [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 ini yang akan digunakan untuk membuat kurva survival meliputi:
time, yang berisi titik awal dan akhir setiap interval waktusurv, yang berisi probabilitas kelangsungan hidup yang sesuai untuk setiap timeSekarang kita plot objek survfit di basis 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 terkait (garis putus-putus)mark.time = TRUE)Sebagai alternatif, fungsi ggsurvplot dari paket survminer dibangun di atas ggplot2, dan dapat digunakan untuk membuat plot Kaplan-Meier. Lihat catatan untuk paket 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 terkait (area berbayang).censor = FALSESatu kuantitas yang sering menjadi perhatian dalam analisis kelangsungan hidup adalah probabilitas untuk bertahan hidup melebihi jumlah \((x)\) tahun tertentu.
Misalnya, untuk mengestimasi probabilitas bertahan hingga 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 menemukan bahwa probabilitas kelangsungan hidup 1 tahun dalam penelitian ini adalah 41%.
Batas bawah dan atas yang terkait dari interval kepercayaan 95% juga ditampilkan.
Probabilitas kelangsungan hidup 1 tahun adalah titik pada sumbu y yang sesuai dengan 1 tahun pada sumbu x untuk kurva kelangsungan hidup.
Apa yang terjadi jika Anda menggunakan perkiraan “naive”?
121 dari 228 pasien meninggal dalam 1 tahun jadi:
\[\Big(1 - \frac{121}{228}\Big) \times 100 = 47\%\] Anda mendapatkan perkiraan yang salah tentang kemungkinan bertahan hidup 1 tahun ketika Anda mengabaikan fakta bahwa 42 pasien disensor sebelum 1 tahun.
Kuantitas lain yang sering menarik dalam analisis kelangsungan hidup adalah waktu bertahan hidup rata-rata, yang kami ukur menggunakan median. Waktu bertahan tidak diharapkan terdistribusi secara normal sehingga meannya bukan ringkasan yang tepat.
Kita dapat memperoleh ini langsung dari objek survfit kami
## Call: survfit(formula = Surv(time, status) ~ 1, data = lung)
##
## n events median 0.95LCL 0.95UCL
## 228 165 310 285 363
Kita melihat median waktu bertahan hidup adalah 310 hari Batas bawah dan atas dari interval kepercayaan 95% juga ditampilkan.
Kelangsungan hidup median adalah waktu yang sesuai dengan probabilitas kelangsungan hidup \(0,5\):
Apa yang terjadi jika Anda menggunakan perkiraan “naive”? Rangkum waktu bertahan hidup rata-rata di antara 165 pasien yang meninggal
## median_surv
## 1 226
?Survdiff untuk opsi tes yang berbeda)Kita mendapatkan nilai p log-rank menggunakan fungsi survdiff. Misalnya, kami dapat menguji apakah ada perbedaan waktu 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
Sebenarnya agak merepotkan untuk mengekstrak nilai-p dari hasil survdiff. Berikut adalah baris kode untuk melakukannya
## [1] 0.001311165
Atau ada fungsi sdp di paket ezfun, yang dapat Anda instal menggunakan devtools :: install_github ("zabore / ezfun"). Ini mengembalikan nilai p yang diformat
## [1] 0.001
Kita mungkin ingin mengukur ukuran efek untuk satu variabel, atau menyertakan lebih dari satu variabel ke dalam model regresi untuk memperhitungkan efek 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})\] \(h(t)\): hazard, atau kecepatan sesaat di mana peristiwa terjadi \(h_0(t)\): bahaya dasar yang mendasari
Beberapa asumsi utama model:
Catatan: model regresi parametrik untuk hasil kelangsungan hidup juga tersedia, tetapi model tersebut tidak akan dibahas dalam pelatihan ini
Kita dapat menyesuaikan model regresi untuk data kelangsungan hidup 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 versi keluaran yang rapi menggunakan fungsi tidy dari paket 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 |
| Characteristic | HR1 | 95% CI1 | p-value |
|---|---|---|---|
| sex | 0.59 | 0.42, 0.82 | 0.001 |
|
1
HR = Hazard Ratio, CI = Confidence Interval
|
|||
estimasi kolom di coxph kita) maka HR = \(exp (β)\).