Pada bagian terakhir bab 2 kita telah membahas tentang pengenalan konsep dan metode pada analisis kelangsungan hidup. Sekarang kita akan fokus pada Analisi Risiko Bersaing (CRA) dengan memilih model dan menilai kecukupan dan kecocokannya , package utama yang digunakan dalam analisis risiko bersaing adalah cmprsk.
## Loading required package: survival
Ketika subjek memiliki beberapa kemungkinan dalam pengaturan waktu kejadian
Contoh :
Semua atau sebagian (dari lainnya) mungkin merupakan peristiwa yang mungkin terjadi dalam pembelajaran tertentu.
Ketergantungan yang tidak teramati di antara waktu peristiwa adalah masalah mendasar yang mengarah pada kebutuhan akan pertimbangan khusus. Sebagai contoh, dapat dibayangkan bahwa pasie yang kambuh dan kemungkinan meninggal, oleh karena itu waktu untuk kambuh dan waktu kematian tidak termasuk kejadian yang independen.
Dua pendekatan analisis dengan adanya beberapa hasil potensial :
1.Bahaya khusus penyebab peristiwa tertentu, ini mewakili tingkat per unit waktu peristiwa di antara mereka yang tidak gagal dari peristiwa lain
2.Insiden kumulatif dari peristiwa tertentu : ini mewakili rasio per unit waktu kejadian serta pengaruh peristiwa yang bersaing
Masing-masing pendekatan hanya dapat menerangi satu aspek penting dari data , sementara mengaburkan yang lain, dan pendekatan yang di pilih harus bergantung pada pertanyaan yang menarik.
Saat kami mengerjakan analisis risiko bersaing, berikut beberapa
Catatan dan referensi tambahan yang harus kami pertimbangkan :
referensi yang dapat kita dapatkan untuk lebih mempelajari :
Kita menggunakan data Melanom dari package MASS untuk mengilustrasikan konsep ini, terdapat beberapa variable :
Age : umur dalam tahunyear : Tahun beroperasiThickness : ketebalan tumor dalam mmUlcer : 1 hadir , 0 tidak hadirEstimasi kumulatif insiden dalam konteks risiko bersaing menggunakan fungsi cuminc
Catatan : dalam data Melanoma, pasien yang disensor diberi kode 2 untuk status, jika tidak dapat menggunakan opsi kode default 0
## Estimates and Variances:
## $est
## 1000 2000 3000 4000 5000
## 1 1 0.12745714 0.23013963 0.30962017 0.3387175 0.3387175
## 1 3 0.03426709 0.05045644 0.05811143 0.1059471 0.1059471
##
## $var
## 1000 2000 3000 4000 5000
## 1 1 0.0005481186 0.0009001172 0.0013789328 0.001690760 0.001690760
## 1 3 0.0001628354 0.0002451319 0.0002998642 0.001040155 0.001040155
Hasilkan plot R dengan semua default
Dalam legenda
Kita juga dapat membuat plot kumulatif insiden menggunakan fungsi ggscompetingrisks dari package survminer. Dalam hal ini kita mendapatkan panel yang diberi label sesuai dengan kelompok dan legenda berlabel peristiwa, yang menunjukan jenis peristiwa untuk setiap baris.
Catatan
Anda dapat menggunakan opsi multiple_panels=FALSE untuk memiliki semua kelompok plot pada panel tunggal
Tidak seperti basis R, sumbu y tidak pergi ke 1 secara default, jadi anda harus mengubahnya secara manual
## Loading required package: ggplot2
## Loading required package: ggpubr
Dalam cuminc tes Gray menggunakan diantara kelompok tes.
Sebagai contoh, bandingkan hasil Melanoma menurut ulcer, ada tidaknya ulserasi. Hasil tes dapat ditemukan dalam tests
ci_ulcer<-cuminc(
ftime = Melanoma$time,
fstatus = Melanoma$status,
group= Melanoma$ulcer,
cencode=2)
ci_ulcer[["Tests"]]## stat pv df
## 1 26.120719 3.207240e-07 1
## 3 0.158662 6.903913e-01 1
Kita juga memvisualisasikan atau membuat plot dari insiden kumulatif berdasarkan kelompok menggunakan package ggcompetingrisks.
Catatan
Saya pribadi menemukan bahwa fungsi ggcompetingrisk kurang dalam penyesuaian, terutama dibandingkan dengan ggsurvplot. Saya biasanya melakukan plotting, dengan terlebih dahulu membuat kumpulan data yang rapi dari hasil cuminc, dan kemudian memplot hasilnya. Lihat kode sumber untuk presentasi ini untuk rincian kode yang mendasari
## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
## v tibble 3.0.4 v dplyr 1.0.4
## v tidyr 1.1.2 v stringr 1.4.0
## v readr 1.4.0 v forcats 0.5.0
## v purrr 0.3.4
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
ciplotdat<-ci_ulcer%>%
list_modify("Tests"=NULL)%>%
map_df(`[`,c("time","est"), .id="id")%>% mutate(id=recode(id,
"0 1"="Not ulcerated:Death Melanoma",
"0 3"="Not ulcerated:Death other causes",
"1 1"="Ulcerated:Death Melanoma",
"1 3"="Ulcerated:Death other causes"))%>%
separate(id,c("Ulceration","Event"),":")
ggplot(ciplotdat,aes(x=time,y=est,color=Ulceration))+
geom_step(lwd=1.2,aes(linetype=Event))+
ylim(c(0,1))+
theme_classic()+
theme(plot.title = element_text(size = 14),
legend.title = element_blank(),
legend.position = "bottom")+
labs(x="Days",
y= "Cumulative incidence",
title = "Death by ulceration status")+
annotate("text",x=0,y=1,hjust=0,
label=paste0("Death melanoma p=",
ifelse(ci_ulcer$Tests[1,2]<.001,"<.001",
round(ci_ulcer$Tests[1,2],3))))+
annotate("text",x=0,y=0.92, hjust=0,
label=paste0("Death other causes p=",ifelse(ci_ulcer$Tests[2,2]<.001,"<.001",
round(ci_ulcer$Tests[2,2],3))))Seringkali hanya satu dari jenis peristiwa yang menarik, meskipun kami masih ingin memperhitungkan peristiwa yang bersaing. Dalam hal ini peristiwa yang menarik dapat direncanakan sendiri. Sekali lagi, saya melakukan ini secara manual dengan terlebih dahulu membuat set data yang rapi dari hasil ‘cuminc’ , dan kemudian memplot hasilnya. Lihat kode sumber untuk presentasi ini untuk rincian kode yang mendasari.
ciplotdat1<-
ci_ulcer%>%
list_modify("Tests"=NULL)%>%
map_df(`[`,c("time","est"),.id="id")%>%
filter(id %in% c("0 1","1 1")) %>%
mutate(Ulceration=recode(
id,
"0 1"= "Not Ulcerated",
"1 1" = "Ulcerated")
)
ggplot(ciplotdat1,aes(x=time,y=est ,color=Ulceration))+
geom_step(lwd=1.2)+
ylim(c(0,1))+
theme_classic()+
theme(plot.title=element_text(size=14),
legend.title = element_blank(),
legend.position = "bottom")+
labs(x="Days",
y= "Cumulative incidence",
tittle="Melanoma death by ulceration status")+
annotate("text",x=0,y=1,hjust=0,
label=paste0("p-value=",
ifelse(ci_ulcer$Tests[1,2]<.001,"<.001",
round(ci_ulcer$Tests[1,2],3))))Anda mungkin ingin menambahkan jumlah tabel risiko ke plot insiden kumulatif, dan tidak ada cara mudah untuk melakukan ini yang saya ketahui. Lihat kode sumber untuk presentasi ini untuk satu contoh (dengan permintaan populer, kode sumber sekarang disertakan langsung di bawah untuk satu contoh spesifik)
R, 0ggcompetingrisks dari ggplotmel_plot<-
ggplot(ciplotdat1,aes(x=time,y=est,color=Ulceration))+
geom_step(lwd=1.2)+
ylim(c(0,1))+
coord_cartesian(xlim=c(0,5000))+
scale_x_continuous(breaks = seq(0,5000,1000))+
theme_classic()+
theme(plot.title = element_text(size=14),
legend.title = element_blank(),
legend.position = "bottom")+
labs(x="Days",
y="Cumulative incidence",
tittle="Melanoma death by ulceration status")+
annotate("text",x=0,y=1,hjust=0,
label=paste0("p-value",
ifelse(ci_ulcer$Tests[1,2]<.001,
"<.001",
round(ci_ulcer$Tests[1,2],3))))Peroleh nomor table risiko dari ‘ggsurvplot’ menggunakan ‘survfit’ dimana semua kejadian dihitung sebagai titik akhir komposit tunggal
mel_fit<-survfit(
Surv(time,ifelse(status !=2,1,0))~ulcer,
data= Melanoma
)
num<-ggsurvplot(
fit=mel_fit,
risk.table=TRUE,
risk.table.y.text= FALSE,
ylab="Days",
risk.table.fontsize=3.2,
tables.theme = theme_survminer(font.main=10),title="Test")## Warning: Vectorized input to `element_text()` is not officially supported.
## Results may be unexpected or may change in future versions of ggplot2.
Kemudian gabungkan plot dan risktable. Saya menggunakan fungsi ‘plot_grid’ dari paket ‘cowplot’ untuk ini
tables.themes=themes_survminer(font.main=10)!Regresi dua pendekatan
Penyebab bahaya spesifik
tingkat kejadian seketika dari jenis peristiwa tertentu dalam subjek peristiwa bebas saat ini
memperkirakan menggunakan regresi Cox (fungsi ‘coxph’)
Bahaya subdistribusi
tingkat kemunculan sesaat dari jenis peristiwa tertentu pada subjek yang belum mengalami jenis peristiwa itu
memperkirakan menggunakan regresi Fine-Gray (fungsi ‘crr’)
Katakanlah kita tertarik untuk melihat pengaruh usia dan jenis kelamion pada kematian akibat Melanoma, dengan kematian akibat penyebab lain sebagai peristiwa yang bersaing
Notes : * crr membutuhkan spesifikasi kovariat sebagai matriks
failcode, secara default hasil dikembalikan untuk kode ‘failcode’ = 1shr_fit<-crr(ftime=Melanoma$time,fstatus=Melanoma$status,cov1=Melanoma[,c("sex","age")],cencode=2)
shr_fit## convergence: TRUE
## coefficients:
## sex age
## 0.58840 0.01259
## standard errors:
## [1] 0.271800 0.009301
## two-sided p-values:
## sex age
## 0.03 0.18
Pada contoh sebelumnya, antara jenis kelamin dan umur dikodekan sebagai variable numeric. Funsi ‘crr’ tidak bias secara alami mengatur variable karakter, dan kamu akan memperoleh error, sehingga jika terdapar variable karakter kita harus membuat variable dummy menggunakan mode.matrix
#membuat contoh variabel karakter
chardat<-Melanoma %>% mutate(sex_char=ifelse(sex==0,"Male","Female"))
#membuat dummy variables dengan model.matrix
# [,-1] menghilangkan intersept
covs1<-model.matrix(~sex_char+age,data=chardat)[,-1]
# sekarang kita dapat melalui argument cov1, dan itu akan bekerja
crr(ftime=chardat$time,
fstatus=chardat$status,
cov1=covs1,
cencode=2)## convergence: TRUE
## coefficients:
## sex_charMale age
## -0.58840 0.01259
## standard errors:
## [1] 0.271800 0.009301
## two-sided p-values:
## sex_charMale age
## 0.03 0.18
Hasil dari crr tidak didukung antara broom::tidy() atau gtsummary::tbl_regression() pada waktu ini. Sebagai alternative , coba (tidak fleksibel, tetapi lebih baik daripada tidak?) mvcrres dari package saya ezfun
##
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
##
## group_rows
| HR (95% CI) | p-value | |
|---|---|---|
| sex | 1.8 (1.06, 3.07) | 0.03 |
| age | 1.01 (0.99, 1.03) | 0.18 |
Sensor semua subjek yang tidak memiliki kejadian yang tidak diinginkan, dalam hal ini kematian akibat Melanoma, dan menggunakan coxph seperti sebelumnya. Jadi, pasien yang meninggal karena penyebab lain sekarang di sensor untuk pendekatan penyebab spesifik bahaya terhadap risiko yang bersaing.
hasil dapat di format dengan broom::tidy() atau gtsummary::tbl_refression()
chr_fit<-
coxph(Surv(time,ifelse(status==1,1,0))~sex+age,
data=Melanoma)
broom::tidy(chr_fit,exp=TRUE)%>%
kable()| term | estimate | std.error | statistic | p.value |
|---|---|---|---|---|
| sex | 1.818949 | 0.2676386 | 2.235323 | 0.0253961 |
| age | 1.016679 | 0.0086628 | 1.909514 | 0.0561958 |
| Characteristic | HR1 | 95% CI1 | p-value |
|---|---|---|---|
| sex | 1.82 | 1.08, 3.07 | 0.025 |
| age | 1.02 | 1.00, 1.03 | 0.056 |
|
1
HR = Hazard Ratio, CI = Confidence Interval
|
|||