Stata分析機能例題集
生存分析

生存関数やハザード関数(Nelson-Alesn推定ハザード関数など)の変数を作成するには、stsコマンドを使用します。
生存関数を作成するために、Kaplan-Meier推定を行ったり、Cox回帰を用いて調整した推定を行うこともできます。

この例題でできること

  1. Kaplan-Meier法による生存関数グラフの作成 ― 生存確率(イベント発生確率)の時間変化を調べます。
  2. Nelson-Aalen累積ハザード関数のグラフ作成 ― 死亡確率の時間変化を調べます。
  3. ハザード関数の推定 ― Nelson-Aalen累積ハザード関数を平滑化します。
  4. Cox比例ハザードモデルのグラフ作成 ― 説明変数がハザード関数に影響を及ぼしているか否かを調べます。
Kaplan-Meier法による生存関数グラフの作成
Nelson-Aalen累積ハザード関数のグラフ

Stata評価版

最新バージョンのStataをお持ちでない場合は、無料の体験版でお試しいただけます。

doファイルのダウンロード

今回使用するコマンドをまとめたdoファイルです。zipファイルをダウンロード後に展開(解凍)してください。
doファイルは、Stataのメニューの「ファイル > 開く」で開いて使用します。

PDFファイルのダウンロード

このページの内容はPDFでも配布しております。

Kaplan-Meier法による生存関数グラフの作成

データの確認

最初に、基本となるグラフを作成します。
下記のコマンドで例題用のサンプルデータ「drug2」を入手します。

.use https://www.stata-press.com/data/r16/drug2
. browse
サンプルデータ「drug2」

サンプルデータには、以下のデータが入力されています。

Sutdytime :死亡または打ち切りまでの月数
died : 1=死亡、0=打ち切り
drug : 1=服薬あり、0=服薬なし
age : 観察開始時の患者の年齢

投薬の有無(drug)の違いによる生存率の時間変化をグラフにします。

.sts graph, by(drug) lost
Kaplan-Meier法による生存関数グラフの作成 1

このデータは、すべての患者のデータが観察開始時間(t=0)から始まっています。
t=0以降に観察を始める患者のデータを追加すること(遅延組入)はしていません。
そこで、次はt=0以降に新規患者のデータを追加していく場合のグラフを作成します。

遅延組入のあるサンプルデータ「drug2b」を入手します。

.use https://www.stata-press.com/data/r16/drug2b
Kaplan-Meier法による生存関数グラフの作成 2

1つ目のサンプルデータと違って、t=5やt=8から観察を開始した患者のデータがあります。
先程と同様にグラフを作成します。

.sts graph, by(drug) lost
Kaplan-Meier法による生存関数グラフの作成 3

lostオプションは打ち切り人数を表示するオプションなので、遅延組入の人数は負の値として表示されます。
この「-1」は、例えば「遅延組入1人」や「遅延組入2人、打ち切り1人」のような状態を表します。

enterオプションを使用すると、遅延組入と打ち切りを分けて表示できます。

.sts graph, by(drug) lost enter
Kaplan-Meier法による生存関数グラフの作成 4

遅延組入と打ち切りを分けて表示する方法は、常に最善とは限りません。
次のサンプルデータ「drug2c」は、最初の「drug2」と同じ内容のデータです。
しかし、記述方法が異なり、時間経過によって変化する共変量(投薬量や体重など)を併記できるように、1人の患者に対して複数行のデータがあります。
遅延組入はありません。

Kaplan-Meier法による生存関数グラフの作成 5

ID : 患者ID

サンプルデータ「drug2c」を入手し、lostオプションを付けてグラフを作成します。

.use https://www.stata-press.com/data/r16/drug2c
.sts graph, by(drug) lost
Kaplan-Meier法による生存関数グラフの作成 6

このグラフは、「drug2」のグラフと同じです。データの内容も、形式が違うだけで理論的には同じ事象を表しています。
しかし、enterオプションを使用すると、たくさんの数値が記入されてしまいます。

.sts graph, by(drug) lost enter
Kaplan-Meier法による生存関数グラフの作成 7

同じ患者IDのデータが複数行あり、一行ごとに遅延組入・打ち切りとして処理されるためです。
遅延組入と打ち切りが区別できない場合はlostenterのオプションを使うと良かったのですが、このような共変量のあるデータの場合は適しません。

