本文へスキップ
からだにいいもの

Rのトピックスを中心に『まだ、まだ、知らない、役に立つ情報?』を発信します。

Rで解析:応答適応型ランダム化を臨床試験の設計前にシミュレーションできる「grouprar」パッケージ

「grouprar」パッケージは、反応を見ながら割り当て比率を変える臨床試験(応答適応型ランダム化)を、実施前にシミュレーションで比べられるパッケージです。渡すのは、各群の真の成功率や平均・分散と症例数で、割り当ての偏り、失敗率、検出力が返ってきます。進行中の試験なら、これまでの割り当てと反応のベクトルから次の患者の割り当て確率を出せます。反応が欠損したり遅れて届いたりする場合や、患者がまとまって登録される場合も扱えます。試験計画を立てる人が、候補のデザインを事前に比べる道具として使えるのではないかと考えます。

パッケージバージョンは0.2.0。Windows 11 x64 (build 26200)のR version 4.6.1で確認しています。

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

下記コマンドを実行してください。

# パッケージのインストール
install.packages("grouprar")

# パッケージの読み込み
library("grouprar")
スポンサーリンク

コマンド例

詳細はコメント、パッケージのヘルプを確認してください。例は、京都市伏見区の診療所で宇治茶カテキン飲料(A)、丹波黒大豆茶(B)、麦茶(C)を比べる架空の試験です。

DBCDは「Doubly-adaptive Biased Coin Design(二重適応型バイアスコイン設計)」の略で、それまでの反応から目標の割り当て比率を推定し直し、実際の割り当てをその目標へ寄せていく方法です。ERADEは「Efficient Randomized Adaptive DEsign」の略で、目標への寄せ方をDBCDより強くした方法です。目標の比率には、失敗数を減らす”RSIHR”、検出力を重視する”Neyman”、壺モデルに合わせた”RPW”などを選べます。

シミュレーションの結果は、各群の割り当て割合(allocation)とその標準偏差、失敗率または反応の平均、検出力(power)の順に表示されます。

進行中の試験で次の割り当て確率を計算:nextAllocコマンド

オプション意味初期値
allocこれまでに登録した患者ごとの治療群(1〜k)を並べた整数ベクトルなし
outcomeallocと同じ長さの反応のベクトル。二値は0か1。未観測・欠損はNAなし
k治療群の数(2以上)なし
response反応の型。”binary”または”continuous”“binary”
target.alloc目標の割り当て比率。二値は”Neyman”、”RSIHR”、”RPW”、”WeisUrn”、”OptimalNeyman”、”OptimalRSIHR”(NULLなら”RPW”)。連続は”Neyman”、”ZR”、”OptimalNeyman”、”DaOptimal”(NULLなら”Neyman”)NULL
allocation割り当ての方法。”DBCD”または”ERADE”“DBCD”
r“DBCD”の調整パラメータ。0以上の数2
erade.alpha“ERADE”のランダムさの度合い。0〜1の数0.5
lower.bound最適化系の目標と”ZR”で、各群に許す最小の目標比率。0〜1/kの数0
theta0二値の成功率の推定をならすための長さkのベクトル。NULLならすべて0.5。連続では使わないNULL
size返した確率で抽選する割り当ての数。次のグループの人数など。0なら抽選しない1
# これまでに登録した24人の割り当て(1:宇治茶 2:黒大豆茶 3:麦茶)
alloc <- c(1, 2, 3, 1, 2, 3, 3, 1, 2, 1, 3, 2, 1, 2, 3, 3, 1, 2, 3, 1, 2, 1, 3, 2)

# 疲労感の改善(1:改善 0:変化なし)。最後の4人は判定待ちなのでNA
improve <- c(1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, NA, NA, NA, NA)

# 次の1人の割り当て確率をRSIHRの目標で計算
set.seed(10)
nextAlloc(alloc, improve, k = 3, target.alloc = "RSIHR")
$prob
treatment A treatment B treatment C
  0.4364095   0.1271810   0.4364095

$target
treatment A treatment B treatment C
  0.3755172   0.2489655   0.3755172

