วิธีการตีความผลลัพธ์ของการทำนาย.coxph?


17

หลังจากติดตั้ง coxmodel เป็นไปได้ที่จะคาดการณ์และดึงความเสี่ยงสัมพัทธ์ของข้อมูลใหม่ สิ่งที่ฉันไม่เข้าใจคือวิธีคำนวณความเสี่ยงสัมพัทธ์สำหรับบุคคลและสิ่งที่สัมพันธ์กับ (เช่นค่าเฉลี่ยของประชากร) คำแนะนำใด ๆ สำหรับทรัพยากรที่จะช่วยให้เข้าใจ (ฉันไม่ได้ก้าวหน้ามากในการวิเคราะห์การเอาชีวิตรอด

คำตอบ:


32

predict.coxph()คำนวณอัตราส่วนอันตรายเทียบกับค่าเฉลี่ยตัวอย่างสำหรับตัวแปรทำนายทั้งหมด ปัจจัยจะถูกแปลงเป็นตัวคาดการณ์แบบจำลองตามปกติซึ่งสามารถคำนวณค่าเฉลี่ยได้ จำได้ว่าโมเดล Cox PH เป็นโมเดลเชิงเส้นสำหรับอันตรายจากการบันทึกln h ( t ) :plnh(t)

lnh(t)=lnh0(t)+β1X1++βpXp=lnh0(t)+Xβ

เมื่อเป็นอันตรายพื้นฐานที่ไม่ระบุ เท่าที่อันตรายต่อชั่วโมง( T )เป็นแบบจำลองเป็นชั่วโมง( T ) = H 0 ( T ) อีβ 1 X 1 + + β พี X P = H 0 ( T ) อีเอ็กซ์ β อัตราส่วนอันตรายระหว่างคนสองคนฉันและฉัน'ที่มีค่าทำนายh0(t)h(t)h(t)=h0(t)eβ1X1++βpXp=h0(t)eXβiiXi and Xi is thus independent of the baseline hazard and independent of time t:

hi(t)hi(t)=h0(t)eXiβh0(t)eXiβ=eXiβeXiβ

สำหรับอัตราส่วนอันตรายประมาณระหว่างบุคคลและฉัน'เราเพียงแค่เสียบอยู่ในประมาณการค่าสัมประสิทธิ์1 , ... , Pสำหรับβ 1 , ... , β พีให้อีเอ็กซ์ฉันและอีเอ็กซ์ฉัน'iib1,,bpβ1,,βpeXibeXib

เป็นตัวอย่างใน R ฉันใช้ข้อมูลจากภาคผนวกของ John Fox ในโมเดล Cox-PHซึ่งมีข้อความเกริ่นนำที่ดีมาก อันดับแรกเราดึงข้อมูลและสร้างแบบจำลอง Cox-PH แบบง่ายสำหรับการจับกุมนักโทษที่ถูกปล่อยตัว ( fin: ปัจจัย - ได้รับความช่วยเหลือทางการเงินด้วยการเข้ารหัสแบบจำลอง"no"-> 0, "yes"-> 1 age,: อายุเมื่อถึงเวลาปล่อยตัวprio: จำนวนความเชื่อมั่นก่อนหน้า):

> URL   <- "http://socserv.mcmaster.ca/jfox/Books/Companion/data/Rossi.txt"
> Rossi <- read.table(URL, header=TRUE)                  # our data
> Rossi[1:3, c("week", "arrest", "fin", "age", "prio")]  # looks like this
  week arrest fin age prio
1   20      1  no  27    3
2   17      1  no  18    8
3   25      1  no  19   13

> library(survival)                                      # for coxph()    
> fitCPH <- coxph(Surv(week, arrest) ~ fin + age + prio, data=Rossi)    # Cox-PH model
> (coefCPH <- coef(fitCPH))                              # estimated coefficients
     finyes         age        prio 
-0.34695446 -0.06710533  0.09689320 

eXb

meanFin  <- mean(as.numeric(Rossi$fin) - 1)   # average of financial aid dummy
    meanAge  <- mean(Rossi$age)                   # average age
meanPrio <- mean(Rossi$prio)                  # average number of prior convictions
rMean <- exp(coefCPH["finyes"]*meanFin        # e^Xb
           + coefCPH["age"]   *meanAge
           + coefCPH["prio"]  *meanPrio)

eXb

r1234 <- exp(coefCPH["finyes"]*(as.numeric(Rossi[1:4, "fin"])-1)
           + coefCPH["age"]   *Rossi[1:4, "age"]
           + coefCPH["prio"]  *Rossi[1:4, "prio"])

ตอนนี้คำนวณความเสี่ยงสำหรับครั้งแรก 4 predict.coxph()คนกับกลุ่มตัวอย่างเฉลี่ยและเปรียบเทียบกับการส่งออกจาก

> r1234 / rMean
[1] 1.0139038 3.0108488 4.5703176 0.7722002

> relRisk <- predict(fitCPH, Rossi, type="risk")   # relative risk
> relRisk[1:4]
        1         2         3         4 
1.0139038 3.0108488 4.5703176 0.7722002

หากคุณมีโมเดลแบบแบ่งชั้นการเปรียบเทียบpredict.coxph()นั้นเทียบกับค่าเฉลี่ยของชั้นข้อมูลสิ่งนี้สามารถควบคุมได้ผ่านreferenceตัวเลือกที่อธิบายไว้ในหน้าวิธีใช้


2
+1 เนื่องจากไม่ชัดเจนว่าจะได้รับสิ่งที่คาดการณ์ไว้ oxox ทำจากหน้าช่วยเหลืออย่างแน่นอน!
ocram

มันเยี่ยมมาก! ง่ายมากที่จะเข้าใจ!
4673

meanFin <- mean(as.numeric(Rossi$fin) - 1)ไม่สมเหตุสมผลมากเนื่องจากfinเป็นหมวดหมู่ คุณไม่จำเป็นต้องทำmodeFin <- get_Mode(Rossi$fin)ในกรณีนี้?
Zhubarb

1
@Zhubarb finเป็นเลขฐานสองดังนั้นการแสดงตัวเลขของปัจจัยเพียงแค่มีค่า 1 และ 2 การลบ 1 ทำให้เรามีตัวแปรจำลองที่เข้ารหัสด้วยค่า 0 และ 1 ที่ปรากฏในเมทริกซ์การออกแบบ โปรดทราบว่าสิ่งนี้จะไม่ทำงานสำหรับปัจจัยที่มีมากกว่า 2 ระดับ เป็นที่ถกเถียงกันอย่างแน่นอนว่าค่าเฉลี่ยของตัวแปรหุ่นมีเหตุผล แต่นั่นคือสิ่งที่predict.coxph()ทำ
caracal

คุณจะตีความอัตราส่วนความเป็นอันตรายที่ 3.01 อย่างไร (เช่น relRisk [2])
RNB
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.