¿Cómo interpretar la salida de predic.coxph?

17

Después de instalar un modelo cox, es posible hacer predicciones y recuperar el riesgo relativo de nuevos datos. Lo que no entiendo es cómo se calcula el riesgo relativo para un individuo y a qué se relaciona (es decir, el promedio de la población). ¿Alguna recomendación sobre recursos para ayudar a entender (no he avanzado mucho en el análisis de supervivencia, así que cuanto más simple, mejor)

usuario4673
fuente

Respuestas:

32

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 0(t)miβ1X1++βpagXpag=h0 0(t)miXβyoyo y X i ' es por lo tanto independiente del riesgo de referencia e independiente del tiempot:XyoXit

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 .yoyosi1,...,sipagβ1,...,βpageXibmiXyosi

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 referenceopción que se explica en la página de ayuda.

lince
fuente
2
¡+1 porque no es obvio obtener lo que predic.coxph hace exactamente desde la página de ayuda!
ocram
¡eso fue genial! Muy simple de entender!
user4673
meanFin <- mean(as.numeric(Rossi$fin) - 1)No tiene mucho sentido, ya que fines categórico. ¿No necesitas hacerlo modeFin <- get_Mode(Rossi$fin)en este caso?
Zhubarb
1
@Zhubarb fines 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 que predict.coxph()hace.
caracal
En palabras, ¿cómo interpretaría una razón de riesgo de 3.01 (por ejemplo, relRisk [2])?
RNB