$estimate
       pA        pB        pC
0.8125000 0.3571429 0.8125000

$assignment
[1] 3

# 次に来院する4人の割り当てをERADEで抽選
nextAlloc(alloc, improve,
  k = 3, target.alloc = "RSIHR",
  allocation = "ERADE", size = 4
)$assignment
[1] 1 1 3 1

# 睡眠時間の延び(分)を連続の反応として扱う
sleep_min <- c(
  22, 8, 15, 30, 5, 18, 12, 26, 10, 19, 14, 3,
  24, 9, 20, 16, 28, 7, 13, 21, NA, NA, NA, NA
)

# Neymanの目標で次の1人の割り当て確率を計算
nextAlloc(alloc, sleep_min,
  k = 3, response = "continuous",
  target.alloc = "Neyman"
)$prob
treatment A treatment B treatment C
  0.6091584   0.1685191   0.2223225

Bai・Hu・Shenの壺モデルのシミュレーション:Bai.Hu.Shen.Urnコマンド

オプション意味初期値
k治療群の数(2以上)なし
pデータの生成に使う各群の真の成功率。長さkで0〜1の値なし
ssn1回の試験の総症例数なし
Y0壺に最初に入れておく各群の玉の数。長さkのベクトル。NULLならすべて1NULL
nsimシミュレーションする試験の回数2000
alpha両側検定の有意水準0.05
test.fun1回の試験のp値を返すコマンド。function(outcome, assignment)の形。NULLなら既定の検定NULL
typeITRUEで、全群の成功率をpの平均にそろえた帰無仮説の下でも繰り返し、第1種の過誤を報告FALSE
seedシミュレーションの前にset.seedへ渡す整数。結果を再現するときに指定NULL
# 3群の改善率を想定し、150人の試験を200回シミュレーション
bhs <- Bai.Hu.Shen.Urn(
  k = 3, p = c(0.55, 0.70, 0.60), ssn = 150,
  nsim = 200, seed = 1
)

# 結果を表示
bhs
Bai, Hu and Shen's Urn
Sample size: 150   Simulations: 200

               p allocation    sd
treatment A 0.55      0.280 0.094
treatment B 0.70      0.411 0.117
treatment C 0.60      0.309 0.096

      failure rate sd of failure rate              power
             0.372              0.043              0.340

出生死滅型の壺モデルのシミュレーション:BirthDeathUrnコマンド

オプション意味初期値
k治療群の数(2以上)なし
pデータの生成に使う各群の真の成功率。長さkで0〜1の値なし
ssn1回の試験の総症例数なし
Y0壺に最初に入れておく各群の玉の数。長さkのベクトル。NULLならすべて1NULL
nsimシミュレーションする試験の回数2000
alpha両側検定の有意水準0.05
test.fun1回の試験のp値を返すコマンド。function(outcome, assignment)の形。NULLなら既定の検定NULL
typeITRUEで、全群の成功率をpの平均にそろえた帰無仮説の下でも繰り返し、第1種の過誤を報告FALSE
seedシミュレーションの前にset.seedへ渡す整数。結果を再現するときに指定NULL
# 壺に各群の玉を2個ずつ入れて始める
bd <- BirthDeathUrn(
  k = 3, p = c(0.55, 0.70, 0.60), ssn = 150,
  Y0 = c(2, 2, 2), nsim = 200, seed = 1
)

# 結果を表示
bd
Birth and Death Urn
Sample size: 150   Simulations: 200

               p allocation    sd
treatment A 0.55      0.226 0.128
treatment B 0.70      0.489 0.173
treatment C 0.60      0.285 0.135

      failure rate sd of failure rate              power
             0.357              0.047              0.320

二値の反応でDBCDをシミュレーション:DBCD_Binコマンド

