Pembaruan : Maaf untuk pembaruan lain tetapi saya telah menemukan beberapa solusi yang mungkin dengan polinomial fraksional dan paket risiko yang bersaing yang saya perlukan bantuan.
Masalah
Saya tidak dapat menemukan cara mudah untuk melakukan analisis koefisien dependen waktu dalam R. Saya ingin dapat mengambil koefisien variabel saya dan melakukannya menjadi koefisien dependen waktu (bukan variabel) dan kemudian plot variasi terhadap waktu:
Solusi yang memungkinkan
1) Memisahkan dataset
Saya telah melihat contoh ini (Se bagian 2 dari sesi lab) tetapi pembuatan dataset terpisah tampak rumit, komputasional mahal dan tidak terlalu intuitif ...
2) Model Reduced Rank - Paket coxvc
The paket coxvc menyediakan cara yang elegan untuk menangani masalah - di sini adalah panduan . Masalahnya adalah bahwa penulis tidak lagi mengembangkan paket (versi terakhir adalah sejak 23/5/2007), setelah beberapa percakapan email saya mendapatkan paket untuk bekerja tetapi satu kali berjalan membutuhkan 5 jam pada dataset saya (140 000 entri) dan memberikan perkiraan ekstrim pada akhir periode. Anda dapat menemukan paket yang sedikit diperbarui di sini - Saya baru saja memperbarui fungsi plot.
Mungkin hanya masalah penyesuaian tetapi karena perangkat lunak tidak mudah memberikan interval kepercayaan dan prosesnya sangat memakan waktu, saya sedang mencari solusi lain sekarang.
3) Paket penghitung waktu
Paket timereg yang mengesankan juga mengatasi masalah tetapi saya tidak yakin bagaimana menggunakannya dan itu tidak memberi saya alur yang mulus.
4) model Fractional Polynomial Time (FPT)
Saya menemukan disertasi Anika Buchholz yang sangat baik tentang "Penilaian efek jangka panjang yang bervariasi dari terapi dan faktor prognostik" yang melakukan pekerjaan luar biasa yang mencakup model yang berbeda. Dia menyimpulkan bahwa usulan FPT Sauerbrei et al tampaknya paling tepat untuk koefisien tergantung waktu:
FPT sangat baik dalam mendeteksi efek yang bervariasi waktu, sedangkan pendekatan Reduced Rank menghasilkan model yang terlalu rumit, karena tidak termasuk pemilihan efek yang bervariasi waktu.
Penelitian ini kelihatannya sangat lengkap tetapi sedikit di luar jangkauan saya. Saya juga sedikit bertanya-tanya karena dia kebetulan bekerja dengan Sauerbrei. Tampaknya terdengar baik dan saya kira analisis dapat dilakukan dengan paket mfp tapi saya tidak yakin bagaimana caranya.
5) Paket cmprsk
Saya sudah berpikir untuk melakukan analisis risiko saya yang bersaing, tetapi perhitungannya memakan waktu lama, jadi saya beralih ke regresi cox biasa. The crr memiliki thoug pilihan untuk waktu kovariat tergantung:
....
cov2 matrix of covariates that will be multiplied
by functions of time; if used, often these
covariates would also appear in cov1 to give
a prop hazards effect plus a time interaction
....
Ada contoh kuadrat tapi saya tidak cukup mengikuti di mana waktu sebenarnya muncul dan saya tidak yakin bagaimana menampilkannya. Saya juga sudah melihat file test.R tapi contohnya pada dasarnya sama ...
Contoh kode saya
Inilah contoh yang saya gunakan untuk menguji berbagai kemungkinan
library("survival")
library("timereg")
data(sTRACE)
# Basic cox regression
surv <- with(sTRACE, Surv(time/365,status==9))
fit1 <- coxph(surv~age+sex+diabetes+chf+vf, data=sTRACE)
check <- cox.zph(fit1)
print(check)
plot(check, resid=F)
# vf seems to be the most time varying
######################################
# Do the analysis with the code from #
# the example that I've found #
######################################
# Split the dataset according to the splitSurv() from prof. Wesley O. Johnson
# http://anson.ucdavis.edu/~johnson/st222/lab8/splitSurv.ssc
new_split_dataset = splitSuv(sTRACE$time/365, sTRACE$status==9, sTRACE[, grep("(age|sex|diabetes|chf|vf)", names(sTRACE))])
surv2 <- with(new_split_dataset, Surv(start, stop, event))
fit2 <- coxph(surv2~age+sex+diabetes+chf+I(pspline(stop)*vf), data=new_split_dataset)
print(fit2)
######################################
# Do the analysis by just straifying #
######################################
fit3 <- coxph(surv~age+sex+diabetes+chf+strata(vf), data=sTRACE)
print(fit3)
# High computational cost!
# The price for 259 events
sum((sTRACE$status==9)*1)
# ~240 times larger dataset!
NROW(new_split_dataset)/NROW(sTRACE)
########################################
# Do the analysis with the coxvc and #
# the timecox from the timereg library #
########################################
Ft_1 <- cbind(rep(1,nrow(sTRACE)),bs(sTRACE$time/365,df=3))
fit_coxvc1 <- coxvc(surv~vf+sex, Ft_1, rank=2, data=sTRACE)
fit_coxvc2 <- coxvc(surv~vf+sex, Ft_1, rank=1, data=sTRACE)
Ft_3 <- cbind(rep(1,nrow(sTRACE)),bs(sTRACE$time/365,df=5))
fit_coxvc3 <- coxvc(surv~vf+sex, Ft_3, rank=2, data=sTRACE)
layout(matrix(1:3, ncol=1))
my_plotcoxvc <- function(fit, fun="effects"){
plotcoxvc(fit,fun=fun,xlab='time in years', ylim=c(-1,1), legend_x=.010)
abline(0,0, lty=2, col=rgb(.5,.5,.5,.5))
title(paste("B-spline =", NCOL(fit$Ftime)-1, "df and rank =", fit$rank))
}
my_plotcoxvc(fit_coxvc1)
my_plotcoxvc(fit_coxvc2)
my_plotcoxvc(fit_coxvc3)
# Next group
my_plotcoxvc(fit_coxvc1)
fit_timecox1<-timecox(surv~sex + vf, data=sTRACE)
plot(fit_timecox1, xlab="time in years", specific.comps=c(2,3))
Hasil kode dalam grafik ini: Perbandingan pengaturan yang berbeda untuk coxvc dan coxvc dan plot timecox . Saya kira hasilnya ok tapi saya tidak berpikir saya akan bisa menjelaskan grafik timecox - sepertinya rumit ...
Pertanyaan saya (saat ini)
- Bagaimana saya melakukan analisis FPT di R?
- Bagaimana cara menggunakan kovariat waktu di cmprsk?
- Bagaimana saya memplot hasilnya (lebih disukai dengan interval kepercayaan)?
sumber
y~x
y~x*(t+t^2)-t
y~x+x:t+x:t^2
Jawaban:
@mpiktas nyaris menawarkan model yang layak, namun istilah yang perlu digunakan untuk kuadratik dalam waktu = t adalah
I(t^2))
. Ini karena di R rumus interpretasi "^" menciptakan interaksi dan tidak melakukan eksponensial, sehingga interaksi "t" dengan "t" hanyalah "t". (Bukankah ini harus dimigrasi ke SO dengan tag [r]?)Untuk alternatif dari proses ini, yang bagi saya agak meragukan untuk tujuan inferensi, dan yang mungkin sesuai dengan minat Anda dalam menggunakan fungsi-fungsi pendukung dalam paket rm / Hmisc Harrell, lihat "Strategi Regresi Modeling" Harrell. Dia menyebutkan (tetapi hanya secara sepintas meskipun dia mengutip beberapa makalahnya sendiri) membangun spline sesuai dengan skala waktu untuk memodelkan bahaya berbentuk bak mandi. Babnya tentang model survival parametrik menjelaskan berbagai teknik merencanakan untuk memeriksa asumsi bahaya proporsional dan untuk memeriksa linearitas dari perkiraan dampak bahaya log pada skala waktu.
Sunting: Opsi tambahan adalah menggunakan
coxph
parameter 'tt' yang dijelaskan sebagai "daftar opsional fungsi transformasi waktu."sumber
check <- cox.zph(fit1); print(check); plot(check, resid=F)
seperti dalam pengaturan Anda memberi plot informatif waktu "efek". Apakah maksud Anda cph () yang berasal dari paket rms atau coxph dari survival?Saya telah mengubah jawaban untuk ini karena jawaban @ DWin atau @ Zach tidak sepenuhnya menjawab bagaimana memodelkan koefisien yang bervariasi waktu. Saya baru saja menulis posting tentang ini. Inilah intinya.
Saat mengizinkan subjek masuk pada titik waktu lain, kita harus mengubah
Surv
dariSurv(time, status)
menjadiSurv(start_time, end_time, status)
. Sementaraend_time
sangat berkorelasi dengan hasil,start_time
sekarang tersedia sebagai istilah interaksi (seperti yang disarankan dalam saran asli). Dalam pengaturan reguler,start_time
is 0 kecuali untuk beberapa subjek yang muncul kemudian tetapi kami membagi setiap pengamatan menjadi beberapa periode, kami tiba-tiba memiliki banyak waktu mulai yang tidak nol. Satu-satunya perbedaan adalah bahwa setiap pengamatan terjadi beberapa kali di mana semua kecuali pengamatan terakhir memiliki opsi untuk hasil yang tidak disensor.Pemecahan waktu dalam praktik
Saya baru saja menerbitkan di CRAN paket Greg yang membuat pembagian waktu ini mudah. Pertama kita mulai dengan beberapa pengamatan teoretis:
Kami dapat menampilkan ini secara grafis dengan * menjadi indikator acara:
Jika kami menerapkan
timeSplitter
sebagai berikut:Kami mendapatkan yang berikut ini:
Seperti yang Anda lihat, setiap objek telah dipecah menjadi beberapa peristiwa di mana rentang waktu terakhir berisi status peristiwa aktual. Ini memungkinkan kami untuk sekarang membangun model yang memiliki
:
istilah interaksi sederhana (jangan gunakan*
saat ini diperluastime + var + time:var
dan kami tidak tertarik pada waktu per se). Tidak perlu menggunakanI()
fungsi meskipun jika Anda ingin memeriksa nonlinier dengan waktu saya sering membuat variabel interaksi waktu yang terpisah yang saya tambahkan spline dan kemudian menampilkan menggunakanrms::contrast
. Bagaimanapun, panggilan regresi Anda sekarang akan terlihat seperti ini:Menggunakan
tt
fungsi paket survivalAda juga cara untuk memodelkan koefisien tergantung waktu secara langsung dalam paket survival menggunakan
tt
fungsi. Prof. Therneau memberikan pengantar menyeluruh untuk subjek dalam sketsa nya . Sayangnya dalam dataset besar hal ini sulit dilakukan karena keterbatasan memori. Tampaknyatt
fungsi tersebut membagi waktu menjadi bagian-bagian yang sangat halus menghasilkan dalam proses matriks besar.sumber
Anda dapat menggunakan fungsi apply.rolling di PerformanceAnalytics untuk menjalankan regresi linier melalui jendela bergulir, yang akan memungkinkan koefisien Anda bervariasi dari waktu ke waktu.
Sebagai contoh:
Ini berfungsi dengan fungsi lain juga.
sumber