कॉक्स बेसलाइन खतरा


20

मान लीजिए कि मेरे पास "किडनी कैथेटर" डेटा सेट है। मैं कॉक्स मॉडल का उपयोग करके उत्तरजीविता वक्र बनाने की कोशिश कर रहा हूं। अगर मैं एक कॉक्स मॉडल पर विचार करें: मैं आधारभूत खतरा के अनुमान की जरूरत है। अंतर्निहित पैकेज आर फ़ंक्शन का उपयोग करके , मैं इसे आसानी से इस तरह कर सकता हूं:

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)। समस्या क्या है?


क्या आप इस प्रश्न में मदद कर सकते हैं ? मैंने कुछ दिनों तक संघर्ष किया ...
डू

जवाबों:


22

basehaz()

एच^0(टी)=Σy(एल)टी^0(y(एल)),
^0(y(एल))=(एल)Σजेआर(y(एल))exp(एक्सजे'β)
y(1)<y(2)<(एल)y(एल)आर(y(एल))y(एल)y(एल)

चलो यह करके देखें। (निम्नलिखित कोड केवल चित्रण के लिए है और बहुत अच्छी तरह से लिखे जाने का इरादा नहीं है।)

#------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)
टॉमका

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.