Исходная опасность Кокса


19

Допустим, у меня есть набор данных «почечный катетер». Я пытаюсь смоделировать кривую выживания, используя модель Кокса. Если я рассматриваю модель Кокса: мне нужна оценка базовой опасности. Используя встроенную функцию пакета R , я легко могу сделать это так:

h(T,Z)знак равночас0ехр(б'Z),
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 Не могли бы вы помочь с этим вопросом ? Я боролся в течение нескольких дней ...
Haitao Du

Ответы:


21

basehaz()

ЧАС^0(T)знак равноΣY(L)Tчас^0(Y(L)),
час^0(Y(L))знак равноd(L)ΣJр(Y(L))ехр(ИксJ'β)
Y(1)<Y(2)<d(L)Y(L)р(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 необходим?
Dihan

1
Дискретная опасность равна нулю, за исключением времени события. Это действительно дает наибольший вклад в вероятность, если предполагается дискретная функция опасности. Возможно, вы захотите интерполировать любые две оценки, предполагая, например, что опасность остается постоянной.
Октябрь

Метод Бресего (1974)
Томка

kidney$time >= y[l]Ystatus=0status=1dзнак равно2dзнак равно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.