Network Meta-analysisをOpenBUGSで

Network Meta-analysisもだいぶ普及してきているけど、Arm-based modelというのが出てきて、今までの相対的効果指標を統合するという考え方がチャレンジを受けたような状態になっていると思う。

今までの主流はContrast-based modelですよね。

そうなんだ。しかも、ベースラインリスクについは、外部のデータを用いることが勧められていたりする。Dias SたちはそれをBaseline modelと呼んでいる*。

ランダム化比較試験の対照群のデータをそのまま使わない方がいいという考え方にも一理ある。ランダム化比較試験は対象者がセレクトされているから、Real worldでは違う絶対リスクである可能性は高いと考えられるから。しかも、個人個人はリスクが異なるから、リスク比のような相対的効果指標をメタアナリシスで統合して、それを適用して絶対効果を考えた方がいいという考えは理解できる。しかし、一方で絶対リスクをどのデータから求めるべきか?なかなか簡単にはいかない。

リスク比のような相対的効果指標の値はベースラインリスクが変わっても大きくは変動しないということが経験的データでも示されていて、メタアナリシスで統合されるそれぞれの研究のベースラインリスクが異なっていても相対的効果指標はほぼ同じになるはずだからそれを統合したほうがいいと思われて来た。 

単純に論理的にのみ考えると、Arm-based modelは研究ごとのランダム割り付けを無視することになるという批判も正しいようにも思えるけど、実際にはそうでもないという反論もあって一概にはそうは言えないでしょう**。

まずはZhang J, et al: Network meta-analysis of randomized clinical trials: reporting the proper summaries. Clin Trials 2014;11:246-62. PMID: 24096635で出てくるArm-based modelのネットワークメタアナリシスのためのBUGSコードとデータ部分を示します。(こちらの論文もよく書かれています:Zhang J, et al: Bayesian hierarchical models for network meta-analysis incorporating nonignorable missingness. Stat Methods Med Res 2017;26:2227-2243. PMID: 26220535)

今日の目的はOpenBUGSを動かしてネットワークメタアナリシスを実行することなんだけど、このArm-based modelのネットワークメタアナリシスをやってみようと思う。OpenBUGSの使い方の第一歩は以前投稿しました。