Nelson-Aalen累積ハザード関数のグラフ作成

データの確認

cumhazオプションを使用すると、Nelson-Alen累積ハザード関数を描くことができます。
最初と同じサンプル「drug2」を使用して、投薬の有無による累積ハザード関数をグラフにします。

.use https://www.stata-press.com/data/r16/drug2
.stset, noshow
.sts graph, cumhaz by(drug)
Nelson-Aalenグラフ 1

打ち切りの人数を表示するグラフは、lostオプションで作成できます。

. sts graph, cumhaz by(drug) lost
Nelson-Aalenグラフ 2

ハザード関数のグラフ作成

stsコマンドは、ハザード関数の推定にも使用することができます。
下記のグラフは、weightedカーネル平滑化を基にハザード関数を推定しています。
カーネル関数とバンド幅の選び方によって結果が変わるため、注意が必要です。

.sts graph, hazard by(drug)
ハザード関数のグラフ 1

次のコマンドでは、カーネル平滑化とバンド幅を調整しています。
titileは、グラフタイトルを変更するコマンドです。

.sts graph, hazard by(drug) kernel(gauss) width(5 7) title(Comparison of hazard function)
ハザード関数のグラフ 2

リスクテーブルを追加する

以下のコマンドで、リスクテーブルをグラフの下に追加します。

.sts graph, by(drug) risktable
ハザード関数のグラフ 3

書式オプションは下記の通りです。
凡例の位置を変更します。

.sts graph, by(drug) risktable legend(ring(0) position(2) rows(2))
ハザード関数のグラフ 4

リスクテーブルのラベル列を「Placebo」と「Test drug」に変更します。

.sts graph, by(drug ) risktable(, order(1 "Placebo" 2 "Test drug"))
ハザード関数のグラフ 5

ラベル列の文字を左揃えにします。

. sts graph, by(drug ) risktable(, order(1 "Placebo" 2 "Test drug") rowtitle(, justification(left)))
ハザード関数のグラフ 6

リスクテーブルのタイトルをとラベル列の行頭を揃えます。

.sts graph, by(drug ) risktable(, order(1 "Placebo" 2 "Test drug") rowtitle(, justification(left)) title(, at(rowtitle)))
ハザード関数のグラフ 7

Cox比例ハザードモデル

データの確認

stcoxコマンドを使用して、比例Coxハザードモデルを適用します。
打ち切りのないデータでCox回帰を行います。
新型のベアリングを搭載した非常用発電機の耐久実験を行います。
この実験では、保護回路を無効にして発電機が発火するまで負荷をかけて運転を行います。

サンプルデータを入手し、データを確認します。

. use https://www.stata-press.com/data/r16/kva . list
Cox比例ハザードモデル 1

failtime : 故障するまでの時間(h)
lost : 負荷(kVA)
bearing : 1=新型のベアリング、0=旧型のベアリング

12台の発電機があり、内訳は新型ベアリング搭載機と旧型ベアリング搭載機が各6台ずつです。
例えば、1行目のデータは旧式ベアリング搭載機に15 lVAの負荷をかけて運転したところ、100時間後に故障したことを意味します。
Cox比例ハザードモデルに当てはめて、発電機の故障は負荷の程度に影響を受けるのか、それともベアリングの型によるのかを調べます。
ベアリングの型と負荷の大きさは、ハザード関数の形全体には影響しないものとします。

下記のコマンドでモデルを適用します。

. stset failtime(処理結果が出力されます) . stcox load bearings
Cox比例ハザードモデル 2

負荷の程度の影響を制御すると、新型ベアリングはハザード率が6.36%と低く正常作動時間も長くなることが分かります。
一度stcoxを適用すると、以降は引数を省略できます。

続けて、上記のモデルにハザード比ではなく係数を表示オプションnohrを使用して再表示させます。

. stcox, nohr
Cox比例ハザードモデル 3

打ち切りのあるデータでCox回帰を行う

下記のような48人の癌患者の服薬データがあります。
21人は薬物療法を行っていて、20人は行っていません。
患者の年齢は47才から67才までです。
このデータを使って、患者が死亡するまでの月数について解析を行います。

Cox比例ハザードモデル 4

sutdytime : 死亡または打ち切りまでの月数
died : 1=死亡、0=打ち切り
drug : 1=服薬あり、0=服薬なし
age : 観察開始時の患者の年齢

