Cox temel tehlike


20

Diyelim ki bir "böbrek kateter" veri setim var. Bir Cox modeli kullanarak bir hayatta kalma eğrisi modellemeye çalışıyorum. Bir Cox modeli düşünürsem: temel tehlike tahminine ihtiyacım var. Yerleşik paket R işlevini kullanarak, bunu kolayca yapabilirim:

h(t,Z)=h0tecrübe(b'Z),
survivalbasehaz()
library(survival)

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

Fakat belirli bir parametre tahmini için temel tehlikenin adım adım fonksiyonunu yazmak istersem bnasıl devam edebilirim? Denedim:

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)

Ancak bu, aynı sonucu vermez basehaz(fit). Sorun nedir?


@gung bu soruya yardımcı olabilir misiniz ? Birkaç gün mücadele ettim ...
Haitao Du

Yanıtlar:


22

Görünüşe göre, basehaz()aslında tehlike oranının kendisinden ziyade kümülatif bir tehlike oranı hesaplar. Formül aşağıdaki gibi ile saat 0 ( y ( l ) ) = D ( l )

'H^0(t)=Σy(l)th^0(y(l)),
buraday(1)<y(2)<farklı olay zamanlarını gösterir,d(l)y(l) 'deki olay sayısını ifade eder, veR,(y(l))risk grubu olany(l)
h^0(y(l))=d(l)ΣjR,(y(l))tecrübe(xj'β)
y(1)<y(2)<d(l)y(l)R,(y(l))y(l) de olaya hâlâ duyarlı olan tüm bireyleri içeren .y(l)

Hadi bunu deneyelim. (Aşağıdaki kod yalnızca açıklama amaçlıdır ve çok iyi yazılmış olması amaçlanmamıştır.)

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

kısmi çıktı:

       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

Küçük bir farkın coxph(), verilerdeki bağlar nedeniyle kısmi olasılığın yaklaşmasından kaynaklanabileceğinden şüpheleniyorum ...


Çok teşekkürler. Evet, yaklaşım yöntemi için küçük bir fark vardır. Ama eğer her zaman noktası için temel tehlike bulmak istiyorsam, bağları olan 76 zaman noktası vardır. Ne yapabilirim? R kodunda ne tür bir modifikasyon gereklidir?
Dihan

1
Olay zamanları hariç, ihtiyari tehlike sıfırdır. Bu, ayrı bir tehlike fonksiyonunun varsayılması olasılığına en büyük katkıyı verir. Örneğin, tehlikenin sabit kaldığını varsayarak iki tahmin arasında enterpolasyon yapmak isteyebilirsiniz.
ocram

Breslow Yöntemi (1974)
tomka

kidney$time >= y[l]ystatus=0status=1d=2d=1status=0

@ Tomka'nın belirttiği gibi. coxphÇağrıyı değiştirmek, fit<-coxph(Surv(time, status)~age, data=kidney, method="breslow")yöntemlerdeki farkı düzeltir.
mr.bjerre
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.