MENU

R と EZR で IPTW カプランマイヤー曲線を書く方法

IPTW カプランマイヤー曲線の書き方。

RのパッケージとEZRを使うと書ける。

>>もう統計で悩むのは終わりにしませんか? 

↑期間・数量限定で無料プレゼント中!

目次

IPTWとは?

IPTW とは、Inverse Probability of Treatment Weights の頭文字語。

逆確率重み付けの意味。

傾向スコア (Propensity Score) を使った、交絡要因調整の一種。

処方されにくい分画に、処方意向確率 (Propensity Scoreと呼ばれる) の逆数で重みを付けて、処方されやすい分画とバランスをとって、比較可能性を上げる方法。

IPTW カプランマイヤー曲線とは?

IPTWでバランスをった上での群間比較カプランマイヤー曲線のこと。

これを書くにはどうすればよいか?

>>もう統計で悩むのは終わりにしませんか? 

↑1万人以上の医療従事者が購読中

RでIPTW カプランマイヤー曲線を書く方法

RISCAパッケージのインストール

RISCAパッケージをインストールして、ipw.survival() が使えるようにする。

install.packages("RISCA")
library(RISCA)

いくつかパッケージの更新が必要になる場合があるので、根気よく一つずつ更新する。

Rコンソールメニューの「パッケージ」→「パッケージの更新」を使うと更新できる。

以下のリンク先のRスクリプトが必要な ipw.survivial() 関数なので、これをコンソールにコピペしてインストールの代わりにしてもよい。

RISCA source: R/ipw.survival.R

EZRでIPTWを作成する

EZRのロジスティック回帰分析のメニューを借りて、IPTWの変数を作成する。

処方の有無(背景をなるべく揃えたい因子)を目的変数にして、その処方に影響を与える因子で説明するロジスティック回帰モデルを作成し、IPTWを計算する。

赤枠のチェックがIPTW作成のための指定箇所である。

OKを押して計算すると、weight.ATE.GLM.1という変数が作成される。

これがIPTWである。

ここまで準備して、ipw.survival() 関数に戻る。

ipw.survival関数でIPTW 生存確率を計算する

RコンソールでもEZRのRスクリプト窓でもよいので、以下のように書いて実行すると、IPTW カプランマイヤー生存曲線のための数値が計算できる。

この関数では IPTW を IPW と表現しているので注意。

IPTW と IPW は同じものを指している。

res <- with(ElderlyAML, ipw.survival(times = Days,
failures = Survival, variable = Anthracyclines,
weights = weight.ATE.GLM.1))

欠損があると計算されないので、あらかじめ欠損があるケースは削除する処理を行っておく。

解析結果を少し見てみると、以下のような構造になっている。

times は生存時間、n.risk は number at risk、n.event は number of events、survival は IPTW カプランマイヤー生存確率、variable は群分け変数である。

n.risk と n.event が小数まであり、IPTWがかかっていることがわかる。

あとはこのデータをグラフに書くのみである。

IPTWカプランマイヤー曲線を書く

まず、空白のグラフ範囲を作成する。

plot(NULL, xlim=c(0,2100), ylim=c(0,1), ylab="Survival",
xlab="Time")

X軸の範囲はあらかじめ調べておくとよい。

一本目は処方あり variable == 1 の線を書く。

lines(x = res$table.surv$times[res$table.surv$variable==1],
y = res$table.surv$survival[res$table.surv$variable==1],
type = "s", col=1)

二本目は、処方なしで生存確率が速く下がってしまう variable == 0 を書く。

lines(x = res$table.surv$times[res$table.surv$variable==0],
y = res$table.surv$survival[res$table.surv$variable==0],
type = "s", col=2)

最後に、右上のほうに Legend を挿入して完成である。

legend("topright", legend=c("Anthracyclines Treated",
"Anthracyclines Untreated"), col=c(1,2), lty=c(1,1))

IPTWで重み付けをしていないカプランマイヤー曲線を書いてみると以下のとおりである。

黒の線はあまり変わっていないが、赤の線が若干変わっているのがわかる。

生存確率0.4あたりのイベントの起き方が異なっているように見える。

このようにIPTWで重み付けをしたカプランマイヤー曲線は、重み付けなしの曲線とは若干異なる曲線になるわけである。

実は、もっと簡単に書ける。

あとになって気づいた。

### plot.survrisca
plot(res, col=2:1,
xlab='Time', ylab='Survival')
legend("topright", legend=c("Anthracyclines Treated",
"Anthracyclines Untreated"),
col=c(1,2), lty=c(1,1))

このようにスクリプトを書くだけで、以下のグラフが描ける。

打ち切りマークを入れた IPTW KM 曲線の書き方

打ち切りが発生したところに縦線を付けたい場合は、違うパッケージを使うとできる。

adjustedCurves というパッケージを使う。

関数は、adjustedsurv() である。

