อันตรายพื้นฐานของ Cox


20

สมมติว่าฉันมีชุดข้อมูล "สายสวนไต" ฉันกำลังพยายามสร้างโมเดลกราฟความอยู่รอดโดยใช้โมเดล Cox หากฉันพิจารณาโมเดล Cox:ฉันต้องมีการประเมินความเป็นอันตรายพื้นฐาน ด้วยการใช้ฟังก์ชั่นแพคเกจ R ฉันสามารถทำสิ่งนี้ได้อย่างง่ายดาย:

ชั่วโมง(เสื้อ,Z)=ชั่วโมง0ประสบการณ์('Z),
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)แต่นี้ไม่ได้ให้ผลเช่นเดียวกับ อะไรคือปัญหา?


@gung คุณสามารถช่วยคำถามนี้ได้ไหม? ฉันพยายามสองสามวัน ...
Haitao Du

คำตอบ:


22

เห็นได้ชัดว่าbasehaz()จริงคำนวณอัตราความเป็นอันตรายสะสมมากกว่าอัตราความเสี่ยงของตัวเอง สูตรมีดังนี้: พร้อม โดยที่แสดงเวลาเหตุการณ์ที่แตกต่างกันคือจำนวนของกิจกรรมที่และเป็นชุดที่มีความเสี่ยงที่มีบุคคลทั้งหมดยังคงอ่อนแอต่อเหตุการณ์ที่{(L)}เอช 0(Y(L))=d(L)

H^0(เสื้อ)=ΣY(ล.)เสื้อชั่วโมง^0(Y(ล.)),
ชั่วโมง^0(Y(ล.))=d(ล.)ΣJR(Y(ล.))ประสบการณ์(xJ'β)
Y(1)<Y(2)<d(ล.)Y(ล.)R(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
Dihan

1
อันตรายที่ไม่เปิดเผยนั้นเป็นศูนย์ยกเว้นในบางครั้ง สิ่งนี้จะช่วยให้เกิดความเป็นไปได้ที่ใหญ่ที่สุดหากมีการคาดคะเนฟังก์ชันอันตรายโดยสิ้นเชิง คุณอาจต้องการแก้ไขระหว่างประมาณการสองข้อใด ๆ ที่สมมติว่าอันตรายยังคงที่
ocram

วิธีการของ Breslow (1974)
tomka

ฉันต้องทราบปัญหาบางอย่างกับการใช้งานนี้ ใช้kidney$time >= y[l]สามารถทำงานเป็นปัญหาเชิงตัวเลขเมื่อเวลาเป็นตัวเลขเนื่องจากการจัดระเบียบในการสร้างYนอกจากนี้วิธีที่คุณกำหนดชุดความเสี่ยงของคุณนั้นไม่ถูกต้องเพราะหากมีการสังเกตสองครั้งหนึ่งต่อหนึ่งกับหนึ่งแล้วแต่โค้ดของคุณให้เนื่องจากคุณไม่รวมการสังเกตทั้งหมด ปัญหาหลังใช้จำนวนความสัมพันธ์ที่สูงขึ้นเช่นเดียวกัน Ystatus=0status=1d=2d=1status=0
tomka

ตามที่ @tomka พูดถึง การแทนที่การcoxphโทรด้วยfit<-coxph(Surv(time, status)~age, data=kidney, method="breslow")จะแก้ไขความแตกต่างในวิธีการ
mr.bjerre
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.