MENU

R で多重代入 IPTW Cox 回帰 ブートストラップ信頼区間を計算する方法

説明変数がいくつかある生存時間データで、いくつかの説明変数に欠損値があり、多重代入して IPTW Cox 回帰分析がしたい場合、R でどのようにすればよいか

IPTW Cox 回帰の場合、ブートストラップ信頼区間がより適切であるが、それはどうやるか

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

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

目次

多重代入とは

データセットに、欠損値があり、欠損値処理として多重代入を採用したいときがある

多重代入とは、いくつか適切と思われる数値で、欠損値を補完して、ひとつではなく、いくつかのデータセットを作成する

いくつかのデータセットから計算した結果を統合するという方法である

こちらの記事も参照のこと

IPTW 法とは

比較する群間の交絡因子の調整方法の一つで、傾向スコアの逆数を重みとして、人数をかさましして計算する方法

これによって、測定できている交絡因子に限っては、あたかも群間でそろっている、つまりは、交絡していないような状態を作り出すことができる

ただし、測定できている変数のみであって、未知・未測定の交絡因子は調整できていないため、ランダム化比較試験と同等にはならないことに注意する必要がある

こちらの記事も参照のこと

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

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

IPTW Cox 回帰とは

IPTW で重み付けした、Cox 回帰分析のこと

Cox 回帰は、Cox 比例ハザードモデルを用いた回帰分析のこと

こちらの記事も参照のこと

ブートストラップ信頼区間とは

ブートストラップ信頼区間は、今回得られているサンプルを活用して、復元抽出(抽出しては戻すを繰り返すので、同じデータが抽出されることもある)を繰り返し、サンプルと同じ大きさの疑似サンプルを多数作成して、そのデータセット群を分析することで、点推定値の分布から計算された信頼区間のことである

こちらの記事も参照のこと

多重代入 IPTW Cox 回帰 ブートストラップ信頼区間の計算方法

以下に、スクリプトを示す

全体の流れは、以下のようになっている

  1. 欠損値を含むデータセットを準備する
  2. mice パッケージの mice 関数で多重代入データを作成する
  3. MatchThem パッケージの weightthem 関数で IPTW を作成する
  4. いったん、多重代入データセットを使った暫定的な IPTW Cox 回帰を行う(IPTW に対応したロバスト信頼区間というものが計算される)
  5. ブートストラップ信頼区間計算のために、ブートストラップデータセットを用いた Cox 回帰の関数を定義する(cox_reg)
  6. 多重代入データセットのオブジェクト名を準備する(imp1 ~ imp5)
  7. 多重代入データセット一つ一つに対して、boot パッケージの boot 関数によってブートストラップ法を実行する
  8. ブートストラップ結果を格納するリストを作成する
  9. ブートストラップ結果を取り出す
  10. 推定値と標準誤差を元に統合推定値と統合信頼区間の計算
  11. ブートストラップ信頼区間を出力
  12. ロバスト信頼区間とブートストラップ信頼区間を並べて比較