オプション意味初期値
n0初期の推定のために制限付きランダム化で割り当てる人数。kの倍数20
pデータの生成に使う各群の真の成功率。長さkで0〜1の値なし
k治療群の数(2以上)なし
ssn1回の試験の総症例数なし
theta0成功率の推定をならすための長さkのベクトル。NULLならすべて0.5NULL
target.alloc目標の割り当て比率。”Neyman”、”RSIHR”、”RPW”、”WeisUrn”、”OptimalNeyman”、”OptimalRSIHR”のいずれか“RPW”
r“DBCD”の調整パラメータ。0以上の数で、2〜4がよく使われる2
nsimシミュレーションする試験の回数2000
mRate反応が欠損する確率。0〜1の数。NULLなら欠損なしNULL
alpha両側検定の有意水準0.05
allocation割り当ての方法。”DBCD”または”ERADE”“DBCD”
erade.alpha“ERADE”のランダムさの度合い。0〜1の数で、小さいほど目標へ強く寄せる0.5
lower.bound“OptimalNeyman”と”OptimalRSIHR”で、各群に許す最小の目標比率。0〜1/kの数0
monitor2群の試験で中間解析を行うときの設定。sqMonitorコマンドで作るNULL
test.fun1回の試験のp値を返すコマンド。function(outcome, assignment)の形。NULLなら既定の検定NULL
typeITRUEで、全群の成功率をpの平均にそろえた帰無仮説の下でも繰り返し、第1種の過誤を報告FALSE
seedシミュレーションの前にset.seedへ渡す整数。結果を再現するときに指定NULL
# 宇治茶と麦茶の2群。判定の1割が欠損すると想定
uji <- DBCD_Bin(
  p = c(0.55, 0.72), k = 2, ssn = 160, target.alloc = "RSIHR",
  nsim = 200, mRate = 0.1, seed = 1
)

# 結果を表示
uji
Hu and Zhang's DBCD
Sample size: 160   Simulations: 200

               p allocation    sd
treatment A 0.55      0.466 0.024
treatment B 0.72      0.534 0.024

      failure rate sd of failure rate              power
             0.361              0.036              0.550

# 帰無仮説の下での第1種の過誤を確認
uji_null <- DBCD_Bin(
  p = c(0.55, 0.72), k = 2, ssn = 160, target.alloc = "RSIHR",
  nsim = 200, typeI = TRUE, seed = 1
)
uji_null[["type I error"]]
[1] 0.025

# 症例数の半分で中間解析を1回入れる
uji_sq <- DBCD_Bin(
  p = c(0.55, 0.72), k = 2, ssn = 160, target.alloc = "RSIHR",
  nsim = 200, monitor = sqMonitor(c(0.5)), seed = 1
)

# 各解析時点で有効中止となった割合
uji_sq[["stopping probability"]]
look 1 look 2
 0.105  0.895

# 症例数の期待値
uji_sq[["expected sample size"]]
[1] 151.6

連続の反応でDBCDをシミュレーション:DBCD_Contコマンド

オプション意味初期値
n0初期の推定のために制限付きランダム化で割り当てる人数。kの倍数20
thetaデータの生成に使う各群の真の平均と分散を交互に並べた長さ2kのベクトル。例:c(平均1, 分散1, 平均2, 分散2)なし
k治療群の数(2以上)なし
ssn1回の試験の総症例数なし
theta0現在は使われていない。以前の版との互換のために残っているNULL
target.alloc目標の割り当て比率。”Neyman”、”ZR”、”OptimalNeyman”、”DaOptimal”のいずれか“Neyman”
r“DBCD”の調整パラメータ。0以上の数で、2〜4がよく使われる2
nsimシミュレーションする試験の回数2000
alpha両側検定の有意水準0.05
allocation割り当ての方法。”DBCD”または”ERADE”“DBCD”
erade.alpha“ERADE”のランダムさの度合い。0〜1の数で、小さいほど目標へ強く寄せる0.5
lower.bound“ZR”と”OptimalNeyman”で、各群に許す最小の目標比率。0〜1/kの数0
monitor2群の試験で中間解析を行うときの設定。sqMonitorコマンドで作るNULL
test.fun1回の試験のp値を返すコマンド。function(outcome, assignment)の形。NULLなら既定の検定NULL
typeITRUEで、全群の平均をthetaの平均にそろえた帰無仮説の下でも繰り返し、第1種の過誤を報告FALSE
seedシミュレーションの前にset.seedへ渡す整数。結果を再現するときに指定NULL
# 収縮期血圧の低下量(mmHg)。宇治茶は平均8・分散25、麦茶は平均5・分散16
bp <- DBCD_Cont(
  theta = c(8, 25, 5, 16), k = 2, ssn = 120,
  nsim = 200, seed = 2
)

