Ho creato la mia versione leggermente migliorata del termplot che uso in questo esempio, puoi trovarla qui . Ho precedentemente pubblicato su SO, ma più ci penso e credo che ciò sia probabilmente più correlato all'interpretazione del modello di rischi proporzionali di Cox che alla codifica effettiva.
Il problema
Quando guardo un diagramma Hazard Ratio mi aspetto di avere un punto di riferimento in cui l'intervallo di confidenza è naturalmente 0 e questo è il caso quando uso cph () dal rms package
ma non quando uso coxph () da survival package
. Il comportamento corretto è di coxph () e in caso affermativo qual è il punto di riferimento? Inoltre, la variabile fittizia nel coxph () ha un intervallo e il valore è diverso da ?
Esempio
Ecco il mio codice di prova:
# 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)
La trama dei cph
Questo codice:
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")
dà questa trama:
Le trame del coxph
Questo codice:
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")
dà questa trama:
Aggiornare
Come suggerito da @Frank Harrell e dopo aver adattato il suggerimento nel suo recente commento, ho ottenuto:
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)))
Questo ha dato questa trama molto bella:
Ho guardato contrast.rms di nuovo dopo il commento e ho provato questo codice che ha dato una trama ... anche se probabilmente c'è molto di più che si può fare :-)
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")
Ha dato questa trama:
AGGIORNAMENTO 2
Il prof. Thernau è stato così gentile da commentare la mancanza di confidenza di una vita:
Le spline di smoothing in coxph, come quelle in gam, sono normalizzate in modo tale che la somma (previsione) = 0. Quindi non ho un singolo punto fisso per il quale la varianza è molto piccola.
Anche se non ho ancora familiarità con GAM, questo sembra rispondere alla mia domanda: questo sembra essere un problema di interpretazione.
plot
e contrast
invece di plot.Predict
e contrast.rms
. Vorrei usare by
o length
dentro seq
invece times
e darei contrast
due elenchi in modo da specificare esattamente cosa viene contrapposto. Puoi anche usare l'ombreggiatura con xYplot
per le bande di confidenza.