(参考文献:
*Dias S, Ades AE, Welton NJ, Jansen JP and Sutton AJ: Network Meta-Analysis for Decision Making. 2018, John Wiley & Sons Ltd.
**Hong H, Chu H, Zhang J, Carlin BP: Rejoinder to the discussion of “a Bayesian missing data framework for generalized multiple outcome mixed treatment comparisons,” by S. Dias and A. E. Ades. Res Synth Methods 2016;7:29-33. PMID: 26461816

model {
for(i in 1:tS) {
p[i]<-phi(mu[t[i]]+ vi[s[i], t[i]]) # model
r[i]~dbin(p[i], totaln[i]) # binomial likelihood
}
for(j in 1:sN){
vi[j, 1:tN]~dmnorm(mn[1:tN], T[1:tN,1:tN]) # multivariate normal distribution
}
invT[1:tN, 1:tN]<-inverse(T[,])
for (j in 1:tN){
mu[j]~dnorm(0, 0.001)
sigma[j]<-sqrt(invT[j, j])
probt[j]<-phi(mu[j]/sqrt(1+invT[j, j]))
#population-averaged treatment specific event rate
}
T[1:tN,1:tN]~dwish(R[1:tN, 1:tN], tN) # Wishart prior
for (k in 1:tN) {
rk[k]<- tN+1-rank(probt[],k) # ranking
best[k]<-equals(rk[k],1) # prob {treatment k is best}
}
for (j in 1:tN){ # calculation of RR, RD and OR
for (k in (j+1):tN){
RR[j, k] <- probt[k]/probt[j]
RD[j, k] <- probt[k]-probt[j]
OR[j, k] <- probt[k]/(1-probt[k])/probt[j]*(1-probt[j])
}
}
}
#DATA
list(tN=4,sN=24,tS=50,mn=c(0, 0, 0, 0),R=structure(.Data=c(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1),.Dim=c(4,4)))
s[] t[] r[] totaln[]
1 1 9 140
1 3 23 140
1 4 10 138
2 2 11 78
2 3 12 85
2 4 29 170
3 1 75 731
3 3 363 714
4 1 2 106
4 3 9 205
5 1 58 549
5 3 237 1561
6 1 0 33
6 3 9 48
7 1 3 100
7 3 31 98
8 1 1 31
8 3 26 95
9 1 6 39
9 3 17 77
10 1 79 702
10 2 77 694
11 1 18 671
11 2 21 535
12 1 64 642
12 3 107 761
13 1 5 62
13 3 8 90
14 1 20 234
14 3 34 237
15 1 0 20
15 4 9 20
16 1 8 116
16 2 19 146
17 1 95 1107
17 3 134 1031
18 1 15 187
18 3 35 504
19 1 78 584
19 3 73 675
20 1 69 1177
20 3 54 888
21 2 20 49
21 3 16 43
22 2 7 66
22 4 32 127
23 3 12 76
23 4 20 74
24 3 9 55
24 4 3 26
END

上のブロックをすべて選択して、コピーして、OpenBUGSを立ち上げて、FileメニューからNewを選んで、エディター画面に貼り付けました。

そうそう。そしたら、下の図のように、ModelメニューからSpecification…を選んで、Specification Toolを表示させ、コードのmodelの文字列を選択して反転した状態で、Specification Toolのcheck modelボタンをクリックします。

check model

ボトムバーにmodel is syntactically correctと表示されました。確か次のステップはデータの読み込み、load dataでしたよね。

そうそう。#DATAのlistの文字列を選択して反転させて、Specification Toolのload dataボタンをクリックしましょう。

listをダブルクリックしたら、Specification Toolのload dataボタンがアクティブになりました。クリックしました。あっ、ボトムバーにdata loadedと表示されました。

load data

それでは次に解析対象のデータを読み込ませます。このデータはRのパッケージであるpcnetmetaやいろんなパッケージに付属している禁煙治療のランダム化比較のデータです。
研究数は24件、治療の数は4種類(1) no contact (NC); 2) self-help (SH); 3) individual counselling (IC); 4) group counselling (GC)で、治療アームの数は50です。一行がひとつの治療アームです。コードの#DATA中のtNが治療の数、sNが研究数、tSが比較ペアの数、に対する変数名になってます。治療の種類は次のデータ部分のt[]という変数に1~4の整数で指定されています。研究番号は同じくs[]という変数で表してます。
このデータソースはHasselblad V (1998) “Meta-analysis of multitreatment studies.” Med Decis Making 18(1), 37–43. だそうです。

なるほど。残りのデータは表形式みたいですね。確か、Excelで用意して、コピーして、OpenBUGSのEditメニューからPaste Special…でPlain Textで貼り付けるんでしたね。

その通り。で、s[]から一番下のENDの最後まで選択して、反転させ、Specification Toolのload dataボタンをクリックしてください。

やりました。ボトムバーにdata loadedと表示されたので、Specification Toolのcompileボタンをクリックします。
ボトムバーにmodel compiledと出ました。
load initsとgen initsボタンがアクティブになりましたね。

今回は、初期値の設定のためのデータを特に用意していません。事前分布の値priorをサンプリングする場合、幅広い分布の場合、初期値を設定しないと、非常にはじっこの方の値が得られた場合、Markov Chain Monte Carlo (MCMC)によるGibbsサンプリングがうまく動かなくなることがあるので、そのような場合は、初期値の設定用のデータを用意した方がいいです。書き方は、#DATAのlist()と同じような書き方です。
今回は、T[1:tN,1:tN]~dwish(R[1:tN, 1:tN], tN) # Wishart priorのコードの部分で、マトリックスデータRからWishart分布のランダムサンプリングを行って、マトリックスTに格納する操作をしているので、いずれにせよgen initsの実行が必要になります。load initsなしで、gen initsを実行すると、すべてのランダムサンプリングが実行され、それらの値からMCMCが開始されることになります。

gen initsボタンをクリックしたら、ボトムバーにinitial values generated. model initializedと出ました。
次は、ModelメニューからUpdate…を選んで、Update Toolでupdatesの回数を設定するんでしたね。10000回に設定してみました。それで、updateボタンをクリックしてバーンインを実行します。

Update Tool

あっという間にバーンインが終了しました。

