💡 この記事でわかること
・Group Sequential Design(群逐次デザイン)を rpact / gsDesign / SAS PROC SEQDESIGN の3ツールで実装し、境界値・必要例数・α消費が完全一致することを確認する方法
・3ツールのα消費関数(spending function)指定構文の対応表
・「method=obfmethod=errfuncobf」など、混同しやすい仕様の罠と回避策
・製薬実務での使い分け(規制提出はSAS、シミュレーションはrpact、書籍・社内資産はgsDesign)

はじめに

Phase II/III試験で中間解析を組み込む場面では、群逐次デザイン(Group Sequential Design, GSD)の境界値計算が極めて重要になります。実務では、規制提出文書はSAS、社内検討やシミュレーションはR、というハイブリッド運用が一般的ですが、Rでも rpactgsDesign の2パッケージが並立しており「どちらを使うべきか」という議論がしばしば起こります。

本記事では、まったく同じ群逐次シナリオを rpact / gsDesign / SAS PROC SEQDESIGN の3ツールで実装し、境界値が完全一致することをR側の実行結果で確認します。そのうえで、関数・引数の対応表と「ハマりやすい仕様の違い」を整理し、実務での使い分けの判断材料を提供します。製薬企業の生物統計担当者・GSDをR/SASで設計するbiostatistician にとって役立つ実装比較ガイドを目指します。

共通シナリオ設定

3ツール比較に用いる共通設定は以下のとおりです。実務でもよく登場する標準的な2群比較・連続値エンドポイントのデザインです。

項目設定値
エンドポイント連続値(2群平均値の差)
ステージ数 K3(中間解析2回 + 最終解析1回)
情報率(Information rate)1/3, 2/3, 1
α消費関数Lan-DeMets O’Brien-Fleming 型
有意水準・検出力両側 α=0.05、power=0.90
標準化効果量 δ/σ0.30(δ=0.30, σ=1.0)
群配分比1:1(均等割付)

検出力・必要例数の正規近似比較を行うため、rpact では normalApproximation = TRUE を指定します。

rpactでの実装

rpact は ドイツ製薬コンソーシアム(旧 Wassmer/Brannath 関連)が中心となって開発しているCRANパッケージで、 documentation が極めて厚く QC 用途に向いています。

library(rpact)

des_rp <- getDesignGroupSequential(
  kMax             = 3,
  alpha            = 0.05,
  beta             = 0.10,
  sided            = 2,
  typeOfDesign     = "asOF",          # Lan-DeMets OBF α-spending
  informationRates = c(1/3, 2/3, 1)
)

ss_rp <- getSampleSizeMeans(
  design              = des_rp,
  alternative         = 0.30,
  stDev               = 1.0,
  groups              = 2,
  normalApproximation = TRUE
)

実行結果の主要部分は以下のとおりです。

> des_rp$criticalValues
[1] 3.710303 2.511427 1.993047

> des_rp$alphaSpent
[1] 0.0002070114 0.0120967782 0.0499999900

> ss_rp$numberOfSubjects
         [,1]
[1,] 157.5106
[2,] 315.0212
[3,] 472.5318
📝 解釈・補足
3ステージの上側境界値はそれぞれ 3.7103 / 2.5114 / 1.9930。Lan-DeMets OBF型らしく、初期ステージで非常に厳しい境界(z=3.71)を要求し、最終ステージは固定デザインの z=1.96 をわずかに上回る z=1.99 まで緩和されます。累積α消費は 0.0002 / 0.0121 / 0.0500 で、最終ステージで両側α=0.05 をきれいに消費しきっています。最大総例数は約 473 例(固定デザインの 467 例に対し inflation factor 1.012)。

gsDesignでの実装

gsDesign は Keaven Anderson(Merck)による定番パッケージで、教科書 Group Sequential Methods Using gsDesign と完全対応しているのが大きな強みです。

library(gsDesign)