データを入手してstsetでデータを整え、サマリーを確認します。

. use https://www.stata-press.com/data/r16/drugtr
. stset studytime, failure(died)
.summarize
Cox比例ハザードモデル 5

各変数のデータ数、平均、標準偏差、最小値、最大値が表示されます。
Coxモデルを適用します。

.stcox drug age
Cox比例ハザードモデル 6

年齢を制御すると、投薬ありの場合のハザード率が10.5%と低く、生存時間が長いことが分かります。
ハザード率は、変数が1単位変わる時の変化を表しています。
上記の例では、年齢が1才上がるごとにハザードが12%増加しています。
5才年齢が変わる場合のリスクを計算します。
年齢を5才で1単位とするために、新しい変数を作成します。

.replace age = age/5
Cox比例ハザードモデル 7 Cox比例ハザードモデル 8

再度Coxモデルを適用します。

.stcox drug age, nolog
Cox比例ハザードモデル 9

年齢が5才上がると、ハザードは76%増加します。

タイ(同じ値)のあるデータを扱う

ハザードモデルを構築するには、タイのない連続的な値を扱うのが理想的です。
タイが発生した場合には、部分尤度を計算する必要があります。
タイのあるデータに対してCox部分尤度を計算するために、Stataには4つのオプション(brslow, efron, exactm, exactp)が用意されています。

時間で変化する共変量のあるデータでCox回帰を行う

スタンフォード心臓移植プログラムの心臓移植データを例にします。
これには、実際に心臓移植を受けた患者と受けられなかった患者(合計103人)のデータが含まれています。
心臓移植を待っている間に死亡した患者や待機をやめた患者もいますが、67%の患者は移植を受けました。

サンプルデータを入手し、データを確認します。

. use https://www.stata-press.com/data/r16/stan3, clear
Cox比例ハザードモデル 10

id : 患者ID
year : 心臓移植プログラムに参加した年
age : 患者の年齢
died : 1=死亡、0=打ち切り
stime : 生存時間(日)
surgey : 1=外科手術あり、0=外科手術なし(CABGなど)
transplant : 1=心臓移植実施、0=心臓移植なし
wait : 移植までの待機時間
posttran : post-transplant 1=新しい心臓を受け取った、0=受け取らなかった

stsetでデータを整え、Coxモデルを適用します。

. stset t1, failure(died) id(id)(処理結果が出力されます)
. stcox age posttran surg year
Cox比例ハザードモデル 11

高齢の患者ほどハザード率が高く、手術を受けた患者のハザード率が低いことが分かります。
また、最終的に心臓移植を受けたかどうかによって、ハザード率は大きく変わりません。

継続的に時間変化する共変量のあるデータでCox回帰を行う

基本的なCox回帰は、次の式で表されます。

h(t)=h_0 (t)exp(β_1 x_1+⋯+β_k+x_k )

変数がz_i (t)=z_i g(t)に変化したとすると、式は下記のようになります。

h(t)=h_0 (t)exp{├ β_1 x_1+⋯+β_k+x_k ┤+g(t)┤ ├ (γ_1 z_1+⋯+γ_m z_m )}

z_1,⋯⋯,z_mが時間変化する共変量し推定に影響を及ぼす場合、回帰係数γ_1と共変量g(t) z_iは現在の関数です。

変数z_1,⋯⋯,z_mを決定するにはtvc(varlist)オプションを使用します。
g(t)におけるtは分析時間なので、g(t)はtexp(exp)オプションで計算できます。
例えば、g(t)=log(t)を計算する場合は下記のように入力します。_tはtsetによって計算されています。

texp(log(_t))

Cox回帰はイベント発生時の部分尤度を基に計算されているので、イベント発生時にstsplitを使って分割し、手動で時間変化のある共変量を生成することでも計算できます。
stsplitを使ってイベント発生の多い大きなデータセットを処理すると大量のメモリを消費するため、その場合はtvc()やtexp()を使用します。

テクニカルサポート

ご不明な点がございましたら、お気軽にお問合せフォームよりテクニカルサポートまでご連絡ください。

その際、必ず「製品名」「バージョン」「シリアル番号」をご連絡ください。

Stata is a registered trademark of StataCorp LLC, College Station, TX, USA, and the Stata logo is used with the permission of StataCorp.

page_top_icon