次は、サンプリングした値を記録する変数nodeを設定するんでしたね。InferenceメニューからSamples…を選んで、Sample Monitor Toolを表示して、nodeの右のフィールドに、probtと入力して、setボタンをクリックします。続けて、RR、RD、OR、rk、bestと入力して順次setボタンをクリックしました。全部で6個の変数です。
probtは各治療群の絶対リスクAbsolute risk、RRは各治療ペアでのリスク比、RDは同じくリスク差、ORはオッズ比、rkは各介入が1、2位…の確率、bestは各介入が最善である確率ですね。

その通り。それでは、サンプリングの個数を50000に設定して、つまり、Update Toolのupdatesを50000に変えて、updateボタンをクリックしましょう。

今度は30秒くらいかかりました。結果を見るには、Sample Monitor Toolでnodeのフィールドに*を入力してstatsボタンをクリックするんでしたね。これで、記録された全部の変数nodeの平均値、中央値、95%確信区間などの値が表示されるはずですよね。
出ました。

この結果で、Arm-based modelの特徴として、各治療群の絶対リスクAbsolute riskが得られるということがあげられます。このデータでは、probtの値が大きい方がよい結果です。つまり禁煙成功率が高いということです。
治療4が一番成績がいいことが分かりますね。これはGroup counsellingが禁煙効果が最も高いということですね。best[4]の平均値が0.6667なので、治療4が最善である確率がおよそ0.67であることが分かります。

なるほど、RR, OR, RDについてはすべてのペア比較の値が出てますね。
InferenceメニューからComparison Tool…を選んで、Comparison Toolを表示して、nodeにRRと入力して、caterpillarプロットを表示してみました。プロットを右クリックして、Propertiesからフォントを変えたりしてみました。
probtとRRのdensity(確率密度分布)も表示してみました。

density

リスク比はそのままだと、正規分布ではないですね。対数変換すると左右対称の分布になるはずです。

さて、今回はArm-based modelを用いたNetwork Meta-analysisをOpenBUGSで行いました。同じ解析をRのパッケージであるpcnetmetaを使って実行することができます。同じ結果が得られるはずです。nma.ab.bin()という関数を使うんだけれど、model=”het_cor”にした場合、今回のモデルと同じになります。pcnetmetaでは、下のような、Network Graphも作成できます。

pcnetmetaだけでなく、RのパッケージのプログラムやデータファイルはGitHubで見られるんですね。これってすごいですね。

今回は、OpenBUGSの動かし方についての説明だけで、Network Meta-analysisの統計学的モデルの説明はしなかったけれど、本当はそっちが重要ですね。Arm-based modelは今までの、通常のペア比較だけのメタアナリシスに対しても適用できて、しかも単一群のつまりSingle-armのコホート研究や疾患レジストリーのデータなども活用できる可能性がある。Zhang J, et al: Bayesian hierarchical methods for meta-analysis combining randomized-controlled and single-arm studies. Stat Methods Med Res 2019;28:1293-1310. PMID: 29433407の論文でわかるよ。それと、間接比較の際に、欠損値の補完という考えを適用するというHong Pらの方法も画期的ですね。Hong H, et al: A Bayesian missing data framework for generalized multiple outcome mixed treatment comparisons. Res Synth Methods 2016;7:6-22. PMID: 26536149

これはすごい進歩ですね。本当に。まだまだ議論が続きそうな気配ですね。問題は、直接比較と間接比較のインコヒレンスだけではないですね。

最後にArm-based modelとContrast-based modelを式で表したものを見せるね。

Arm-based model
Contrast-based model

OpenBUGSの使い方:第一歩

ネットワークメタアナリシスって複雑そうですね。

比較する介入が3つ以上はあるからね。原理はペア比較のメタアナリシスと同じなんだけど。

BUGSを使う場合が多いみたいだし、それも難しそうな感じ。BUGSってBayesian inference using Gibbs Samplingのことでしょ。OpenBUGSを使うっていうところでハードルが高いかな。まずは、OpenBUGSって何か知りたいな。

だいたいベイジアンて何だかわからないかもしれないね。でもOpenBUGSを動かして解析結果を得るところまではだれでもできるはず。Network Meta-analysisにはOpenBGUSを使うのが一般的だし、コードもいっぱい発表されているから、全部自分で書かなくてもそれを使って解析ができるようになっている。だから使えるようになりたいですよね。