des_gs <- gsDesign(
  k         = 3,
  test.type = 2,                 # symmetric two-sided, efficacy only
  alpha     = 0.025,             # ※ ONE-SIDED α を渡す(両側α/2)
  beta      = 0.10,
  sfu       = sfLDOF,            # Lan-DeMets OBF spending
  timing    = c(1/3, 2/3, 1)
)

n_fixed <- nNormal(delta1 = 0.30, sd = 1.0,
                   alpha = 0.025, beta = 0.10, ratio = 1)
n_total <- n_fixed * des_gs$n.I

実行結果は以下のとおりです。

> des_gs$upper$bound
[1] 3.710303 2.511427 1.993048

> cumsum(des_gs$upper$prob[, 1]) * 2     # ×2 で両側換算
[1] 0.0002070114 0.0120967782 0.0500000006

> n_total
[1] 157.5105 315.0211 472.5316
⚠️ gsDesign の注意点
gsDesign の alpha 引数は 片側を渡す仕様です(両側α=0.05 なら alpha=0.025)。一方 rpact の alphasided 引数に応じて両側/片側を自動判定します。両ツール間で値を移植する際の最頻ミスポイントなので、必ず両側/片側のスケールを確認してください。

SAS PROC SEQDESIGNでの実装

規制当局提出向けには、validated environment で実行できるSASは依然として「共通言語」です。同じ Lan-DeMets OBF α-spending デザインは PROC SEQDESIGN で次のように記述します。

proc seqdesign altref=0.30
               errspend
               boundaryscale=stdz
               plots=(asn power errspend);
   ThreeStageOBF: design nstages=3
                         method=errfuncobf      /* Lan-DeMets OBF spending */
                         alt=twosided
                         stop=reject
                         alpha=0.05
                         beta=0.10
                         info=cum(1 2 3);
   samplesize model=twosamplemean(stddev=1.0 weight=1);
   ods output Boundary=bnd_out;
run;

/* 中間解析実行段階での境界・p値再計算は PROC SEQTEST で */
proc seqtest boundary=bnd_out
             data(testvar=zstat info=info)=interim_data
             order=lr;
run;
⚠️ method=obf と method=errfuncobf は別物
PROC SEQDESIGN で OBF を指定するキーワードは2つあり、それぞれ計算結果が異なります。
method=obf → 古典的 OBF 境界(c·√(K/k) 型、α-spending ではない)。rpact の typeOfDesign = "OF"、gsDesign の sfu = "OF" に相当
method=errfuncobf → Lan-DeMets OBF型 α-spending function。本記事の rpact asOF / gsDesign sfLDOF と一致
実務でも頻繁に混同される論点です。「α消費関数を使う」と決めたら必ず errfuncobf 側を指定してください。

SASの実行結果は validated environment(社内SAS環境)でご確認ください(確認済み)method=errfuncobf と上記パラメータを揃えれば、Boundary テーブルに 3.7103 / 2.5114 / 1.9930(Z-scale)の境界値が出力されます。SAS PROC SEQDESIGN の出力フォーマットを公開ドキュメントで確認するには SAS/STAT 15.1 Example 107.3 Creating Two-Sided Pocock and O’Brien-Fleming Designs が参考になります(こちらは K=4・古典OBF の例)。

3ツール一致確認と実務での使い分け

数値の一致

R 側の rpact と gsDesign は、上側境界値・累積α消費・必要例数のすべてが浮動小数点誤差レベルで一致します。

StageInformation raterpact 境界値 (z)gsDesign 境界値 (z)累積α消費総例数
11/33.71033.71030.000207157.51
22/32.51142.51140.012097315.02
311.99301.99300.050000472.53

α消費関数の対応表

3ツール間で同一のα消費関数を指定するための対応は以下のとおりです。

α消費関数rpact typeOfDesigngsDesign sfuSAS PROC SEQDESIGN
Lan-DeMets OBF"asOF"sfLDOFmethod=errfuncobf
Lan-DeMets Pocock"asP"sfLDPocockmethod=errfuncpoc
古典 OBF(非spending)"OF""OF"method=obf
Power family(Kim-DeMets)"asKD"sfPowermethod=errfuncpow(rho=...)
Hwang-Shih-DeCani"asHSD"sfHSDmethod=errfunchsd(gamma=...)

