ねこすたっと

ねこの気持ちと統計について悩む筆者の備忘録的ページ。

生存時間解析にまつわる関数のおさらい

生存時間の解析方法を読んでいると色々な関数が登場するので、関係性含めて自分のために整理しておきたい。 登場する関数を日本語で整理すると次のとおり。

  •  f(t):あるイベントが発生するまでの時間tの確率密度関数(probability density function, pdf)。時間[a,b)のにイベントが発生する確率はこの区間のf(t)の曲線下面積(図1)。
  •  F(t):累積分布関数(cumulative distribution function, cdf)。累積イベント発生関数(cumulative incidence function, CIF)と呼ばれることもある。開始時点から時点tまでのf(t)の曲線下面積(図2)
  •  S(t):生存関数(survival function)。ある時点tまでイベントを発生しない確率。
  •  h(t):ハザード関数(hazard function)。ある時点tまでイベントを発生しなかった人が次の瞬間イベントを発生する確率密度。
  •  H(t):累積ハザード関数(cumulative hazard function)。ある時点tまで蓄積したハザード。

図1:確率密度関数

図2:確率密度関数(上)と累積イベント発生関数の関係(下)

関数同士の関係式

定義

関係性をそれぞれの関数ごとにまとめる前に、それぞれの関数の定義を確認(定義なので常に正しい)。

 
\begin{aligned}
F(t) &= \int_0^t f(s) ds \\
S(t) &= 1 - F(t) \\
h(t) &= \lim_{\delta→0} \frac{P(t \leq T < t+\delta | T \geq t)}{\delta} \\
H(t) &= \int_0^t h(s) ds
\end{aligned}

前述の日本語を数式で書いただけ。

ハザード関数

前述のハザード関数の定義から、

 
\begin{aligned}
h(t) &= \lim_{\delta→0} \frac{P(t \leq T < t+\delta | T \geq t)}{\delta} \\
&= \lim_{\delta→0} \frac{P(t \leq T < t+\delta)}{\delta}\frac{1}{P(T \geq t)} \\
&= \frac{f(t)}{S(t)}
\end{aligned}

となる(前半の極限の部分は時点tにおける確率密度なのでf(t)となることを確認)。

ここで、F(t)を微分したらf(t)になるので、

 
\begin{aligned}
f(t) = \frac{d}{dt}F(t) = \frac{d}{dt}(1-S(t)) = - \frac{d}{dt}S(t)
\end{aligned}

これを使ってハザード関数を変形すると、

 
\begin{aligned}
h(t) = - \frac{S'(t)}{S(t)} = - \frac{d}{dt} \ln S(t)
\end{aligned}

となる( \frac{d}{dt}S(t)=S'(t)と書いた)。これでハザード関数と生存関数が繋がったことになる。

ちなみに最後の変形は

 
\begin{aligned}
\frac{d}{dt} \ln(x) &= \frac{1}{x} \\
\frac{d}{dt} f(g(x)) &= f'(g(x))g'(x)
\end{aligned}

の公式で導かれる(読んでいる方には不要だと思いますが...)

累積ハザード関数

微分が入ってる状態はまだ扱いにくいだろ、ということで、前述のh(t)とS(t)の関係式の両辺を積分して、

 
\begin{aligned}
H(t) = - \ln S(t)
\end{aligned}

となるので、対数を指数にかえてやれば、

 
\begin{aligned}
S(t) = e^{- H(t)}
\end{aligned}

となる。

さらに S(t)=1-F(t)として両辺を微分すると、

 
\begin{aligned}
-f(t) &= \frac{d}{dt}(-H(t))e^{- H(t)} \\
f(t) &= h(t)e^{- H(t)} \\
&=h(t)S(t)
\end{aligned}

となる、ってh(t)の定義を式変形しただけじゃん!

ハザード関数・累積ハザード関数を使う理由

解釈上の利点

  • ハザードは「ある時点まで生存している」ことを条件としているので、時点tまで生存している人の予後を推測したいときにはf(t)よりも分かりやすい。
  • ただ実際には「ハザード(rate)」は「瞬間発生割合(instanteneous risk)」として解釈されている(んだと思う)。

解析上の利点

  • 生存時間解析では打ち切りがあるので、その時点ごとにat risk患者数が変わる。At risk患者数は「その時点までイベントを発生しなかった」という条件が含まれるので、ハザードで扱う方がやりやすい(多分)。
  • またh(t)の方が、生存時間の分布よりも変化がゆっくりなので、モデリングしやすい(多分)。
  • ちなみに、一度は聞いたことある"Kaplan-Meier"は生存関数を推定する方法。累積ハザード関数は"Nelson-Aalen"という方法で推定する。両者とも打ち切りの独立性(independent censoring)を仮定していて、使う情報は同じ。

競合リスクがあるときに生じる問題

f(t)=h(t)S(t)なので、両辺を積分すると、

 
\begin{aligned}
F(t) = \int_0^t h(s)S(s)ds
\end{aligned}

となる。右辺は累積発生関数(CIF)。

競合リスクがあると、S(t)が複数のハザード関数 h_1(t), h_2(t),...で決まることになるので、ハザード関数と累積発生関数が一対一対応ではなくなる。つまり、"rate"を"instaneous risk"として解釈することが適切でなくなる。

そうすると、(適切な方法を取らなければ)ハザード関数から正しい累積発生関数を得られなくなるので、「ある時点でどれくらい発生するのか」がうまく予測できなくなる。

解析上の扱いやすさから、生存時間のモデル化はハザード関数を通じて行われることが普通だった。でも競合リスクがあると上記の問題が生じるため、累積発生関数をモデル化する方がいい場合がある(flexible risk regressionの話に続く)。

おわりに

  • 記念すべき50個目の記事です。100とか200とか書いている人はどんなバイタリティなんでしょうか...。更新頻度を落として、息切れしないように頑張ります。

参考資料