Основна небезпека Кокса


20

Скажімо, у мене є набір даних "нирковий катетер". Я намагаюся моделювати криву виживання за допомогою моделі Кокса. Якщо я розглядаю модель Кокса: мені потрібна оцінка базової небезпеки. Використовуючи вбудовану функцію пакета R , я легко можу це зробити так:

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

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

Але якщо я хочу написати покрокову функцію базової небезпеки для заданої оцінки параметра, bяк я можу діяти? Я намагався:

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)

Але це не дає такого ж результату, як basehaz(fit). В чому проблема?


@gung, чи можете ви допомогти у цьому питанні ? Я боровся пару днів ...
Хайтао,

Відповіді:


22

Мабуть, basehaz()насправді обчислюється кумулятивна ступінь небезпеки, а не сама небезпека. Формула виглядає наступним чином з ч 0 ( у ( л ) ) = d ( л )

H^0(t)=y(l)th^0(y(l)),
деy(1)<y(2)<позначають різні події часу,d(l)- кількість подій уy(l), аR(y(l))- ризик, встановлений у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)

Спробуємо це. (Наступний код існує лише для ілюстрації і не має бути дуже добре написаним.)

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

частковий вихід:

       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

Я підозрюю, що незначна різниця може бути пов'язана з наближенням часткової ймовірності coxph()через зв’язки в даних ...


Дуже дякую. Так, для методу наближення є незначна різниця. Але є 76 часових точок із зв’язками, якщо я хочу знайти базову небезпеку для кожного моменту часу. Що я можу зробити? Який тип зміни в R-коді потрібен?
Діхан

1
Загроза дискретизації дорівнює нулю, крім випадків події. Це дійсно дає найбільший внесок у ймовірність, якщо передбачається дискретна функція небезпеки. Ви можете інтерполювати між будь-якими двома оцінками, припускаючи, наприклад, що небезпека залишається постійною.
окрам

Метод Бреслоу (1974)
tomka

kidney$time >= y[l]уstatus=0status=1г=2г=1status=0

Як згадував @tomka. Заміна coxphвиклику на fit<-coxph(Surv(time, status)~age, data=kidney, method="breslow")виправить різницю в методах.
mr.bjerre
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.