He creado mi propia versión ligeramente mejorada del termplot que uso en este ejemplo, puedes encontrarla aquí . 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 diagrama de Hazard Ratio, espero tener un punto de referencia donde el intervalo de confianza es naturalmente 0 y este es el caso cuando uso el cph () de rms package
pero no cuando uso el coxph () de survival package
. ¿Es correcto el comportamiento de coxph () y, de ser así, cuál es el punto de referencia? Además, la variable ficticia en el coxph () tiene un intervalo y el valor es diferente de ?
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 tramas de 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:
Las tramas de 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:
Actualizar
Como sugirió @Frank Harrell y después de ajustar la sugerencia en su reciente comentario, obtuve:
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 dio esta muy buena trama:
Miré el contrast.rms nuevamente después del comentario e intenté este código que dio una trama ... aunque probablemente hay mucho más que se puede hacer :-)
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 trama:
ACTUALIZACIÓN 2
El profesor Thernau tuvo la amabilidad de comentar sobre la falta de confianza de la trama:
Las splines de suavizado en coxph, como las de gam, se normalizan de modo que sum (predicción) = 0. Por lo tanto, no tengo un único punto fijo para el cual la varianza es muy pequeña.
Aunque todavía no estoy familiarizado con GAM, esto parece responder a mi pregunta: esto parece ser un problema de interpretación.
plot
y en contrast
lugar de plot.Predict
y contrast.rms
. Usaría by
o length
dentro de en seq
lugar de times
y daría contrast
dos listas para que especifique exactamente lo que se está contrastando. También puede usar sombreado con xYplot
bandas de confianza.