Peligro de referencia de Cox

19

Digamos que tengo un conjunto de datos de "catéter renal". Estoy tratando de modelar una curva de supervivencia usando un modelo de Cox. Si considero un modelo de Cox: necesito la estimación del riesgo de referencia. Al usar la función integrada del paquete R , puedo hacerlo fácilmente de esta manera:

h(t,Z)=h0 0Exp(siZ),
survivalbasehaz()
library(survival)

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

Pero si quiero escribir una función paso a paso del peligro de la línea de base para una estimación dada del parámetro, b¿cómo puedo proceder? Lo intenté:

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)

Pero esto no da el mismo resultado que basehaz(fit). ¿Cuál es el problema?

Dihan
fuente
@gung, ¿podrías ayudarme con esta pregunta ? Luché por un par de días ...
Haitao Du

Respuestas:

21

Aparentemente, en basehaz()realidad calcula una tasa de riesgo acumulativo, en lugar de la tasa de riesgo en sí. La fórmula es la con h 0 ( y ( l ) ) = d ( l )

H^0 0(t)=y(l)th^0 0(y(l)),
dondey(1)<y(2)<denotan los tiempos de eventos distintos,d(l)es el número de eventos eny(l), yR(y(l))es el riesgo establecido eny(l)
h^0 0(y(l))=re(l)jR(y(l))Exp(Xjβ)
y(1)<y(2)<re(l)y(l)R(y(l))y(l)que contiene todos los individuos aún susceptibles al evento en .y(l)

Intentemos esto. (El siguiente código está ahí solo a modo ilustrativo y no está destinado a estar muy bien escrito).

#------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))

salida parcial:

       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

Sospecho que la ligera diferencia podría deberse a la aproximación de la probabilidad parcial coxph()debido a lazos en los datos ...

ocram
fuente
Muchas gracias. Sí, hay una ligera diferencia para el método de aproximación. Pero hay 76 puntos de tiempo con vínculos, si quiero encontrar el riesgo de referencia para cada punto de tiempo. ¿Que puedo hacer? ¿Qué tipo de modificación se necesita en el código R?
Dihan
1
El riesgo discretizado es cero, excepto en los momentos del evento. De hecho, esto proporciona la mayor contribución a la probabilidad si se supone una función de peligro discreta. Es posible que desee interpolar entre dos estimados, suponiendo, por ejemplo, que el peligro se mantiene constante.
ocram
Método de Breslow (1974)
tomka
kidney$time >= y[l]ystatus=0status=1re=2re=1status=0
Como mencionó @tomka. Reemplazar la coxphllamada con fit<-coxph(Surv(time, status)~age, data=kidney, method="breslow")solucionará la diferencia en los métodos.
Sr. bjerre