library(adjustedCurves)
library(survival)
library(ggplot2)
### 群別の変数を因子に
ElderlyAML$Anthracyclines.Factor <-
as.factor(ElderlyAML$Anthracyclines)
### 傾向スコア計算のためのロジスティック回帰
GLM.1 <- glm(Anthracyclines ~
Sex + Age + PS + WBC + BM_blast,
family=binomial(logit), data=ElderlyAML)
### iptw_km を指定して、傾向スコア計算モデルも指定する
adjsurv <- adjustedsurv(data=ElderlyAML,
variable='Anthracyclines.Factor',
ev_time='Days', event='Survival',
method='iptw_km',
treatment_model=GLM.1)
### censoring_ind='lines' で打ち切り例発生時点に線が引ける
plot(adjsurv, censoring_ind='lines')

以下のようなグラフになる

EZR などで別途作成した IPTW を使用することもできる

weight.ATE.GLM.1 という変数名の IPTW を treatment_model で指定する

### iptw_km を指定して、計算済みの IPTW を指定する
adjsurv <- adjustedsurv(data=ElderlyAML,
variable='Anthracyclines.Factor',
ev_time='Days', event='Survival',
method='iptw_km',
treatment_model=ElderlyAML$weight.ATE.GLM.1)
### censoring_ind='lines' で打ち切り例発生時点に線が引ける
plot(adjsurv, censoring_ind='lines')

そうすると以下のようにグラフが書ける

IPTW 累積発生率曲線の書き方

累積発生率は、生存率を 1 から引けばよいので、y = 1 – res$ … とすればよい。

plot(NULL, xlim=c(0,2100), ylim=c(0,1),
ylab="Cumulative Incidence", xlab="Time")
lines(x = res$table.surv$times[res$table.surv$variable==1],
y = 1-res$table.surv$survival[res$table.surv$variable==1],
type = "s", col=1)
lines(x = res$table.surv$times[res$table.surv$variable==0],
y = 1-res$table.surv$survival[res$table.surv$variable==0],
type = "s", col=2)
legend("bottomright", legend=c("Anthracyclines Treated",
"Anthracyclines Untreated"), col=c(1,2), lty=c(1,1))

すると、以下のように生存率を逆さにしたグラフが描ける。

通常のカプランマイヤー曲線も、plot(km, …) とあるスクリプトに、fun = ‘event’ と加筆するだけで、累積発生率の曲線が書ける。

まとめ

統計ソフトRで、RISCA パッケージの ipw.survival() 関数を用いた、IPTWカプランマイヤー曲線を書いてみた。

EZRのロジスティック回帰分析のメニューを借りると簡単にIPTWが計算できるので、EZRの力を借りるのがおすすめ。

あとは、少しだけRスクリプトを書かないといけないが、上記を参考に、変数名以外はコピペでOKなので、ぜひ試してみてほしい。

参考サイト

ipw.survival: Adjusted Survival Curves by Using IPW. in RISCA: Causal Inference and Prediction in Cohort-Based Analyses

IPWsurvival パッケージを用いた統計的因果推論 x 生存分析 – YuRAN-HIKO

おすすめ書籍

EZR公式マニュアル

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

リサーチクエスチョン探し?データ分析?論文投稿?、、、で、もう悩まない!

第1章臨床研究ではなぜ統計が必要なのか?計画することの重要性
  • 推定ってどんなことをしているの?
  • 臨床研究を計画するってどういうこと?
  • どうにかして標本平均を母平均に近づけられないか?
第2章:研究目的をどれだけ明確にできるのかが重要
  • データさえあれば解析でどうにかなる、という考え方は間違い
  • 何を明らかにしたいのか? という研究目的が重要
  • 研究目的は4種類に分けられる
  • 統計専門家に相談する上でも研究目的とPICOを明確化しておく
第3章:p値で結果が左右される時代は終わりました
  • アメリカ統計協会(ASA)のp値に関する声明で指摘されていること
  • そうは言っても、本当に有意差がなくてもいいの…?
  • なぜ統計専門家はp値を重要視していないのか
  • 有意差がない時に「有意な傾向があった」といってもいい?
  • 統計を放置してしまうと非常にまずい
第4章:多くの人が統計を苦手にする理由
  • 残念ながら、セミナー受講だけで統計は使えません。
  • インプットだけで統計が使えない理由
  • どうやったら統計の判断力が鍛えられるか?
  • 統計は手段なので正解がないため、最適解を判断する力が必要
第5章:統計を使えるようになるために今日から何をすれば良いか?
  • 論文を読んで統計が使えるようになるための5ステップ
第6章:統計を学ぶために重要な環境
  • 統計の3つの力をバランスよく構築する環境

以下のボタンをクリックして、画面に出てくる指示に従って、必要事項を記入してください。

この記事を書いた人

統計 ER ブログ執筆者

元疫学研究者

統計解析が趣味

コメント

コメント一覧 (7件)

コメントする

目次