Coxベースラインハザード


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はこの質問を手伝ってくれますか?私は...日のカップルのための苦労
ハイタオ・ドゥ

回答:


21

どうやら、basehaz()実際にはハザード率自体ではなく、累積ハザード率を計算します。以下の式である H 0Y L = D L

H^0t=ylth^0yl
、Y1<Y2<示す異なるイベント時間、Dlはにおけるイベントの数であるYL、およびRYLがにおけるリスク・セットであるYL
h^0yl=dljRylexpバツjβ
y1<y2<dlylRylylイベントにまだ影響を受けやすいすべての個人を含む。y(l)

これを試してみましょう。(次のコードは説明のためだけにあり、あまりよく書かれたものではありません。)

#------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
イベント時を除き、離散ハザードはゼロです。離散ハザード関数が想定される場合、これは確かに尤度への最大の寄与を与えます。たとえば、ハザードが一定であると仮定して、2つの推定値の間を補間することができます。
ocram


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

@tomkaが述べたように。coxph呼び出しを置き換えるfit<-coxph(Surv(time, status)~age, data=kidney, method="breslow")と、メソッドの違いが修正されます。
mr.bjerre
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.