Saya ingin membuat data survival mainan (waktu untuk acara) yang disensor dengan benar dan mengikuti distribusi dengan bahaya proporsional dan bahaya baseline konstan.
Saya membuat data sebagai berikut, tetapi saya tidak dapat memperoleh estimasi rasio bahaya yang mendekati nilai sebenarnya setelah menyesuaikan model bahaya proporsional Cox dengan data yang disimulasikan.
Apa kesalahan yang telah aku perbuat?
Kode R:
library(survival)
#set parameters
set.seed(1234)
n = 40000 #sample size
#functional relationship
lambda=0.000020 #constant baseline hazard 2 per 100000 per 1 unit time
b_haz <-function(t) #baseline hazard
{
lambda #constant hazard wrt time
}
x = cbind(hba1c=rnorm(n,2,.5)-2,age=rnorm(n,40,5)-40,duration=rnorm(n,10,2)-10)
B = c(1.1,1.2,1.3) # hazard ratios (model coefficients)
hist(x %*% B) #distribution of scores
haz <-function(t) #hazard function
{
b_haz(t) * exp(x %*% B)
}
c_hf <-function(t) #cumulative hazards function
{
exp(x %*% B) * lambda * t
}
S <- function(t) #survival function
{
exp(-c_hf(t))
}
S(.005)
S(1)
S(5)
#simulate censoring
time = rnorm(n,10,2)
S_prob = S(time)
#simulate events
event = ifelse(runif(1)>S_prob,1,0)
#model fit
km = survfit(Surv(time,event)~1,data=data.frame(x))
plot(km) #kaplan-meier plot
#Cox PH model
fit = coxph(Surv(time,event)~ hba1c+age+duration, data=data.frame(x))
summary(fit)
cox.zph(fit)
Hasil:
Call:
coxph(formula = Surv(time, event) ~ hba1c + age + duration, data = data.frame(x))
n= 40000, number of events= 3043
coef exp(coef) se(coef) z Pr(>|z|)
hba1c 0.236479 1.266780 0.035612 6.64 3.13e-11 ***
age 0.351304 1.420919 0.003792 92.63 < 2e-16 ***
duration 0.356629 1.428506 0.008952 39.84 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
exp(coef) exp(-coef) lower .95 upper .95
hba1c 1.267 0.7894 1.181 1.358
age 1.421 0.7038 1.410 1.432
duration 1.429 0.7000 1.404 1.454
Concordance= 0.964 (se = 0.006 )
Rsquare= 0.239 (max possible= 0.767 )
Likelihood ratio test= 10926 on 3 df, p=0
Wald test = 10568 on 3 df, p=0
Score (logrank) test = 11041 on 3 df, p=0
tetapi nilai true ditetapkan sebagai
B = c(1.1,1.2,1.3) # hazard ratios (model coefficients)
survival
cox-model
monte-carlo
stats_newb
sumber
sumber
Jawaban:
Tidak jelas bagi saya bagaimana Anda menghasilkan waktu acara Anda (yang, dalam kasus Anda, mungkin ) dan indikator acara:<0
Jadi di sini adalah metode generik, diikuti oleh beberapa kode R.
Menghasilkan waktu bertahan hidup untuk mensimulasikan model bahaya proporsional Cox
Untuk menghasilkan waktu kejadian dari model bahaya proporsional, kita dapat menggunakan metode probabilitas terbalik (Bender et al., 2005) : jika seragam pada dan jika adalah fungsi survival bersyarat yang berasal dari model bahaya proporsional, yaitu maka itu adalah fakta bahwa variabel acak memiliki fungsi survivalV (0,1) S(⋅|x)
Contoh [Bahaya garis dasar Weibull]
Biarkan dengan bentuk dan skala . Kemudian dan . Mengikuti metode probabilitas terbalik, realisasi diperoleh dengan menghitung dengan variasi yang seragam pada . Dengan menggunakan hasil pada transformasi variabel acak, orang mungkin memperhatikan bahwa memiliki distribusi Weibull bersyarat (diberikanh0(t)=λρtρ−1 ρ>0 λ>0 H0(t)=λtρ T∼S(⋅H−10(t)=(tλ)1ρ t = ( - log ( v )T∼S(⋅|x) v(0,1)Txρλexp(x′β)
Kode r
Fungsi R berikut menghasilkan set data dengan kovariat biner tunggal (misalnya indikator perawatan). Bahaya garis dasar memiliki bentuk Weibull. Waktu sensor diambil secara acak dari distribusi eksponensial.x
Uji
Berikut ini beberapa simulasi cepat dengan :β=−0.6
sumber
flexsurvreg(Surv(time, status) ~ x, data=dat, dist = "weibull")
data simulasi yang sama, koefisien muncul sebagai0.6212
. Kenapa ini?Untuk distribusi Weibull,e−(λ∗e(x∗β)∗t)ρ
S (t) =
" " hanya untuk log (v)(1/rho)
jadi, saya modifikasi seperti ini
jika rho = 1, hasilnya akan sama.
sumber