11 votos

Gráfico de predicción diferente de la supervivencia coxph y rms cph

He creado mi propia versión ligeramente mejorada del termplot que utilizo en este ejemplo, puedes encontrarlo aquí . Ya he publicado anteriormente en SO pero cuanto más lo pienso, creo que esto probablemente esté más relacionado con la interpretación del modelo de riesgos proporcionales de Cox que con la codificación real.

El problema

Cuando miro un gráfico de Hazard Ratio espero tener un punto de referencia donde el intervalo de confianza sea naturalmente 0 y este es el caso cuando uso el cph() del rms package pero no cuando uso el coxph() del survival package . ¿Es correcto el comportamiento de coxph() y si es así cuál es el punto de referencia? Además, la variable ficticia en coxph() tiene un intervalo y el valor es distinto de $e^0$ ?

Ejemplo

Aquí está mi código de prueba:

# Load libs
library(survival)
library(rms)

# Regular survival
survobj <- with(lung, Surv(time,status))

# Prepare the variables
lung$sex <- factor(lung$sex, levels=1:2, labels=c("Male", "Female"))
labels(lung$sex) <- "Sex"
labels(lung$age) <- "Age"

# The rms survival
ddist <- datadist(lung)
options(datadist="ddist")
rms_surv_fit <- cph(survobj~rcs(age, 4)+sex, data=lung, x=T, y=T)

Las parcelas cph

Este código:

termplot2(rms_surv_fit, se=T, rug.type="density", rug=T, density.proportion=.05,
          se.type="polygon", yscale="exponential", log="y", 
          xlab=c("Age", "Sex"), 
          ylab=rep("Hazard Ratio", times=2),
          main=rep("cph() plot", times=2),
          col.se=rgb(.2,.2,1,.4), col.term="black")

da esta trama:

cph() termplot2

Las parcelas coxph

Este código:

termplot2(surv_fit, se=T, rug.type="density", rug=T, density.proportion=.05, 
          se.type="polygon", yscale="exponential", log="y", 
          xlab=c("Age", "Sex"), 
          ylab=rep("Hazard Ratio", times=2),
          main=rep("coxph() plot", times=2),
          col.se=rgb(.2,.2,1,.4), col.term="black")

da esta trama:

coxph() termplot2

Actualización

Como @Frank Harrell sugirió y después de ajustar a lo largo de la sugerencia en su reciente comentario que tengo:

p <- Predict(rms_surv_fit, age=seq(50, 70, times=20), 
             sex=c("Male", "Female"), fun=exp)
plot.Predict(p, ~ age | sex,
             col="black",
             col.fill=gray(seq(.8, .75, length=5)))

Esto le dio a esta trama muy agradable:

Lattice plot

He vuelto a mirar el contrast.rms después del comentario y he probado este código que ha dado una gráfica... aunque probablemente se pueda hacer mucho más :-)

w <- contrast.rms(rms_surv_fit, 
                  list(sex=c("Male", "Female"), 
                       age=seq(50, 70, times=20)))

xYplot(Cbind(Contrast, Lower, Upper) ~ age | sex, 
       data=w, method="bands")

Dio esta parcela:

The contrast plot

ACTUALIZACIÓN 2

El profesor Thernau tuvo la amabilidad de comentar la falta de confianza en las parcelas:

Los splines de suavizado en coxph, al igual que los de gam, están normalizados de modo que sum(prediction) =0. Así que no tengo un punto fijo para para el cual la varianza es extra pequeña.

Aunque todavía no estoy familiarizado con la GAM, esto parece responder a mi pregunta: esto parece ser una cuestión de interpretación.

5 votos

Varios comentarios. En primer lugar, leer biostat.mc.vanderbilt.edu/Rrms para las diferencias entre los paquetes rms y Design. En segundo lugar, utilice plot() en lugar de plot.Predict para ahorrar trabajo. Tercero, puede generar fácilmente gráficos para ambos sexos, por ejemplo, usando Predict(fit, age, sex, fun=exp) # exp=anti-log; luego plot(result) o plot(result, ~ age | sex). No se utiliza "x=NA" en Predict. rms utiliza gráficos de rejilla, por lo que no se aplican los parámetros habituales de gráficos de par y mfrow. Vea los ejemplos en el manual de mi curso de rms en biostat.mc.vanderbilt.edu/rms . Para contrastar.rms estudia más la documentación.

1 votos

Muchas gracias por tu aportación. He actualizado el código con mejores ejemplos y he añadido la respuesta del prof. Thernau. PS Estoy muy emocionado de que su planificación de una nueva versión del libro, la ampliación de la sección de sesgo de punto de corte será muy útil como referencia

1 votos

Puede utilizar plot y contrast en lugar de plot.Predict y contrast.rms . Yo usaría by o length dentro de seq en lugar de times y daría contrast dos listas para especificar exactamente lo que se está contrastando. También puede utilizar el sombreado con xYplot para las bandas de confianza.

6voto

dan90266 Puntos 609

Creo que debería haber un punto en el que el intervalo de confianza sea de ancho cero. También puede intentar una tercera forma que es utilizar únicamente las funciones rms. Hay un ejemplo en el archivo de ayuda para contrast.rms para obtener un gráfico de hazard ratio. Comienza con el comentario # mostrar estimaciones separadas por tratamiento y sexo. Tendrá que antilogarizar para obtener la proporción.

1 votos

Gracias por su respuesta. ¿Cree que debería mencionar este problema al prof. Terry Therneau si es que se debe considerar como un error/malinterpretación? También he mirado las soluciones gráficas del paquete rms, no puedo entender el uso de contrast.rms para los plots. El plot.Predict parece hacer una salida similar al termplot pero no puedo conseguir que haga exactamente lo que quiero... ver mi actualización a la pregunta.

5 votos

Sería bueno escribirle para preguntarle, y darle las gracias por el viaje al aeropuerto que me dio hace unos minutos. Ya comentaré más arriba las otras preguntas.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X