まずはPCでランダムサンプリングができるということがわかる必要があるんだ。それが確率的シミュレーションの基だし、ベイズ推定Bayesian inferenceで用いるMarkov Chain Monte Carlo (MCMC) simulationの要だから。それをOpenBGUSで実行しながら、OpenBUGSの使い方を見てみよう。

たとえば、BUGSのコード、つまりプログラムで

mu~dnorm(0,0.0001)

って書いてある意味わかる?

dはdistributionで分布という意味でしょう。normは正規分布normal distributionのことでしょう。dnorm()は()がついているので、関数という意味で。。。0が平均値、0.0001は標準偏差か分散か、たしかBUGSでは分散の逆数つまり精度で指定するはず。だから、平均値0、精度0.0001つまり分散なら10,000、標準偏差なら100の正規分布からランダムサンプルを1個得て、変数muに格納するという意味ですよね。

そうそう、その通り。関数なんてよく知ってるね。0と0.0001は関数に与える引数(ひきすう)だよね。

そうですね。もしこのコードを繰り返し実行するとmuは0付近の値が一番多くなるけど、標準偏差が100だから、かなり範囲の広い値が得られますね。そうでしょう。

OpenBUGSをインストールして実際に動かしてみよう。Front pageからサイドバーのDownloadsを開いてダウンロードし、インストールする。通常のWindows用のソフトウェアと同じ。

インストールしてOpenBUGSを起動して、FileメニューからNewを選ぶとEditor画面が出てきますね。

そうそう。そこにこう書き込んでみて。
#Random sampling
model{
mu~dnorm(0,0.0001)
}

こんな風にmodel{ }の{ }の中に動かすコードを書き込みます。今回はしないけど、データや初期値はその外側に書きます。コメントは#に続けて書きます。

Attributesメニューからフォントを12 Pointにして、字を大きく表示するようにしてから、書き込みました。

そうこれでいいね。

このコードを動かす手順を説明するね。まず、ModelメニューからSpecification…を選びます。そうするとSpecification Toolの画面が出てきます。そしたら、コードのmodelの文字列をダブルクリックして選択した状態にします。やってみて。

こうですね。

そうそう。そしたら、check modelボタンをクリックしてこのコードを読み込ませるとともにプログラムの整合性をチェックさせます。問題なければ、Editor画面の下の枠にmodel syntactically correctとメッセージが表示されます。

あ、出ました。load dataとcompileのボタンがアクティブになりましたよ。

そうそう。今回はデータの読み込みは必要ないので、load dataは飛ばして、compileボタンをクリックします。

compileボタンをクリックしたら、下にmodel compiledと出ました。load initsとgen initsのボタンがアクティブになりましたね。initsって初期値の設定のことですか?

そうなんだ。Markov Chain Monte Carlo (MCMC) simulationをするときに最初の値を設定する必要があるんです。OpenBUGSは、普通はGibbs samplerを用いてMCMC simulationを実行するために作られているので、初期値の設定をしないと次に進めないようになっているんだ。
このEditor画面のmodel{ }の下に書き込んでおいて、それをload initsで読み込ませて設定することもできるんだけど、今回はdnorm(0,0.0001)を一回実行させて得られた値を用いることにして、gen initsボタンをクリックしましょう。gen initsはgenerate initial valuesという意味ですね。

はーい、やってみました。下の方に、initial values generated model initializedと出ました。これで、コード実行の準備ができたみたいですね。

その通り。それでは、muの値を記録するために、InferenceメニューからSamples…を選んで、Sample Monitor Toolの画面を出しましょう。

はい。こうですね。nodeって書いてありますね。OpenBUGSではvariableじゃなくて、nodeという言い方をするんですね。

そう、そこに記録したい変数の名前を入力してsetボタンをクリックします。今回は、muひとつしかないので、muと入力すると、setボタンがアクティブになるので、そのボタンをクリックするだけです。
普通は、もっとたくさん記録したい変数があるので、コードを眺めながら、設定作業を繰り返すことになります。
記録するという意味は、ランダムサンプリングした値を後で出てくるupdateの数だけ、全部記録するという意味です。その値から、平均値を計算したり、分布を見たりすることになります。
普通のMCMCの場合は、このnodeの設定をする前に、Burn-inという、記録しないで、MCMCを実行させ、平衡状態に達した後にnodeを設定します。今回は、そのステップは飛ばして、最初から記録させます。