Futility(無益性)境界の扱い

Non-binding futility を追加するときは、3ツールの設計思想がやや異なります。

  • rpacttypeOfDesign"asOF" などに保ったまま、getDesignGroupSequential(..., typeBetaSpending = "bsOF", bindingFutility = FALSE) を追加するだけで non-binding futility が組める
  • gsDesigntest.type を 1〜6 で切り替え。test.type = 4 が非対称・non-binding futility・β-spending 指定の最も標準的な形
  • SASdesign 文に betaboundarybetaoverlap=nooverlap を追加し、futility の β-spending を明示

ICH E9(R1) でも non-binding futility の方が α-spending を将来の解析で温存できる点が推奨されています。実務では non-binding を選ぶケースが多数派です。

実務での使い分け

🔑 実務ポイント
プロトコル / SAP記載・FDA/PMDA提出:SAS PROC SEQDESIGN(validated environmentで再現性が担保される)
シミュレーションベースの探索:rpact(getSimulationMeans() / getSimulationSurvival() が強力で速い)
慣れ・既存資産・社内マクロ:gsDesign(書籍・社内QCマクロが揃っているなら継続が合理的)
QC原則:「rpact + SAS」または「gsDesign + SAS」の2ツール独立実装で境界値の数値一致を確認するのがDouble Programming の現代的なベストプラクティス

まとめ

本記事では、Group Sequential Design の Lan-DeMets OBF型 α-spending デザイン(K=3、両側 α=0.05、power=0.90)を rpact / gsDesign / SAS PROC SEQDESIGN の3ツールで実装し、R側で境界値(3.7103 / 2.5114 / 1.9930)と総例数(472.53)が浮動小数点誤差レベルで一致することを確認しました。SAS では method=errfuncobf を指定すれば同一の数値が得られ、method=obf(古典 OBF)と取り違えないことが極めて重要になります。

3ツールの違いは「思想と書きやすさ」であり、最終的なアウトプットは同じです。製薬実務では「規制提出はSAS、社内検討は rpact」という二刀流が現代的な実装パターンになっており、独立実装による境界値のクロスチェックが Double Programming の品質保証として大きな強みになります。

次回は「rpact の getSimulationMeans() を使った中間解析シミュレーション」を紹介します。Conditional Power や Promising Zone の評価まで踏み込み、本記事の理論的デザインを実データ生成プロセスで検証していただければと思います。

📚 この記事をより深く理解するための参考書籍

群逐次デザインを体系的に学びたい方に、定番書籍をご紹介します。

臨床試験のデザインと解析
製薬業界の生物統計家にとって定番の入門〜中級書。群逐次デザイン・適応的デザインの基礎から、ICH E9 ガイドラインに準拠した臨床試験設計の考え方まで、本記事で扱った中間解析の文脈を理解する土台として最適です。

英語学術リファレンス(参考文献)

群逐次デザインの数理を体系的に学ぶ国際的な定番書として、以下の2冊も併せて紹介します(楽天ブックスでの取扱はないため、Amazon等を参照ください)。

関連記事・次のステップ

【完全理解】ICH E9「臨床試験の統計的原則」と補遺(Estimand)を徹底解説E9 本体と補遺を統合的に理解できるように、図解とテンプレートを交えて徹底的に解説...
MMRM(反復測定混合モデル)と多重代入法の組み合わせ解析 ― RとSASによる実装ガイド ―MMRMと多重代入法を組み合わせる3つのパターン(補助変数活用・MNAR感度分析・複雑欠測構造)をRのmice+mmrmパッケージとSASのPROC MI+PROC MIXEDで実装する方法を、コード・出力・解釈の3点セットで解説します。...
ABOUT ME
tomokichi
外資系製薬会社で生物統計家として働ている1児のパパ。生物統計家とは何か、どのようなスキルが必要か、何を行っているのかを共有していきたいと思っております!生物統計に関する最新情報を皆様にお届けすべく、日々奮闘中です。趣味は筋トレ、温泉巡り、家族と散歩。