Criei minha própria versão ligeiramente aprimorada do termplot que utilizo neste exemplo, você pode encontrá-la aqui . Eu publiquei anteriormente no SO, mas quanto mais penso nisso, acredito que isso provavelmente esteja mais relacionado à interpretação do modelo de riscos proporcionais de Cox do que com a codificação real.
O problema
Quando eu olho para um gráfico de Hazard Ratio, espero ter um ponto de referência em que o intervalo de confiança naturalmente seja 0 e este é o caso quando eu uso o cph () do rms package
mas não quando eu uso o coxph () do survival package
. O comportamento correto é de coxph () e, em caso afirmativo, qual é o ponto de referência? Além disso, a variável dummy no coxph () tem um intervalo e o valor é diferente de ?
Exemplo
Aqui está o meu código de teste:
# 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)
As plotagens 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")
dá esse enredo:
Os gráficos 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")
dá esse enredo:
Atualizar
Como o @Frank Harrell sugeriu e depois de ajustar a sugestão em seu comentário recente, recebi:
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)))
Isso deu esse enredo muito legal:
Eu olhei para o contrast.rms novamente após o comentário e tentei esse código que deu uma plotagem ... embora provavelmente haja muito mais que possa ser feito :-)
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")
Deu este lote:
ATUALIZAÇÃO 2
Thernau teve a gentileza de comentar sobre a falta de confiança na trama:
Os splines de suavização em coxph, como os de gam, são normalizados para que soma (previsão) = 0. Portanto, não tenho um único ponto fixo para o qual a variação é muito pequena.
Embora eu ainda não esteja familiarizado com o GAM, isso parece responder à minha pergunta: isso parece ser uma questão de interpretação.
plot
e em contrast
vez de plot.Predict
e contrast.rms
. Eu usaria by
ou length
dentro, em seq
vez de, times
e daria contrast
duas listas para que você especifique exatamente o que está sendo contrastado. Você também pode usar sombreamento com xYplot
faixas de confiança.