はい、muと入力してsetしました。setボタンをクリックするとnodeのフィールドが空になって、下のボタンが全部すぐinactiveになりますね。

そうそう。連続してnodeの設定することがやりやすいようになっているんだね。設定したnode (変数名)はnodeのフィールドの右にあるプルダウンメニューを開くと確認できます。

今度は、いよいよランダムサンプリングを実行するんだけれど、ModelメニューからUpdate…を選んで、Update Toolの画面を出してみて。そのupdatesというところに、ランダムサンプリングを何回実行するか、つまり何個ランダムサンプルを得るかを設定するんだ。

こうですね。デフォルトではupdatesが1000になってますね。今回は、10000にしてやってみましょうか。

多くの場合、1万から5万回の設定で十分みたいですね。多くすると処理に時間がかかります。モデルが複雑で、nodeの数が多いと何分もかかることはよくあることです。

updates 10000でupdateボタンをクリックして実行しました。あっという間に終了しました。下の方に、6秒かかったと出てます。これで、平均値0、標準偏差100の正規分布から、1万個のランダムサンプルが得られ、変数muに格納されたということですね。

そうですね。実際にランダムサンプリングされた値を見てみましょう。その後に、分布、平均値、中央値、95%確信区間などのデータを見ることにしましょう。
Sample Monitor Tool画面で、nodeのプルダウンメニューを開いて、muを選択してみてください。muと入力してもいいです。

nodeの下のボタンがアクティブになりましたね。statsとdensityとcodaのボタンもアクティブになりました。

そこで、codaのボタンをクリックするとランダムサンプリングされた値が表示されます。ランダムサンプリングってどういうことなのか分かると思うので、見てみましょう。

なんか二つ出てきました。ウインドウが重なるので、その部分だけ出すとこんな感じです。CODA indexとCODAchain 1っていう名前がついてますね。
CODAchain 1に表示されている値を見ると、バラバラですね。本当にランダムな感じですね。平均値0の正規分布だから、0前後の値が多いはずですよね。

CODAってConvergence Diagnostic and Output Analysisのことらしいんだけど、Rのパッケージでcoda: Output Analysis and Diagnostics for MCMCというのがあって、それを使って、このデータを解析することもできるんです。
今回は変数一つだけなので、CODA indexにはmuという変数は1行目から10000行目までの値だということしか書かれていないですね。別の例を見せるけど、それぞれの変数のサンプリングされた値がどの行からどの行までかという情報が含まれています。
C_new 1 20000
C_overall 20001 40000
LAMBDA 40001 60000
S_new 60001 80000
S_overall 80001 100000
THETA 100001 120000

CODA indexもCODAchain 1もそのウインドウを選択して、FileメニューからSave As…でファイルの種類をPlain text(*.txt)にしてテキストファイルとして保存し、あとで利用することもできます。Rからread.table( )で読み込んで解析もできます。CODA indexはdataframeとして行と列の位置を指定して CODAchainの方は数値型のvectorとして、何番目か位置を指定して値を読み出すことができるんだ。

Rはオープンソースウェアで統計解析に広く用いられているのは知ってるよね。もしRで同じことをするなら、mu=rnorm(10000,0,100)を実行するだけで、一瞬で1万個のランダムサンプルが得られるんだけど、今はOpenBUGSの勉強。

さてそれでは、分布をみてみましょうね。densityボタンをクリックしたらグラフが出てきました。statsボタンもクリックしてみました。

グラフを見ると平均値0で標準偏差100の正規分布だとわかりますね。Node statisticsの実際の値を見るとわずかな誤差はあるけど、meanはほぼ0、sdはほぼ100になってますね。updatesをもっと増やすと、さらに正確な値になるでしょう。この分布を代表する値が得られていることが実感できるね。

おもしろいですね。平均値と標準偏差の値を設定するとその正規分布からランダムサンプルを得るシミュレーションが簡単にできるんですね。

さてそれじゃ、load dataとload initsも試してみようか。load dataで平均値と標準偏差の値を設定して、精度は標準偏差の二乗分の1を計算させて、muの初期値は0に設定して、updatesは50000にしてやってみよう。

