Deseo crear un dato de supervivencia de juguetes (tiempo hasta el evento) que esté correctamente censurado y siga alguna distribución con riesgos proporcionales y un riesgo de referencia constante.
Creé los datos de la siguiente manera, pero no puedo obtener las razones de riesgo estimadas que están cerca de los valores verdaderos después de ajustar un modelo de riesgos proporcionales de Cox a los datos simulados.
¿Qué hice mal?
Códigos 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)
Resultados:
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
pero los valores verdaderos se establecen como
B = c(1.1,1.2,1.3) # hazard ratios (model coefficients)
survival
cox-model
monte-carlo
stats_newb
fuente
fuente
Respuestas:
No tengo claro cómo genera los tiempos de su evento (que, en su caso, podría ser ) e indicadores de eventos:<0
Entonces, aquí hay un método genérico, seguido de algún código R.
Generando tiempos de supervivencia para simular modelos de riesgos proporcionales de Cox
Para generar tiempos de eventos a partir del modelo de riesgos proporcionales, podemos usar el método de probabilidad inversa (Bender et al., 2005) : si es uniforme en y si es la función de supervivencia condicional derivada del modelo de riesgos proporcionales, es decir, entonces es un hecho que la variable aleatoria tiene la función de supervivencia( 0 , 1 ) S ( ⋅V (0,1) S(⋅|x)
Ejemplo [peligro de referencia de Weibull]
Deje con forma y escala . Entonces y . Siguiendo el método de probabilidad inversa, se obtiene una realización de calculando con una variable uniforme en . Usando resultados en transformaciones de variables aleatorias, uno puede notar que tiene una distribución condicional de Weibull (dadah0(t)=λρtρ−1 ρ>0 λ>0 H0(t)=λtρ H−10(t)=(tλ)1ρ T∼S(⋅|x)
Código R
La siguiente función R genera un conjunto de datos con una sola covariable binaria (por ejemplo, un indicador de tratamiento). El peligro de la línea de base tiene forma de Weibull. Los tiempos de censura se extraen aleatoriamente de una distribución exponencial.x
Prueba
Aquí hay una simulación rápida con :β=−0.6
fuente
flexsurvreg(Surv(time, status) ~ x, data=dat, dist = "weibull")
los mismos datos simulados, el coeficiente aparece como0.6212
. ¿Por qué es esto?Para la distribución de Weibull,e−(λ∗e(x∗β)∗t)ρ
S (t) =
" " será solo para log (v)(1/rho)
así que modifiqué así
si rho = 1, el resultado será el mismo.
fuente