# 結果を表示
bp
Hu and Zhang's DBCD (Gaussian Response)
Sample size: 120   Simulations: 200

            mu sigma2 allocation    sd
treatment A  8     25      0.559 0.042
treatment B  5     16      0.441 0.042

      mean response sd of mean response               power
              6.720               0.448               0.975

# 黒大豆茶(平均6・分散9)を加えた3群をZRの目標とERADEで
bp3 <- DBCD_Cont(
  n0 = 30, theta = c(8, 25, 5, 16, 6, 9), k = 3, ssn = 150,
  target.alloc = "ZR", lower.bound = 0.2,
  allocation = "ERADE", nsim = 200, seed = 2
)

# 結果の要約を表示
summary(bp3)
ERADE (Gaussian Response)
Sample size: 150   Simulations: 200

            mu sigma2 allocation    sd
treatment A  8     25      0.404 0.100
treatment B  5     16      0.373 0.106
treatment C  6      9      0.223 0.038

      mean response sd of mean response               power
              6.429               0.501               0.885

一般化ドロップ・ザ・ルーザー則のシミュレーション:GDLRuleコマンド

オプション意味初期値
k治療群の数(2以上)なし
pデータの生成に使う各群の真の成功率。長さkで0〜1の値なし
ssn1回の試験の総症例数なし
aK移入玉を引いたときに壺へ足す各群の玉の数。長さkの正のベクトルなし
Y0壺に最初に入れておく各群の玉の数。長さkのベクトル。移入玉1個は自動で加わる。NULLならすべて1NULL
nsimシミュレーションする試験の回数2000
alpha両側検定の有意水準0.05
test.fun1回の試験のp値を返すコマンド。function(outcome, assignment)の形。NULLなら既定の検定NULL
typeITRUEで、全群の成功率をpの平均にそろえた帰無仮説の下でも繰り返し、第1種の過誤を報告FALSE
seedシミュレーションの前にset.seedへ渡す整数。結果を再現するときに指定NULL
# 移入玉を引いたら各群の玉を1個ずつ足す
gdl <- GDLRule(
  k = 3, p = c(0.55, 0.70, 0.60), ssn = 150, aK = c(1, 1, 1),
  nsim = 200, seed = 1
)

# 結果を表示
gdl
Generalized Drop-the-loser Rule
Sample size: 150   Simulations: 200

               p allocation    sd
treatment A 0.55      0.288 0.038
treatment B 0.70      0.403 0.045
treatment C 0.60      0.310 0.043

      failure rate sd of failure rate              power
             0.374              0.039              0.335

二値の反応でグループ単位のDBCDをシミュレーション:Group.DBCD_Binコマンド

