Syleir’s note

2020.4.1より統計検定やE資格の勉強の進捗を報告しています。統計検定準1級、E資格、G検定取得しました!当ブログへのリンクはご自由にどうぞ。

MENU

カプランマイヤー曲線の作成(打ち切りのない場合)【Part4】【統計検定1級、凖1級対策】

1. はじめに

前回の記事はこちらです。
syleir.hatenablog.com
前回は、生存関数、ハザード関数とは何か、どのように計算するのかをいくつかの例題を交えながら説明したのでした。
今回は、カプランマイヤー曲線の作成に主眼を置きながら解説していきたいと思います。
今回のパートでは打ち切りのない場合でカプランマイヤー曲線の作成ができるようになることが目標です。
なお、打ち切りについては次回説明しますが、打ち切りによって不完全な情報のデータが生まれるという理解をしてください。
つまり、今回は完全なデータでカプランマイヤー曲線を作ることが目標です。

本稿では

これらの本から統計検定対策として必要十分なように要約、加筆しています。
わからないところがあれば原著にあたってみてください。

3. 生存時間解析の目的

そもそもカプランマイヤー曲線は生存時間解析の一分野です。Part2でも述べたように、生存時間解析の主眼は、どれくらいの時間が経過した状態で、どれだけの人が生存しているかという生存数-時間関係の解析でした。
そこで生存関数S(t)を導入し、生存関数S(t)は時刻t超えて生存する確率を見ることで、時間と生存数の関係性を視覚的に理解することが可能になります。

4. カプランマイヤー曲線とは

誤解を招くことを承知で簡易化すると、実際のデータから作った生存曲線のことです。

通常、モデリングで使用する生存関数は例えば前のPartで説明したようにy = exp(-x)のように「綺麗な」関数を用いることが多いです。

生存関数の一例


しかし、実際の解析では実際のデータから生存関数を推定したいというモチベーションが強いです。
その際に最もよく使われるのが「カプランマイヤー推定量を用いて生存曲線を作成する「カプランマイヤー法」であり、これにより作られた生存曲線が「カプランマイヤー曲線」です。
用語が複雑ですが、ここはそんなもんという雑な理解で大丈夫です。追って説明します。
離散的な実際のデータから推定される曲線は、通常ステップ関数の形を取ります。

実際のデータから推定される生存曲線の例

生存時間解析において、観察期間外にイベントが起きていること打ち切りと言います。厳密にはもう少し勉強するべきことがありますが、これを話すと1章必要なのでいずれ番外編で書きます。
打ち切りが起きたデータは生存時間解析において特別な扱いが必要となります。
カプランマイヤー法はこの打ち切りデータを考慮に入れた生存関数の推定を可能にします。

5. 打ち切りのない場合

簡単のためにまず、打ち切りがない場合を考えます。

t イベント発生数 生存数 生存率
0 0 5 1
1 2 3 0.6
2 0 3 0.6
3 0 3 0.6
4 1 2 0.4
5 1 1 0.2
6 0 1 0.2

非常に簡単な例ですが、これの生存関数を推定しようと思った場合、生存率を点推定値としてグラフを書いてみたらよいという、自然な発想があります。このようになります。

とりあえずプロットしてみる

ところで、知りたいのは生存"関数"である以上、離散的でなく、連続的に定義されてほしい性質があります。イベントが起きていない間の推定はどうしたら良いでしょうか。

ここは、色んな推定の考えがあって良いところだと思います。
・点と点を直線で結び、折れ線にする
・最小2乗法のように曲線をフィッティングする
など、案としてはありうると思いますが、今回は説明の便宜上、その点から次のイベントが起きるまで右に伸ばして補完することにします。
また、t = 1 などの境界域では実際のイベントを反映した後の値を反映することにします。つまり上のグラフのプロットの値を優先することにします。(t=1S(t) = 0.6とする)

t >= 0 で定義されるように拡張する

さて、通常このグラフを作る時はどのような思考法をするでしょうか。一般的には例えば、t = 5ではt = 5での生存数が1、元々の生存数が5なのでS(5) = 1/5 = 0.2とするのではないでしょうか。

つまり、情報としては
①元々の生存数
T=tでの生存数
を持っていることが多いと思います。しかし、発想を変えて**情報の持ち方を変える**ことで打ち切りのあるデータにも対応できるようになります。

その持ち方とは
①' T = tの直前のS(t)の値
②' T = tでのイベントの発生率
です。

この例では、①' : t = 5の直前のS(4.999…)=0.4 と②' : t = 5でのイベント発生率1/2 = 0.5を情報として持ち、S(5) = S(4.999...) × 0.5 = 0.2として情報を更新していきます。

具体的にはこの図のようにイベントが発生するごとに情報を更新していきます。この、イベントが発生するごとに更新していくという考え方は非常に重要で今後も出現するので覚えておいてください。

グラフの作り方を工夫する

より厳密には、イベントが発生した時刻をt_{(1)}, t_{(2)}, …, t_{(f)}, …
と並べると、

時間 t_{(f-1)}から時間 t_{(f)}まではイベントが起きないので、
(時間t_{f}まで生き残る確率)=(時間 t_{(f-1)} まで生き残る確率)✖️(次に時間 t_{(f-1)} まで生き残った下で、時間t_{(f-1)}を超えて生きる確率)
となり、生存確率は「それまでの生存確率」と「その時点での生き残り確率」の積で計算できるということです。
それまでの生存確率は帰納的に同様に計算できますから、「その時点での生き残り確率」が重要になると考えられます。データに打ち切りがない場合には、「その時点での生き残り確率」は次のようにして推定ができます。

t_{(f)}での生き残り確率)
Pr[T > t_{(f)}
T = t_{(f)}でイベントが起こらない確率
 1 - \dfrac{n_f}{r_f}

ただし
 n_f : t_{(f)}で発生したイベント数
 r_f : t_{(f)}直前での生存症例数です。

よって、生存関数の推定が、
「生存確率」=「それまでの生存確率」×「その時点での生き残り確率」でできることから、
 S(t_{(f)}) = S(t_{(f-1)}) \times (1 - \dfrac{n_f}{r_f})
と表すことができます。

おわりに

このパートでは、打ち切りのない場合の生存関数の推定を行いました。「それまでの生存確率」、「その時点での生き残り確率」として情報を持つことが重要なのでした。
次回は、打ち切りのある場合にどのように考えたら良いかを解説します。

次回記事です。
syleir.hatenablog.com