解析に必要な3つのウインドウは同時に表示できるので、今度はModelメニューからSpecification…、InferenceメニューからSamples…、さらにModelメニューからUpdate…を選んで、Specification Tool、Sample Monitor Tool、Update Toolの3つのウインドウを表示させてから以下の操作をやってみよう。

操作の順序は同じですね。順番に、
1. コードのmodel部分をダブルクリックして選択したらcheck modelのボタンをクリックし、
2. 次に#DATAのlistという部分をダブルクリックして選択してから、load dataボタンをクリックする。
3. 次に、compileボタンをクリックして、
4. 今度は#INITSのlistという部分をダブルクリックして選択してから、load initsボタンをクリックする。
5. 次に、Sample Monitor Toolでnodeにmuと入力して、setボタンをクリックする。
6. Update Toolでupdatesを今度は50000にして、
7. updateボタンをクリックする。ここで少し時間がかかる。
8. シミュレーションが終了したら、Sample Monitor Toolでnodeにmuと入力して、density, stats, codaのボタンをクリックして、結果を見る。

そうそう。コードはこんな風になっているんだ。

#Random sampling
model{
mu~dnorm(A,prec)
prec<-pow(S,-2)
}
#INITS
list(mu=0)
#DATA
list(A=0, S=100)

このコードはEditor画面を選択して、FileメニューからSave…あるいはSave As…でOpenBUGSの形式であるodcあるいはテキストファイル形式で保存できます。

なるほど、31秒で終了しましたね。結果はほとんど同じですね。でも分布の曲線がなめらかになっている。

コードを見ると、標準偏差Sの2乗分の1を計算して、つまり分散の逆数を計算して、precという変数に代入するコードが追加されていて、<-って書かれていますね。muのところも、dnorm( )に平均値はA、精度はprecが引数として設定されてますね。~はランダムサンプルを代入、<-はその値を代入するんですね。

SとAの値は、データとしてlist形式で与えられているんですね。標準偏差の方がわかりやすいからこっちの方がいいですね。

list部分をダブルクリックして選択してからload dataボタンをクリックすると値が設定されるわけですね。listの中はコンマで区切って複数の変数の設定ができるんですね。それと=で代入が行われるんですね。コードの中では、<-を使うのと違います。

muの初期値も同じように設定したということですね。

なんかすごいですね。OpenBGUSの操作が少し分かってきたので、次は、Network Meta-analysisをやってみたいです。

続きはこちら。

Bayesian meta-analysis of DTA with imperfect reference standard

診断精度研究Diagnostic Test Accuracy (DTA) Studyでは参照基準が完全であること、すなわち参照基準の感度・特異度が100%であることを前提として、インデックス診断法の感度・特異度を求めているが、実際には参照基準が不完全な場合が多い。 参照基準が不完全な場合には、参照基準で陽性と判定された例には、偽陽性の例が含まれるため疾患群には非疾患群の一部が含まれるとともに、陰性と判定された例には、偽陰性の例が含まれるため非疾患群に疾患群の一部が含まれてしまう。そのため、有病率を直接知ることができなくなるとともに、参照基準で分類された疾患群、非疾患群における評価診断法の感度・特異度は真の値の推定値とはなりえないことになる。

また、メタアナリシスで感度・特異度の統合値を算出する場合、研究によって異なる参照基準が用いられている場合もある。また、インデックス診断法と参照基準の間に相関がある場合はそれによる値の調整が必要である。このような場合に対処可能な、ベイジアンアプローチによるメタアナリシスの手法、BUGSコード、RスクリプトがDendukuri Nらによって報告されている。Nandini Dendukuriは自身のウェブサイトでこれらの情報を公開している。

Dendukuri N, Schiller I, Joseph L, Pai M: Bayesian meta-analysis of the accuracy of a test for tuberculous pleuritis in the absence of a gold standard reference. Biometrics 2012;68:1285-93. PMID: 22568612

Dendukuri N, Joseph L: Bayesian approaches to modeling the conditional dependence between multiple diagnostic tests. Biometrics 2001;57:158-67. PMID: 11252592