オプション意味初期値
n0初期の推定のために制限付きランダム化でグループごと割り当てる最少人数。kの倍数20
pデータの生成に使う各群の真の成功率。長さkで0〜1の値なし
k治療群の数(2以上)なし
gsize.paramグループの人数を生成するゼロ切断ポアソン分布の率。正の数なし
ssn1回の試験の総症例数なし
theta0成功率の推定をならすための長さkのベクトル。NULLならすべて0.5NULL
target.alloc目標の割り当て比率。”Neyman”、”RSIHR”、”RPW”、”WeisUrn”、”OptimalNeyman”、”OptimalRSIHR”のいずれか“RPW”
r“DBCD”の調整パラメータ。0以上の数で、2〜4がよく使われる2
nsimシミュレーションする試験の回数2000
mRate反応が欠損する確率。0〜1の数。NULLなら欠損なしNULL
alpha両側検定の有意水準0.05
allocation割り当ての方法。”DBCD”または”ERADE”“DBCD”
erade.alpha“ERADE”のランダムさの度合い。0〜1の数で、小さいほど目標へ強く寄せる0.5
lower.bound“OptimalNeyman”と”OptimalRSIHR”で、各群に許す最小の目標比率。0〜1/kの数0
monitor2群の試験で中間解析を行うときの設定。sqMonitorコマンドで作るNULL
test.fun1回の試験のp値を返すコマンド。function(outcome, assignment)の形。NULLなら既定の検定NULL
typeITRUEで、全群の成功率をpの平均にそろえた帰無仮説の下でも繰り返し、第1種の過誤を報告FALSE
seedシミュレーションの前にset.seedへ渡す整数。結果を再現するときに指定NULL
# 平均4人ずつまとまって来院し、判定の15%が欠損すると想定
gb <- Group.DBCD_Bin(
  p = c(0.55, 0.72), k = 2, gsize.param = 4, ssn = 160,
  target.alloc = "RSIHR", nsim = 200, mRate = 0.15, seed = 3
)

# 結果を表示
gb
Group DBCD with Binary Response (Random Missing)
Sample size: Total 160, Effective Size 136   Simulations: 200

               p allocation    sd
treatment A 0.55      0.467 0.024
treatment B 0.72      0.533 0.024

      failure rate sd of failure rate              power
             0.354              0.041              0.460

連続の反応でグループ単位のDBCDをシミュレーション:Group.DBCD_Contコマンド

オプション意味初期値
n0初期の推定のために制限付きランダム化でグループごと割り当てる最少人数。kの倍数20
thetaデータの生成に使う各群の真の平均と分散を交互に並べた長さ2kのベクトル。例:c(平均1, 分散1, 平均2, 分散2)なし
k治療群の数(2以上)なし
gsize.paramグループの人数を生成するゼロ切断ポアソン分布の率。正の数なし
ssn1回の試験の総症例数なし
theta0現在は使われていない。以前の版との互換のために残っているNULL
target.alloc目標の割り当て比率。”Neyman”、”ZR”、”OptimalNeyman”、”DaOptimal”のいずれか“Neyman”
r“DBCD”の調整パラメータ。0以上の数で、2〜4がよく使われる2
nsimシミュレーションする試験の回数2000
mRate反応が欠損する確率。0〜1の数。NULLなら欠損なしNULL
alpha両側検定の有意水準0.05
allocation割り当ての方法。”DBCD”または”ERADE”“DBCD”
erade.alpha“ERADE”のランダムさの度合い。0〜1の数で、小さいほど目標へ強く寄せる0.5
lower.bound“ZR”と”OptimalNeyman”で、各群に許す最小の目標比率。0〜1/kの数0
monitor2群の試験で中間解析を行うときの設定。sqMonitorコマンドで作るNULL
test.fun1回の試験のp値を返すコマンド。function(outcome, assignment)の形。NULLなら既定の検定NULL
typeITRUEで、全群の平均をthetaの平均にそろえた帰無仮説の下でも繰り返し、第1種の過誤を報告FALSE
seedシミュレーションの前にset.seedへ渡す整数。結果を再現するときに指定NULL
# 血圧の低下量を、平均4人ずつのまとまりで割り当てる場合
gc <- Group.DBCD_Cont(
  theta = c(8, 25, 5, 16), k = 2, gsize.param = 4,
  ssn = 120, nsim = 200, seed = 4
)

# 結果を表示
gc
Group DBCD with Continuous Response (No Missing)
Sample size: Total 120, Effective Size 120   Simulations: 200

            mu sigma2 allocation    sd
treatment A  8     25      0.556 0.045
treatment B  5     16      0.444 0.045

      mean response sd of mean response               power
              6.637               0.421               0.955

この記事が誰かの役に立ちますように。

スポンサーリンク
価格および配送状況は変更される場合があります。購入時は商品ページをご確認ください。
当サイトに表示されている商品情報はAmazonから提供されたものであり、更新または削除される場合があります。
karada-goodはAmazonアソシエイトとして、適格販売により収入を得ています。