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?


@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 ...


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.