考克斯基线危险


19

假设我有一个“肾脏导管”数据集。我正在尝试使用Cox模型为生存曲线建模。如果我考虑一个Cox模型:需要估计基准危害。通过使用内置的包R函数,我可以轻松地做到这一点:

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)。问题是什么?


@gung您可以帮助解决这个问题吗?我挣扎了几天...
Haitao Du

Answers:


21

显然,basehaz()实际上是计算累积危险率,而不是危险率本身。公式如下: 带有 ,其中表示不同的事件时间,是的事件数,和是风险组在包含仍然容易受到在该事件的所有个人。 ħ 0Ý=d

H^0(t)=y(l)th^0(y(l)),
ý1<Ý2<dÝ- [R Ýýÿ
H^0ÿ=dĴ[Rÿ经验值XĴβ
ÿ1个<ÿ2<dÿ[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))

部分输出:

       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


我需要注意此实现的一些问题。kidney$time >= y[l]由于创建的列表,在时间为数字时,使用可能会遇到数字问题。此外,定义风险集的方法是不准确的,因为如果存在两个观察值的并列关系,一个与,一个与,则但是您的代码给出因为您排除了所有观察。后一个问题同样适用于更多的领带。d = 2 d = 1ÿstatus=0status=1d=2d=1个status=0
tomka '17

正如@tomka提到的。用替换coxph调用fit<-coxph(Surv(time, status)~age, data=kidney, method="breslow")将解决方法上的差异。
比耶尔先生
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.