Cox nguy hiểm cơ bản


19

Giả sử tôi có bộ dữ liệu "ống thông thận". Tôi đang cố gắng mô hình hóa đường cong sinh tồn bằng mô hình Cox. Nếu tôi xem xét mô hình Cox: tôi cần ước tính về rủi ro cơ bản. Bằng cách sử dụng chức năng gói R tích hợp , tôi có thể dễ dàng làm như thế này:

h(t,Z)= =h0điểm kinh nghiệm(b'Z),
survivalbasehaz()
library(survival)

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

Nhưng nếu tôi muốn viết một chức năng từng bước của mối nguy cơ bản cho một ước tính tham số nhất định, blàm thế nào tôi có thể tiến hành? Tôi đã thử:

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)

Nhưng điều này không cho kết quả tương tự như basehaz(fit). Vấn đề là gì?


@gung bạn có thể giúp với câu hỏi này ? Tôi đã vật lộn trong vài ngày ...
Haitao Du

Câu trả lời:


21

Rõ ràng, basehaz()thực sự tính toán tỷ lệ rủi ro tích lũy, chứ không phải là tỷ lệ rủi ro chính nó. Công thức như với h 0 ( y ( l ) ) = d ( l )

H^0(t)= =Σy(tôi)th^0(y(tôi)),
y(1)<y(2)<biểu thị thời gian sự kiện riêng biệt,d(l)là số sự kiện tạiy(l), vàR(y(l))là rủi ro được đặt ởy(l)
h^0(y(tôi))= =d(tôi)ΣjR(y(tôi))điểm kinh nghiệm(xj'β)
y(1)<y(2)<d(tôi)y(tôi)R(y(tôi))y(tôi)chứa tất cả các cá nhân vẫn dễ bị sự kiện tại .y(tôi)

Chúng ta hãy cố gắng này. (Đoạn mã sau chỉ có để minh họa và không có ý định viết rất tốt.)

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

đầu ra một phần:

       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

Tôi nghi ngờ rằng sự khác biệt nhỏ có thể là do sự gần đúng của khả năng một phần coxph()do mối quan hệ trong dữ liệu ...


Cảm ơn rất nhiều. Có, có một chút khác biệt cho phương pháp gần đúng. Nhưng có 76 điểm thời gian có mối quan hệ, nếu tôi muốn tìm mối nguy cơ bản cho mọi thời điểm. Tôi có thể làm gì? Những loại sửa đổi trong mã R là cần thiết?
Dihan

1
Các nguy cơ rời rạc là bằng không, ngoại trừ tại các thời điểm sự kiện. Điều này thực sự mang lại sự đóng góp lớn nhất cho khả năng nếu một chức năng nguy hiểm riêng biệt được cho là. Bạn có thể muốn nội suy giữa bất kỳ hai ước tính nào, ví dụ, giả định rằng mối nguy hiểm không đổi.
ocram

Phương pháp Breslow (1974)
tomka 27/2/2017

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

Như @tomka đã đề cập. Thay thế coxphcuộc gọi bằng fit<-coxph(Surv(time, status)~age, data=kidney, method="breslow")sẽ khắc phục sự khác biệt trong các phương thức.
mr.bjerre
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.