# 欠損値を含むデータセットを準備する
# ph.ecog01, meal.cal, wt.loss:欠損値含む
df0 <- df[,c("time", "status01", "ph.ecog01", "age", "sex",
"meal.cal", "wt.loss")]
# mice パッケージの mice 関数で多重代入データを作成する
# (データセット数 m=5):本当は少なくとも m=100 がよい
library(mice)
df_imputed <- mice(df0, seed=0)
df_imputed
# MatchThem パッケージの weightthem 関数で IPTW を作成する
library(MatchThem)
weighted_imputed <- weightthem(ph.ecog01 ~ age + factor(sex) +
meal.cal + wt.loss, data=df_imputed)
summary(weighted_imputed)
# 多重代入データセットを使った暫定的な IPTW Cox 回帰を行う
#(ロバスト信頼区間)
library(survival)
wi_iptw_cox <- with(weighted_imputed,
coxph(Surv(time, status01) ~
ph.ecog01 + age + factor(sex) +
meal.cal + wt.loss,
weights=weights,
robust=TRUE
))
## 統合
pooled_wi_iptw_cox <- pool(wi_iptw_cox)
summary(pooled_wi_iptw_cox, conf.int=TRUE, exponentiate = TRUE)
# ブートストラップ信頼区間計算のために、
# ブートストラップデータセットを用いた Cox 回帰の関数を定義する
# cox_reg 関数: 特定の完全データセットに対して
# Cox比例ハザードモデルを適用し、回帰係数を返す関数
cox_reg <- function(data, indices)
# ブートストラップ標本の抽出
data <- data[indices,]
# Cox比例ハザードモデルの適用
fit <- with(data,
coxph(Surv(time, status01) ~
ph.ecog01 + age + factor(sex) +
meal.cal + wt.loss, weights=weights,
robust=TRUE
))
# ハザード比の推定値を返す
return(coef(fit))
}
# 多重代入データセットのオブジェクト名を準備する
# imps ベクトル: ブートストラップの各試行で使用する
# 完全データセットの識別子(m=1~5 まで)
imps <- paste0("imp", 1:weighted_imputed$object$m)
# 多重代入データセット一つ一つに対して、
# boot パッケージの boot 関数によってブートストラップ法を実行する
library(boot)
for (imp_name in imps){
# 完全データセットの作成
imp <- complete(weighted_imputed,
action = as.numeric(substr(imp_name, 4, 6)))
result <- cox_reg(data=imp, indices=1:nrow(df0))
set.seed(0)
boot_res <- boot(
data = imp,
statistic = cox_reg,
# サンプリング回数:10000 のほうがよいが取り急ぎ 1000
R = 1000
)
print(boot_res)
# ブートストラップ結果を保存
assign(paste("boot_res_", imp_name, sep=""), boot_res)
}
# ブートストラップの結果を格納するリストを作成する
boot_res_lists <- lapply(paste0("boot_res_imp",
1:weighted_imputed$object$m), get)
# ブートストラップ結果を取り出す
## 推定値と標準誤差のベクトルを初期化
estimates <- c()
variances <- c()
## forループで各ブートストラップの結果を処理
for (i in 1:5) {
m <- mean(boot_res_lists[[i]]$t[, 1])
se <- sd(boot_res_lists[[i]]$t[, 1])
estimates <- c(estimates, m)
variances <- c(variances, se^2)
}
# 推定値と標準誤差を元に統合推定値と信頼区間の計算
pool <- pool.scalar(Q = estimates, U = variances, n = nrow(df0))
## プール標準誤差を計算
## t1* (ph.ecog01) の SE の統合
pooled_se <- sqrt(pool$ubar)
## 統合推定値の取り出し
pooled_m <- pool$qbar
## 95 %信頼区間の計算
LL <- pooled_m - qnorm(0.975)*pooled_se
UL <- pooled_m + qnorm(0.975)*pooled_se
# ブートストラップ信頼区間を出力
output <- c(pooled_m, LL, UL)
names(output) <- c("Estimate", "LowerLimit", "UpperLimit")
## 対数ハザード比と信頼区間
output
## 真数にしたハザード比と信頼区間
exp(output)
# ロバスト信頼区間とブートストラップ信頼区間を並べて比較
## ロバスト信頼区間
summary(pooled_wi_iptw_cox, conf.int=TRUE,
exponentiate=TRUE)[1,c(2,7,8)]
## ブートストラップ信頼区間
exp(output)

結果は、以下のように出力される

暫定的な結果(ロバスト信頼区間)は以下のとおり

ここでは、着目している ph.ecog01 の交絡因子の推定値も表示されている

IPTW を作成するために使用した交絡因子を、再度共変量として投入している

ブートストラップ信頼区間の出力は以下のとおり

ロバスト信頼区間とブートストラップ信頼区間を並べてみると、少し異なるのがわかる

まとめ

この記事では、多重代入 IPTW Cox 回帰 ブートストラップ信頼区間 の一連の計算を R ではどのようなスクリプトを書けば実現できるかの例を挙げた

一つで完結する関数はないので、いくつかの関数を組み合わせて、実行する必要がある

何らか参考になれば

参考文献

Variance estimation when using inverse probability of treatment weighting (IPTW) with survival analysis

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

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

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

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

この記事を書いた人

統計 ER ブログ執筆者

元疫学研究者

統計解析が趣味

コメント

コメントする

目次