彼女の作成したBUGSコード、Rスクリプトにさらに、Forest plotを作成するRスクリプトを追加し、データをExcelで用意すれば、一度に解析を実行し、結果を出力するウェブツールを用意した。useRsのメタアナリシスの#5. Dendukuri Nのモデルを用いるR、BRugs、OpenBUGSによる診断精度(Diagnostic Test Accuracy, DTA)研究のベイジアンメタアナリシスである。実際のデータ処理は自分のPCでRとOpenBUGSで行うので、あらかじめRとOpenBUGSのインストールが必要で、さらにRのパッケージでtcltk2、BRugs、forestplotが必要である。これらのパッケージはPのスクリプトを最初にRで実行すれば自動でインストールしてくれる。 これらのパッケージの作者その他の情報についてはuseRsを参照していただきたい。

これらについては以前、国際医学情報センターの医学情報誌のあいみっくに発表しているのでそれらも参照されたい。
森實敏夫:医学統計学シリーズ第46回 RとOpenBUGSによる診断法のベイジアンメタアナリシスからForest plot作成まで。2018年6月。
森實敏夫:医学統計学シリーズ 第26回 参照基準が不完全な場合の診断法のメタアナリシス。2013年9月。
森實敏夫:医学統計学シリーズ 第25回 診断法のベイジアンメタアナリシス。2013年6月。

比較効果研究CERと診療ガイドライン作成

比較効果研究Comparative Effectiveness Research (CER)のNAM National Academy of Medicine (旧IOM Institute of Medicine)の定義は、“比較効果研究CERは臨床状態の予防、診断、治療、モニターのためあるいはケアの供給を改善するための方法の選択肢の益と害を比較するエビデンスの生成と統合を行うことである。CERの目的は個人および集団の両方で、消費者、臨床家、購入者と政策決定者が、ヘルスケアを改善するであろう、情報を与えられた上での決断を支援することである。”です。以前の投稿で述べたとおりです。

一方、診療ガイドラインのMindsの定義は、WHOやGRADE Working groupと同じですが、”診療上の重要度の高い医療行為について、エビデンスのシステマティックレビューとその総体評価、益と害のバランスなどを考量して、患者と医療者の意思決定を支援するために最適と考えられる推奨を提示する文書”です。(Minds診療ガイドライン作成マニュアル2017」)

CERは一次研究だけでなくエビデンスの統合も含まれます。つまり、システマティックレビュー/メタアナリシスもCERになる可能性があります。CERの目的のひとつは”個人および集団の両方で、…情報を与えられた上での決断を支援すること”になっています。ここには”推奨”という言葉は出てきませんが、”決断を支援する”、つまり”意思決定を支援する”ことが目的であることが明確に述べられています。

ひとつのクリニカルクエスチョンを取り上げてみると、診療ガイドライン作成における、システマティックレビューまでの過程をひとつのCERと呼ぶことにはあまり異論はないのではないかと思います*。また、患者さんの参加という点でもCERと共通点があります。推奨作成の過程も科学的に進めることができるのであれば、推奨も含めてひとつのCERであると言っていいのではないでしょうか。このような考えを認めるのであれば、”診療ガイドライン作成はCERを行うことである”ということになり、診療ガイドライン作成に参加され尽力された方の学問的業績として取り扱うべきであるということになります。

システマティックレビュー/メタアナリシスの論文として発表するだけでなく、決断分析なども含めた推奨までの過程をCERの論文として発表することを今後推進すべきではないでしょうか。そうすることで、推奨作成の過程も含めて、ピアレビューを受けたうえで、出版され、それらの蓄積を束ねる形で、診療ガイドラインを作成することが可能になります。

文献:——–
Asche CV ed.: Applying Comparative Effectiveness Data to Medical Decision Making: A Practical Guide. 2016, Adis (Springer International Publishing Switzerland) この本にはCERの定義について、IOMだけでなく、NIH、AHRQ、PCORI、Federal Coordinating Council for Comparative Effectiveness Researchの定義も記載されています。

*もともとIOMは2011年の時点で、システマティックレビューの定義のなかで、システマティックレビューは”scientific investigation”科学的研究であると述べています。 ”A systematic review is a scientific investigation that focuses on a specific question and uses explicit, preplanned scientific methods to identify, select, assess, and summarize the findings of individual, relevant studies. ” (Clinical Practice Guidelines We Can Trust, 2011) また、多くのシステマティックレビュー/メタアナリシスの論文がさまざなジャーナルに発表されていて、システマティックレビュー/メタアナリシスは学問的な活動の成果であることについては異論はないと思います。さらに、CERの条件にあえば、CERとしても成立します。