predict.coxph()
calcula la razón de riesgo en relación con el promedio de la muestra para todas las variables predictoras . Los factores se convierten en predictores ficticios como de costumbre, cuyo promedio se puede calcular. Recuerde que el modelo Cox PH es un modelo lineal para el log-hazard ln h ( t ) :plnh(t)
lnh(t)=lnh0(t)+β1X1+⋯+βpXp=lnh0(t)+Xβ
Donde es el peligro inicial no especificado. De manera equivalente, el peligro h ( t ) se modela como h ( t ) = h 0 ( t ) ⋅ e β 1 X 1 + ⋯ + β p X p = h 0 ( t ) ⋅ e X β . La razón de riesgo entre dos personas i e i ' con valores predictoresh0(t)h(t)h(t)=h0(t)⋅eβ1X1+ ⋯+βpXpag=h0( t ) ⋅eX βyoyo′ y X i ' es por lo tanto independiente del riesgo de referencia e independiente del tiempot:XyoXi′t
hi(t)hi′(t)=h0(t)⋅eXiβh0(t)⋅eXi′β=eXiβeXi′β
Para la razón de riesgo estimada entre las personas e i ′ , simplemente conectamos los coeficientes estimados b 1 , ... , b p para el β 1 , ... , β p , dando e X i b y e X i ′ b .yoyo′si1, ... , bpagβ1, ... , βpageXibmiXyo′si
Como ejemplo en R, utilizo los datos del apéndice de John Fox en el modelo Cox-PH que proporciona un texto introductorio muy agradable. Primero, buscamos los datos y construimos un modelo simple de Cox-PH para el tiempo de arresto de prisioneros liberados ( fin
: factor - recibió ayuda financiera con codificación ficticia "no"
-> 0, "yes"
-> 1 age
,: edad al momento de la liberación, prio
: número de condenas anteriores):
> URL <- "http://socserv.mcmaster.ca/jfox/Books/Companion/data/Rossi.txt"
> Rossi <- read.table(URL, header=TRUE) # our data
> Rossi[1:3, c("week", "arrest", "fin", "age", "prio")] # looks like this
week arrest fin age prio
1 20 1 no 27 3
2 17 1 no 18 8
3 25 1 no 19 13
> library(survival) # for coxph()
> fitCPH <- coxph(Surv(week, arrest) ~ fin + age + prio, data=Rossi) # Cox-PH model
> (coefCPH <- coef(fitCPH)) # estimated coefficients
finyes age prio
-0.34695446 -0.06710533 0.09689320
Ahora conectamos los promedios de muestra para nuestros predictores en la fórmula :eXb
meanFin <- mean(as.numeric(Rossi$fin) - 1) # average of financial aid dummy
meanAge <- mean(Rossi$age) # average age
meanPrio <- mean(Rossi$prio) # average number of prior convictions
rMean <- exp(coefCPH["finyes"]*meanFin # e^Xb
+ coefCPH["age"] *meanAge
+ coefCPH["prio"] *meanPrio)
Ahora conectamos los valores predictores de las primeras 4 personas en la fórmula .eXb
r1234 <- exp(coefCPH["finyes"]*(as.numeric(Rossi[1:4, "fin"])-1)
+ coefCPH["age"] *Rossi[1:4, "age"]
+ coefCPH["prio"] *Rossi[1:4, "prio"])
Ahora calcule el riesgo relativo para las primeras 4 personas contra el promedio de la muestra y compárelo con el resultado de predict.coxph()
.
> r1234 / rMean
[1] 1.0139038 3.0108488 4.5703176 0.7722002
> relRisk <- predict(fitCPH, Rossi, type="risk") # relative risk
> relRisk[1:4]
1 2 3 4
1.0139038 3.0108488 4.5703176 0.7722002
Si tiene un modelo estratificado, la comparación predict.coxph()
es con los promedios de estratos, esto se puede controlar a través de la reference
opción que se explica en la página de ayuda.
meanFin <- mean(as.numeric(Rossi$fin) - 1)
No tiene mucho sentido, ya quefin
es categórico. ¿No necesitas hacerlomodeFin <- get_Mode(Rossi$fin)
en este caso?fin
es binario, por lo que la representación numérica del factor solo tiene los valores 1 y 2. Restar 1 nos da la variable codificada ficticia con valores 0 y 1 que también aparece en la matriz de diseño. Tenga en cuenta que esto no funcionará para factores con más de 2 niveles. Ciertamente es discutible si promediar variables ficticias tiene sentido, pero eso es lo quepredict.coxph()
hace.