653 Views
March 26, 24
スライド概要
[第9回大阪SAS勉強会] 森田 祐介
SAS言語を中心として,解析業務担当者・プログラマなのコミュニティを活性化したいです
第9回大阪SAS勉強会 2024.03.22(金) 小さく始めるシミュレーション ~シミュレーションでp値の分布を確かめてみた~ Beginning Simulations on a Simple Example - Exploring the Distribution of p-values through Simulation - ノーベルファーマ株式会社 研究開発本部 データサイエンス部 森田 祐介 1
要旨 • シミュレーションは解析業務、研究および統計の学習に有用である • 簡単な事例を用いて、シミュレーションの実装方法を紹介する 2
発表内容 1. 導入 2. 実践 3. まとめ 4. おまけ 3
導入:臨床試験のシミュレーションとは • パソコン上で行う仮想的な臨床試験のこと • 乱数を利用して、様々な試験デザインをモデル化し、 試験を複数回繰り返し実行することで、 介入の有効性や安全性の成績の分布を予測する • 実際の臨床試験を行う前に、低コストで、試験結果に どの要因が、どのような影響を及ぼすか評価することで 試験デザインの性能を把握し、成功確率の向上を図る 4
導入:シミュレーションの利用事例 • 症例数設計の検算 • 特に2値アウトカムで正規分布への近似精度が悪い状況のとき • 複雑な試験デザインや解析手法の検出力(αエラー)の確認 • アダプティブデザイン • MMRMや感度分析 • 多重性の調整方法 • ベイズなど • 統計学の学習 • 社内研修で95%信頼区間、検出力、αエラーの説明に利用 5
実践:シミュレーションのシナリオ • 主要評価項目は血圧(連続量) • 実薬群 vs プラセボ群 • ベースラインからの変化量の平均値を群間比較 • 群間差は-10、変化量の標準偏差15(共通) • αエラー両側5%、検出力80% • 1群37例が必要→ • 中止や脱落は起こらない • 100,000回試験を繰り返す proc power; twosamplemeans test = diff meandiff = 10 stddev = 15 alpha = 0.05 sides = 2 power = 0.8 npergroup = . ; run; 6
実践:シミュレーションデータを作成 • データを作る部分が肝心 ★ポイント *シミュレーションデータの作成; 発生する乱数に再現性をもたせる data simdata; call streaminit(20240322);*乱数シードの設定; NperGroup = 37; do trial = 1 to 100000; ★ポイント do subjid = 1 to NperGroup; 正規分布に従う乱数を生成 trtpn = 1;*実薬; chg = rand('NORMAL', -10, 15);*mean, sd; output; trtpn = 9;*プラセボ; chg = rand('NORMAL', 0, 15);*mean, sd; output; end; end; run; 7
実践:シミュレーションデータを解析 • BYステートメントを活用して、試験ごとに解析結果を算出! *高速化のため各出力を一旦停止する; ods graphics off; ods exclude all; ods noresults; ods listing close; options nonotes; ★ポイント マクロでプロシジャを繰り返し実行 すると時間がかかる! proc ttest data = simdata ; by trial;*試験ごとに解析する; class trtpn; var chg; ods select ttests conflimits;*必要な結果だけ取得する; ods output ttests=ttests conflimits=cis; run; *各出力を再開する; ods graphics on; ods exclude none; ods results; ods listing; options notes; 8
実践:シミュレーション結果を要約 • 要約統計量や可視化を用いて、シミュレーション結果を要約! data results; merge ttests(where=(Method="Pooled")) cis(where=(Method="Pooled")) ; by trial; if probt < 0.05 then SUCCESS = 1; else SUCCESS = 0; run; 理論値0.808に近い 検出力となっている *検出力の確認; proc means data = results n mean; var SUCCESS; output out = simres(drop=_:) n = repeat mean = probability1; run; 9
実践:両側p値の分布を確認 proc univariate data = results ; var probt; run; proc sgplot data = results; histogram probt/binwidth=0.01; run; 対立仮説下(群間差=-10) ★ポイント p<0.01は別に珍しくない 帰無仮説下(群間差=0) ★ポイント 帰無仮説下ではp値は一様分布になる 10
まとめ • シミュレーションは解析業務、研究および統計の学習に有用である • 簡単な事例を用いて、シミュレーションの実装方法を紹介した • 乱数を利用する(結果の再現性のため、乱数シードを設定する) • BYステートメントで試験ごとに解析する(proc XXXX; by TRIAL;) • 高速化のため、不要な出力をオフにする(ODS出力制御) • 可視化も活用してシミュレーション結果を要約する(腕の見せどころ) 11
参考文献
おまけ:シミュレーションの勘所 • 条件にも因るが、概して計算に時間を要するので、高スペックの解析マシンが望ましい • 処理速度上、プロシジャからの出力は必要最低限に抑えるのが望ましい • プログラムの作成段階では、繰り返しの数は100~1000回くらいに抑えて、 アルゴリズムをしっかり確認する→回数を増やす • FDAのアダプティブデザインのガイダンスでは、1条件あたり10万回以上の繰り返しが推奨 • シナリオに応じた乱数生成の技術が重要 • 経時データなどは被験者内相関や欠測の考慮が必要 • Time to Eventのデータは打ち切りも考慮が必要 • シミュレーション結果の提示には、SGPLOTやSGPANELによる可視化・要約が有用 • シミュレーションは、あくまで一定の条件下の結果なので、 条件の一部が変わった場合に、結果にどう影響するかの評価も重要になってくる →多くの条件でシミュレーションすることになる →マクロ化するとよい(変更が生じうる条件をマクロパラメータ化しておく) 13