Gráfico de previsão diferente de sobrevivência coxph e rms cph


9

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 packagemas 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 ?e0 0

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:

cph () termplot2

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:

coxph () termplot2

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:

Gráfico de treliça

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:

O gráfico de contraste

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.


3
Vários comentários. Leia primeiro biostat.mc.vanderbilt.edu/Rrms para obter diferenças entre os pacotes rms e Design. Segundo, use plot () em vez de plot.Predict para economizar trabalho. Terceiro, você pode facilmente gerar gráficos para ambos os sexos, por exemplo, usando Predict (ajuste, idade, sexo, diversão = exp) # exp = anti-log; depois plot (resultado) ou plot (resultado, ~ idade | sexo). Você não usa "x = NA" no Predict. O rms usa gráficos de treliça, de modo que os parâmetros par graphics comuns e o mfrow não se aplicam. Veja exemplos no folheto do meu curso rms em biostat.mc.vanderbilt.edu/rms . Para contrast.rms, estude mais a documentação.
— precisa

11
Muito obrigado pela sua contribuição. Atualizei o código com melhores exemplos e adicionei prof. A resposta de Thernau. PS Eu estou realmente animado que o seu planejando uma nova versão do livro, ampliando a seção de viés ponto de corte será muito útil como uma referência
— Max Gordon

11
Você pode usar plote em contrastvez de plot.Predicte contrast.rms. Eu usaria byou lengthdentro, em seqvez de, timese daria contrastduas listas para que você especifique exatamente o que está sendo contrastado. Você também pode usar sombreamento com xYplotfaixas de confiança.
— Frank Harrell

11
Obrigado. Prever porque, então, recebo a ajuda certa no RStudio - algo que, no meu caso, é muito mais vital do que o tempo necessário para escrever o nome completo da função (usando o preenchimento automático (guia), na verdade não perder tanto tempo).
— Max

Respostas:


5

Eu acho que definitivamente deveria haver um ponto em que o intervalo de confiança é de largura zero. Você também pode tentar uma terceira maneira, que é usar apenas funções rms. Há um exemplo no arquivo de ajuda para contrast.rms para obter um gráfico de taxa de risco. Começa com o comentário # show estimativas separadas por tratamento e sexo. Você precisará anti-log para obter a proporção.


11
Obrigado pela sua resposta. Você acha que eu deveria mencionar esse problema ao prof. Terry Therneau, se é para ser considerado um erro / má interpretação? Também examinei as soluções gráficas no pacote rms, não consigo entender direito o uso de contrast.rms para plotagens. O plot.Predict parece produzir um resultado semelhante ao termplot, mas não consigo fazer exatamente o que quero ... veja minha atualização para a pergunta.
— Max

2
Seria bom escrever para ele para perguntar e agradecer a viagem ao aeroporto que ele me deu há alguns minutos. Vou comentar acima sobre as outras perguntas.
— precisa
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.