Como interpretar a saída de predict.coxph?

17

Depois de ajustar um coxmodel, é possível fazer previsões e recuperar o risco relativo de novos dados. O que não entendo é como o risco relativo é calculado para um indivíduo e o que é relativo (ou seja, a média da população)? Alguma recomendação de recursos para ajudar a entender (eu não sou muito avançado na análise de sobrevivência, portanto, quanto mais simples, melhor)?

user4673
fonte

Respostas:

32

predict.coxph()calcula a taxa de risco relativa à média da amostra para todas as variáveis ​​preditoras de p . Os fatores são convertidos em preditores fictícios, como de costume, cuja média pode ser calculada. Lembre-se de que o modelo Cox PH é um modelo linear para o risco log emh(t) :

emh(t)=emh0 0(t)+β1X1++βpXp=emh0 0(t)+Xβ

Onde é o risco de linha de base não especificado. De forma equivalente, o perigo de h ( t ) é modelado como h ( t ) = h 0 ( t ) e β 1 X 1 + + β p X p = h 0 ( t ) e X β . A taxa de risco entre duas pessoas i e i ' com valores de previsãoh0(t)h(t)h(t)=h0(t)eβ1X1++βpXp=h0(t)eXβii e X i ' são, portanto, independentes do risco de linha de base e do tempot:XiXit

hi(t)hi(t)=h0(t)eXiβh0(t)eXiβ=eXiβeXiβ

Para a taxa de risco estimada entre as pessoas e i ' , basta inserir as estimativas do coeficiente b 1 , ... , b p para o β 1 , ... , β p , fornecendo e X i b e e X i b .iib1,,bpβ1,,βpeXibeXib

Como exemplo em R, uso os dados do apêndice de John Fox no modelo Cox-PH, que fornece um texto introdutório muito bom. Primeiro, buscamos os dados e construímos um modelo simples de Cox-PH para o tempo de prisão dos presos libertados ( fin: fator - recebemos ajuda financeira com codificação fictícia "no"-> 0, "yes"-> 1 age,: idade no momento da libertação, prio: número de condenações anteriores):

> URL   <- "http://socserv.mcmaster.ca/jfox/Books/Companion/data/Rossi.txt"
> Rossi <- read.table(URL, header=TRUE)                  # our data
> Rossi[1:3, c("week", "arrest", "fin", "age", "prio")]  # looks like this
  week arrest fin age prio
1   20      1  no  27    3
2   17      1  no  18    8
3   25      1  no  19   13

> library(survival)                                      # for coxph()    
> fitCPH <- coxph(Surv(week, arrest) ~ fin + age + prio, data=Rossi)    # Cox-PH model
> (coefCPH <- coef(fitCPH))                              # estimated coefficients
     finyes         age        prio 
-0.34695446 -0.06710533  0.09689320 

Agora, inserimos as médias de amostra de nossos preditores na fórmula :eXb

meanFin  <- mean(as.numeric(Rossi$fin) - 1)   # average of financial aid dummy
    meanAge  <- mean(Rossi$age)                   # average age
meanPrio <- mean(Rossi$prio)                  # average number of prior convictions
rMean <- exp(coefCPH["finyes"]*meanFin        # e^Xb
           + coefCPH["age"]   *meanAge
           + coefCPH["prio"]  *meanPrio)

Agora, inserimos os valores preditores das 4 primeiras pessoas na fórmula .eXb

r1234 <- exp(coefCPH["finyes"]*(as.numeric(Rossi[1:4, "fin"])-1)
           + coefCPH["age"]   *Rossi[1:4, "age"]
           + coefCPH["prio"]  *Rossi[1:4, "prio"])

Agora calcule o risco relativo para as primeiras 4 pessoas em relação à média da amostra e compare com a saída de predict.coxph().

> r1234 / rMean
[1] 1.0139038 3.0108488 4.5703176 0.7722002

> relRisk <- predict(fitCPH, Rossi, type="risk")   # relative risk
> relRisk[1:4]
        1         2         3         4 
1.0139038 3.0108488 4.5703176 0.7722002

Se você possui um modelo estratificado, a comparação predict.coxph()é em comparação com as médias de estratos, isso pode ser controlado através da referenceopção explicada na página de ajuda.

caracal
fonte
2
+1 porque não é óbvio para obter exatamente o que o forecast.coxph faz na página de ajuda!
Ocram
isso foi ótimo! Muito simples de entender!
user4673
meanFin <- mean(as.numeric(Rossi$fin) - 1)não faz muito sentido, pois finé categórico. Você não precisa modeFin <- get_Mode(Rossi$fin)neste caso?
Zhubarb
1
O @Zhubarb finé binário, portanto, a representação numérica do fator apenas possui os valores 1 e 2. A subtração 1 nos fornece a variável codificada por dummy com os valores 0 e 1 que também aparece na matriz de design. Observe que isso não funcionará para fatores com mais de 2 níveis. Certamente é discutível se a média de variáveis ​​dummy faz sentido, mas é isso que predict.coxph()faz.
Caracal
Em palavras, como você interpretaria uma taxa de risco de 3,01 (por exemplo, relRisk [2])?
RNB 23/09