Bahaya baseline Cox

19

Katakanlah saya memiliki kumpulan data "kateter ginjal". Saya mencoba memodelkan kurva bertahan hidup menggunakan model Cox. Jika saya mempertimbangkan model Cox: saya perlu perkiraan bahaya awal. Dengan menggunakan fungsi paket R bawaan , saya dapat dengan mudah melakukannya seperti ini:

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

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

Tetapi jika saya ingin menulis fungsi selangkah demi selangkah dari bahaya baseline untuk perkiraan parameter tertentu, bbagaimana saya bisa melanjutkan? Saya mencoba:

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)

Tetapi ini tidak memberikan hasil yang sama dengan basehaz(fit). Apa masalahnya?

Dihan
sumber
@ung, bisakah Anda membantu dengan pertanyaan ini ? Saya berjuang selama beberapa hari ...
Haitao Du

Jawaban:

21

Rupanya, basehaz()sebenarnya menghitung tingkat bahaya kumulatif, bukan tingkat bahaya itu sendiri. Rumusnya adalah sebagai berikut: dengan mana menunjukkan waktu acara yang berbeda, adalah jumlah acara di , dan adalah risiko yang ditetapkan pada mengandung semua individu yang masih rentan terhadap kejadian di .

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)

Ayo coba ini. (Kode berikut hanya untuk ilustrasi dan tidak dimaksudkan untuk ditulis dengan sangat baik.)

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

output parsial:

       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

Saya menduga bahwa sedikit perbedaan mungkin karena perkiraan kemungkinan parsial coxph()karena ikatan dalam data ...

okram
sumber
Terima kasih banyak. Ya, ada sedikit perbedaan untuk metode aproksimasi. Tetapi ada 76 titik waktu dengan ikatan, jika saya ingin menemukan garis dasar bahaya untuk setiap titik waktu. Apa yang dapat saya? Apa jenis modifikasi dalam kode R yang diperlukan?
Dihan
1
Bahaya yang didiskritisasi adalah nol, kecuali pada waktu-waktu kejadian. Ini memang memberikan kontribusi terbesar pada kemungkinan jika fungsi bahaya diskrit diduga. Anda mungkin ingin melakukan interpolasi di antara dua perkiraan dengan asumsi, misalnya, bahwa bahaya tetap konstan.
ocram
Method of Breslow (1974)
tomka
kidney$time >= y[l]ystatus=0status=1d=2d=1status=0
Seperti @tomka sebutkan. Mengganti coxphpanggilan dengan fit<-coxph(Surv(time, status)~age, data=kidney, method="breslow")akan memperbaiki perbedaan dalam metode.
mr.bjerre