Danger de base de Cox

19

Disons que j'ai un ensemble de données «cathéter rénal». J'essaie de modéliser une courbe de survie en utilisant un modèle de Cox. Si je considère un modèle de Cox: j'ai besoin de l'estimation du danger de base. En utilisant la fonction intégrée du package R , je peux facilement le faire comme ceci:

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

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

Mais si je veux écrire une fonction étape par étape du danger de base pour une estimation donnée du paramètre, bcomment puis-je procéder? J'ai essayé:

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)

Mais cela ne donne pas le même résultat que basehaz(fit). Quel est le problème?

Dihan
la source
@gung pourriez-vous aider avec cette question ? J'ai eu du mal pendant quelques jours ...
Haitao Du

Réponses:

21

Apparemment, basehaz()calcule en fait un taux de risque cumulé, plutôt que le taux de risque lui-même. La formule est la suivante: avec où désignent les temps d'événement distincts, est le nombre d'événements à et est le risque fixé à contenant tous les individus encore sensibles à l'événement à .

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

Essayons ça. (Le code suivant est uniquement à titre d'illustration et n'est pas destiné à être très bien écrit.)

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

sortie partielle:

       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

Je soupçonne que la légère différence pourrait être due à l'approximation de la probabilité partielle en coxph()raison de liens dans les données ...

ocram
la source
Merci beaucoup. Oui, il existe une légère différence pour la méthode d'approximation. Mais il y a 76 points temporels avec des liens, si je veux trouver le danger de base pour chaque point temporel. Que puis-je faire? Quel type de modification dans le code R est nécessaire?
Dihan
1
Le danger discrétisé est nul, sauf aux moments des événements. Cela donne en effet la plus grande contribution à la probabilité si une fonction de risque discrète est supposée. Vous pouvez souhaiter interpoler entre deux estimations quelconques en supposant, par exemple, que le danger reste constant.
ocram
Méthode de Breslow (1974)
tomka
kidney$time >= y[l]ystatus=0status=1=2=1status=0
Comme l'a mentionné @tomka. Remplacer l' coxphappel par fit<-coxph(Surv(time, status)~age, data=kidney, method="breslow")fixera la différence de méthodes.
mr.bjerre