Pericolo basale di Cox


19

Diciamo che ho un set di dati "catetere renale". Sto cercando di modellare una curva di sopravvivenza usando un modello Cox. Se considero un modello Cox: ho bisogno della stima del rischio di base. Utilizzando la funzione pacchetto R integrata , posso facilmente farlo in questo modo:

h(t,Z)=h0exp(bZ),
survivalbasehaz()
library(survival)

data(kidney)
fit <- coxph(Surv(time, status) ~ age , kidney)
basehaz(fit)

Ma se voglio scrivere una funzione passo-passo del rischio di base per una determinata stima del parametro, bcome posso procedere? Provai:

bhaz <- function(beta, time, status, x) {

    data <- data.frame(time,status,x)
    data <- data[order(data$time), ]
    dt   <- data$time
    k    <- length(dt)
    risk <- exp(data.matrix(data[,-c(1:2)]) %*% beta)
    h    <- rep(0,k)

    for(i in 1:k) {
        h[i] <- data$status[data$time==dt[i]] / sum(risk[data$time>=dt[i]])          
    }

    return(data.frame(h, dt))
}

h0 <- bhaz(fit$coef, kidney$time, kidney$status, kidney$age)

Ma questo non dà lo stesso risultato di basehaz(fit). Qual è il problema?


@gung potresti aiutarmi con questa domanda ? Ho lottato per un paio di giorni ...
Haitao Du

Risposte:


21

basehaz()

H^0(t)=y(l)th^0(y(l)),
h^0(y(l))=d(l)ΣjR(y(l))exp(Xj'β)
y(1)<y(2)<d(l)y(l)R(y(l))y(l)y(l)

Proviamo questo. (Il codice seguente è solo a scopo illustrativo e non è destinato a essere scritto molto bene.)

#------package------
library(survival)

#------some data------
data(kidney)

#------preparation------
tab <- data.frame(table(kidney[kidney$status == 1, "time"])) 
y <- as.numeric(levels(tab[, 1]))[tab[, 1]] #ordered distinct event times
d <- tab[, 2]                               #number of events

#------Cox model------
fit<-coxph(Surv(time, status)~age, data=kidney)

#------cumulative hazard obtained from basehaz()------
H0 <- basehaz(fit, centered=FALSE)
H0 <- H0[H0[, 2] %in% y, ] #only keep rows where events occurred

#------my quick implementation------
betaHat <- fit$coef

h0 <- rep(NA, length(y))
for(l in 1:length(y))
{
  h0[l] <- d[l] / sum(exp(kidney[kidney$time >= y[l], "age"] * betaHat))
}

#------comparison------
cbind(H0, cumsum(h0))

uscita parziale:

       hazard time cumsum(h0)
1  0.01074980    2 0.01074980
5  0.03399089    7 0.03382306
6  0.05790570    8 0.05757756
7  0.07048941    9 0.07016127
8  0.09625105   12 0.09573508
9  0.10941921   13 0.10890324
10 0.13691424   15 0.13616338

Ho il sospetto che la leggera differenza potrebbe essere dovuta all'approssimazione della probabilità parziale coxph()dovuta a legami nei dati ...


Molte grazie. Sì, ci sono lievi differenze per il metodo di approssimazione. Ma ci sono 76 punti temporali con legami, se voglio trovare il rischio di base per ogni punto temporale. Cosa posso fare? Che tipo di modifica è necessaria nel codice R?
Dihan,

1
Il pericolo discretizzato è zero, tranne che in occasione di eventi. Questo in effetti dà il maggior contributo alla probabilità se si suppone una funzione di rischio discreta. Potresti voler interpolare tra due stime qualsiasi, supponendo, ad esempio, che il pericolo rimanga costante.
ocram,

Method of Breslow (1974)
tomka,

kidney$time >= y[l]ystatus=0status=1d=2d=1status=0

Come menzionato @tomka. La sostituzione della coxphchiamata con fit<-coxph(Surv(time, status)~age, data=kidney, method="breslow")risolverà la differenza nei metodi.
mr.bjerre,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.