ランダム効果モデルによるメタアナリシスの予測区間Prediction Interval

メタアナリシスでは複数の研究の効果推定値の統合値とその95%信頼区間が計算されます。ランダム効果モデルでは研究間のばらつきの指標としてτ2値が計算され、予測区間Prediction Intervalの計算は統合値の分散にτ2(タウ二乗)を加算した値を元に計算されます。そのため予測区間は信頼区間よりも幅広くなり、τ2が大きいほど、またI2が大きいほどその差が大きくなります。ただし、予測区間に意味があるのはランダム効果モデルの場合です。

また信頼区間は正規分布を元に計算するのが一般的で、95 %信頼区間であればZ値1.96を統合値の標準誤差に掛け算して±して計算します。一方、予測区間の場合も、正規分布を用いることが可能ですが、正規分布ではなくt分布に基づいて計算することが一般的で、研究数-1の自由度のt分布におけるp = 0.975(累積確率が0.975)のt値を統合値の標準誤差に掛け算して±して計算します。Rのメタアナリシス用のパッケージであるmetaでのmetabin等の関数のデフォルトの設定は、t分布を用いる様になっています。

信頼区間に正規分布、予測区間にt分布を用いると、τ2値が0の場合でも、これら二つの区間は違う値になり、t分布の方が幅が広くなります。もし、両方とも正規分布あるいはt分布を用いれば、τ2値が0の場合は、同じ値になるはずです。また、τ2値の計算にDersimonian-Laird法を用いる場合と、REML(Restricted Maximum Likelihood)法を用いる場合でも異なる値になる可能性があります。(現在は、REML法の使用が推奨されています。)

Rのメタアナリシス用のパッケージであるmetaforでは予測区間の計算はrma関数の結果に対してpredict関数で処理することで行われますが、デフォルトでは正規分布に基づいて計算されるようになっています。metaforの場合は、rma関数で引数test=”t”に設定すると、信頼区間がt分布に基づいて計算され、その結果をpredict関数で処理するとt分布に基づく予測区間が得られます。信頼区間をデフォルトの設定で正規分布に基づいて計算した場合、予測区間をt分布に基づいて計算するには自分で計算する必要があります。

正規分布の場合の計算式は以下のとおりですが、t分布の場合は、z1-α/2をt1-α/2に置き換えて計算します。t分布の自由度は、研究数をkとした場合k – 1です。95%予測区間の場合は、α=0.05です。

metaforの場合、例えばrma関数で処理した結果を変数resに格納したとすると、t分布に基づく予測区間の計算は以下のスクリプトで計算できます。resから統合値b、その標準誤差se、τ2値 tau2、研究数kを得て、qt関数で得たt値 tvalを合わせて95%予測区間を計算します。この例は、リスク比の場合なので、b、se、τ2値は対数スケール上で計算されているので、変数convlogを1に設定し、上限値uppert、下限値lowertからExponentialを計算し、predupt、predlowtを計算しています。

#Prediction Interval based on t-distribution.
mu_hat = res$b
se_mu = res$se
tau2 = res$tau2
k = res$k
tval = qt(0.975, df = k - 1)
lowert = mu_hat - tval * sqrt(se_mu^2 + tau2)
uppert = mu_hat + tval * sqrt(se_mu^2 + tau2)
predlwt=lowert
predupt=uppert
if(convlog==1){
predlwt=exp(lowert)
predupt=exp(uppert)
}

すでに述べたように、τ2値が0の場合は、95%信頼区間も95%予測区間も同じ正規分布、あるいはt分布を用いて計算すれば同じ値になるはずです。しかし、例えばmetaの場合であれば、デフォルトでは信頼区間は正規分布で予測分布はt分布なので、同じ値にはなりません。

Cochrane Handbook for Systematic Reviews of Interventionsによるとメタアナリシスの結果を提示する際に、統合値の信頼区間(Confidence Interval)に加えて予測区間(Prediction Interval)を含めることは、必須とまでは明記されていませんが、特にランダム効果モデルを用いたメタアナリシスにおいては、それを含めることが強く推奨されており、適切でない解釈を避けるために重要であるとされています。ただし、ソースは、研究数が適切(例:5つ以上)で、ファンネルプロットに明確な非対称性がない場合に、予測区間の使用を推奨しています。そして、研究数が少ない場合、予測区間は見せかけ上、広く見えたり狭く見えたりする可能性があり、問題となることがあるとされています。(10.10.4.2 Interpretation of random-effects meta-analyses)

また、metaやmetaforでは、頻度論派Frequentistの方法でメタアナリシスを実行していますので、信頼区間は真の効果推定値の分布を表しているわけではありません。同じことを繰り返したら、そのたびに異なる信頼区間の値が得られますが、95%の場合は、真の値がその間に含まれているという意味です。例えば、リスク比が1.0以上になる確率を知りたい場合、頻度論派の信頼区間に基づいて推測するのではなく、ベイジアンメタアナリシスの確信区間に基づいて推測する必要があります。前者の場合、信頼区間と確信区間がほぼ同じということを前提にしていることになります。

文献:

Higgins JP, Thompson SG, Spiegelhalter DJ: A re-evaluation of random-effects meta-analysis. J R Stat Soc Ser A Stat Soc 2009;172:137-159. doi: 10.1111/j.1467-985X.2008.00552.x PMID: 19381330
URL: https://pubmed.ncbi.nlm.nih.gov/19381330/

Cochrane Handbook for Systematic Reviews of Interventions
URL: https://www.cochrane.org/authors/handbooks-and-manuals/handbook

metafor https://cran.r-project.org/web/packages/metafor/index.html
Viechtbauer W (2010). “Conducting meta-analyses in R with the metafor package.” Journal of Statistical Software, 36(3), 1–48. doi:10.18637/jss.v036.i03.

meta https://cran.r-project.org/web/packages/meta/index.html
Balduzzi S, Rücker G, Schwarzer G (2019). “How to perform a meta-analysis with R: a practical tutorial.” Evidence-Based Mental Health, 153–160.

ランダム効果モデルのメタアナリシスの結果を臨床に適用する場合、Prediction Intervalも含め結果の解釈には注意が必要です。YouTube チャンネル IZ statに「メタアナリシスの臨床応用:ランダム効果モデルの解釈-ダイアログ- 」の動画を公開しています。

IZ stat URL:https://www.youtube.com/channel/UCqzzJbfQwKDvValptCAM4gg

metaを使ったメタアナリシス

Rのメタアナリシス用のパッケージmetaについて、以前の投稿で紹介しました「Copilotに聞きながらメタアナリシスを実行:metaパッケージを使って」

今回は、Excelで各研究から研究ID、メタアナリシスに必要なデータを抽出した表を作成し、そのデータからRでmetaを動かして、メタアナリシスを実行するR用のスクリプトを作成してみました。Inverse variance methodによるランダム効果モデルで、研究間の分散はREML(Restricted Maximum Likelihood)法を用いています。対応する効果指標のタイプはRR, RD, OR, HR, MD, SMDです。

Excelで作成する表は、研究ID、人数、平均値、ハザード比の自然対数などのデータと、labelのカラムに、研究IDのカラムのラベル、対照、介入の名称、アウトカム、効果指標のタイプと省略形、フォレストプロットのレイアウト(meta, RevMan5, JAMAのいずれか)、Prediction Intervalを含めるかどうか(No Prediction IntervalまたはPrediction Interval)を入力します。フォレストプロットはこれらのラベルを表示します。サンプルのExcelファイルはこちらからダウンロードできますので、右クリックしてダウンロードし、データを書き換えて使用してください。

Rを起動しておいて、新規エディタのフィールドに以下のスクリプトを貼り付け、カーソルをその行に置きます。

exdat = read.table("clipboard", sep = "\t", header = TRUE);source("https://stat.zanet.biz/useRs/scripts/with-meta-all.R")

Excelのシートを開き、データを含む範囲を選択して、コピー(Ctr+C)操作を実行し、Rにもどり、上記の一行を実行します。必要なスクリプトをウエブサーバーから読み込み、実行して、メタアナリシスの結果がコンソールに出力され、Forest plotとFunnel plotが作成されます。

Forest plot : meta形式でPrediction Intervalを含めた場合。左下に表示されるP値はQ統計値に対するもので、統合値に対するZ値、P値はコンソールに出力されます。この例では、Z=-3.97、P<0.0001でした。
Funnel plot。Begg & Mazumdarの検定の結果とEggerの検定の結果はコンソールに出力され、この例ではP=0.9028, P=0.1887でした。

さて、Mindsの評価シートでメタアナリシスに必要なデータを入力してある場合、左上セルA3(診療ガイドライン)から、右下の方の効果指標(種類)のカラムで、データを含む行までの範囲を選択して、コピー(Ctr+C)操作を実行し、Rにもどり、以下のコードのexdato=read.delim(“clipboard”,sep=”\t”,header=TRUE);を実行します。これにより、クリップボード経由で、データが変数exdatoに格納されます。そして、###Startの行から、#####Endの行までを選択し(反転した状態で)、実行します(Windowsの場合は実行ボタンをクリックするか、Ctr+R、Macはcommand+enterを押します)。メタアナリシスが実行され結果がコンソールに出力され、Forest plotとFunnel plotが作成されます。なお、クリップボードからデータを読み込む操作と、#####Start以下のスクリプトは分けて実行してください。

#Meta-analysis with meta from Minds sheet.
#Select the range A3 ~ down the effect measure column and run these scripts in R.
#Read data via clipboard from Minds sheet.
exdato=read.delim("clipboard",sep="\t",header=TRUE);

#####Start
#Reformat the data frame.
source("https://stat.zanet.biz/useRs/scripts/to_forest_metafor.R");

#Add cells to the label clumn for layout and Prediction Interval.
if(nrow(exdat)==6){
new_row <- exdat[1, ]
new_row[,] <- NA
exdat <- rbind(exdat, new_row)

}
if(nrow(exdat)==7){
new_row <- exdat[1, ]
new_row[,] <- NA
exdat <- rbind(exdat, new_row)
}

#Choose a forest plot layout: remove # of the format you want to use.
exdat$label[7] = "meta"
#exdat$label[7] = "RevMan5"
#exdat$label[7] = "JAMA"

#Choose "No Prediction Interval" or "Prediction Interval": remove # of the what you want.
exdat$label[8] = "No Prediction Interval"
#exdat$label[8] = "Prediction Interval"

#Do meta-analysis with meta to create forest plot and funnel plot.
source("https://stat.zanet.biz/useRs/scripts/with-meta-all.R")
#####End

このスクリプトではForest plotの形式は3種類から選択する必要があり、#のついていない行の形式になります。デフォルトではmetaの形式になっていますので、例えばもしRevMan5の形式にしたければ、#exdat$label[7] = “meta”と#を行頭に付け、exdat$label[7] = “RevMan5″とこちらの#は外してください。

Prediction Intervalを含めるかどうかも同じように、行頭に#が付いていない方が実行されます。デフォルトではNo Prediction Intervalになっています。もしPrediction Intervalを含めたいのであれば、#exdat$label[8] = “No Prediction Interval”と行頭に#を付け、exdat$label[8] = “Prediction Interval”とこちらの#は外してください。

RevMan5の形式のForest plot。
JAMAの形式のForest plot。

出力されたForest plotは左右が短く、上下の余白が大きめになっているので、R上で大きさを変更してから、右クリックしてコピーしてPPTやWordなどに貼り付けたり、ファイルとして保存します。Forest plotもFunnel plotも、プロットを選択して、ファイルメニューからも別名で保存からPNG、JPEG、PDF、TIFF、Postscript他の形式を選んで、保存することもできます。

なお、Funnel plotの非対称性の統計学的解析法であるEggerの検定、Beggの検定は研究数が10以上無いと実行されません。

metaではRevMan5の形式のForest plotの右側にバイアスリスク評価の結果を含めることもできるそうです。興味のある方はトライしてみて下さい。with-meta-all.Rのスクリプトを見たい場合はこちらです。

GeminiでMCQを作成する

GoogleのGemini 2.5 Flashで、Multiple-Choice Question (MCQ)多選択肢問題を作成してみます。HTMLファイルを作成し、設問に従って選択肢をクリックすると、正解かどうか分かるようにします。いわゆる、Quizクイズの作成で、作成されたHTMLファイルはウェブサーバーにアップロードして、外部からもアクセスできるようにします。

Google Chromeを開き、下の図のように右上のメニューボタンから、Geminiを開きます。

Google Workspace Business Standardを契約しているので、Gemini 2.5 Flash、2.5 Pro (preview)、Personalization (preview)が使えますが、2.5 Flashを使うことにします。

Geminiでは、今までの使用履歴が残っていて、それを前提に回答が作成されますので、チャットを新しいセッションとして始めるためには、左上の2つ目のアイコンをクリックし、チャットを新規作成をクリックしてから始めます。今回は、すでに、新しいセッションとして扱われていたので、チャットを新規作成部分はdim状態でしたので、そのままプロンプトを書き込むことにします。

まず情報ソースとして、Web pageを指定し、その内容に基づいて、MCQを作成しようと思います。そこで、以下のプロンプトをあらかじめテキストエディターで書いておき、コピペします。

https://info.zanet.biz/lec/srsz/1-rob-main/one.htm
このウェブページの情報に基づき、多選択肢問題の内、5者択一問題を作成し、インタラクティブなHTMLファイルを作成してください。
設問は「次の内、正しいものはどれか?」を基本形とします。一部は「次の内、誤りはどれか?」としてもよい。
正しい選択肢を太字にする必要はありません。
表現から正誤の判断ができないようにするため、間違いの選択肢の表現は「・・・ではない」のような否定形は可能な限り使わないようにします。
いずれかの選択肢を選ぶと、即座に、正しい場合は「正解です!」と表示します。間違っている場合は「誤りです!」と表示します。
回答を確認のボタンは不要です。
一つの問題を何回もチャレンジできるようにします。
系統的レビューではなくシステマティックレビューとしてください。
ソースに基づくという記述は不要です。
正解が選択肢の1から5の特定の番号に偏らないようにしてください。
1問1ページとし、Prev、Nextのボタンを付けてください。
ポップアップメニューで問題を移動できるようにしてください。
全部で10問作成してください。

かなり、細かく指定しています。ソースは私の担当したある講義のための学習資料で、PowerPointで作成したスライド+ノートからHTMLファイルを作成したものです。

このプロンプトを書き込み、実行すると、思考プロセスを表示となり、数分で、HTMLのフィールドにコピペ可能な形で、出力されます。コピーボタンをクリックして、NotePad++やメモ帳などに貼り付けて、そのまま、例えば、quiz-rob-c.htmのようなファイル名でファイルを保存します。拡張子は.htmまたは.htmlとします。

その内容は<!DOCTYPE html>から始まり、</html>で終わる、HTMLファイルなので、保存したファイルをダブルクリックしてブラウザーで開くとこのようになります。

これでいいように見えるのですが、選択肢を一度クリックすると変更ができないようになっていました。

プロンプトでは、”一つの問題を何回もチャレンジできるようにします。”と指示したのですが、実現されていませんでした。

そこで、より具体的な指示、”一つの問題で、一度選択肢をクリックしても、何回も変更がチャレンジできるようにしてください。”を書き込んでみます。前の指示が履歴で残っているので、このプロンプトだけで十分です。

このような回答とともに、修正されたHTMLが出力されました。これを上記のようにテキストエディターにコピペして、HTMLファイルとして保存して開くと、以下の様でした。

まず、正解の選択肢をクリックした場合です。

誤った選択肢をクリックした場合です。

これで、正解を確認しながら、別の問題へと進めていくことができます。

ここで、注目すべきは、Geminiでは一つのセッションが続いている間は、前のやり取りを前提に回答が作成されるという点です。これは非常に重要だと思います。

今回は、情報ソース、つまり、学習資料がウェブページなので、それぞれの問題の元になる箇所へのリンクをタイトル部分の問題という箇所に付けられないか聞いてみたいと思います。

すると、そのまま改訂したHTMLテキストが出力され、保存したHTMLファイルを開くと、確かに問題の所にウェブページへのリンクが付けられていました。

最後に作成したMCQをウェブページとして閲覧できるようにしました。

今回は、問題ごとにカードのように表示するようにしましたが、1ページに全部を表示する形式にもできます。

プロンプトに”全問題を1ページに表示するようにし、移動のボタンは無しにしてください。”と書き込み実行すると、以下の様な回答になりました。

そのHTMLはこちらです。

それでは、最後にチャットを新規作成して同じプロンプトで再度MCQを作成してみましょう。

最初のプロンプトでは、HTMLファイルはできないという回答になり、”前のセッションではHTMLファイルができましたよ。”とのプロンプトでは、ご希望の形式をお知らせいただければ、それに沿ったコードの生成を試みます、との回答でした。

そこで、”1つのファイルにすべてのHTML、CSS、JavaScriptを含める形式にしてください。”とのプロンプトで、最初のようにMCQのHTMLテキストが作成されました。

右側が新しく作成されたMCQです。内容が変わっています。また、形式も変わっています。設問のすべての出だしが、”次の内正しいものはどれか?:”になっていたのが亡くなっています。設問の”次の内正しいものはどれか?:”の部分は不要ですというプロンプトを追加してもよかったのですが、指示しなくてもなくなっていました。

違う問題が作成されるということは、非常に重要です。追再試験の作成にも使えると思われます。新規セッションで再度作成したMCQはこちらです。

さらに、最初のプロンプトを少し修正して、HTMLのコードを作成するように書き換えてみました。

https://info.zanet.biz/lec/srsz/1-rob-main/one.htm
このウェブページの情報に基づき、多選択肢問題の内、5者択一問題を作成し、インタラクティブなHTMLコードを作成してください。
設問は「次の内、正しいものはどれか?」を基本形とします。一部は「次の内、誤りはどれか?」としてもよい。
正しい選択肢を太字にする必要はありません。
表現から正誤の判断ができないようにするため、間違いの選択肢の表現は「・・・ではない」のような否定形は可能な限り使わないようにします。
いずれかの選択肢を選ぶと、即座に、正しい場合は「正解です!」と表示します。間違っている場合は「誤りです!」と表示します。
回答を確認のボタンは不要です。
一つの問題を何回もチャレンジできるようにします。
系統的レビューではなくシステマティックレビューとしてください。
ソースに基づくという記述は不要です。
正解が選択肢の1から5の特定の番号に偏らないようにしてください。
1問1ページとし、Prev、Nextのボタンを付けてください。
ポップアップメニューで問題を移動できるようにしてください。そのポップアップメニューは設問の右側に置いてください。
全部で10問作成してください。

このプロンプトではこのような形式になりました。

さて、情報ソースをWeb pageのURLで指定しましたが、Gemini 2.5 Flashでは、PDFファイルを指定することもできます。その場合は、用意したPDFファイルをプロンプトを入力するフィールドにドラグアンドドロップします。そして、同じようにMCQ作成のプロンプトを書き込みます(コピペします)。

このような画面になります。同じようにMCQのHTMLコードを作成してくれました。

さて、Geminiが作成したMCQの内容は最終的に人がチェックする必要がありますが、ほとんどの場合、そのまま使えるレベルです。今回の例はGeminiが作成したMCQをそのまま提示しています。なお、YouTubeの動画を直接、情報ソースとして読み込ませることはできません。

NotebookLMでは、複数のPDFファイル、YouTubeの動画、Web pageを情報ソースとしてアップロードして、同じようなプロンプトで、MCQを作成することができます。

MCQの作成は、学習資料がPDF, Web page、あるいはYouTubeの動画であれば、教える側も、学ぶ側も、可能であるということになります。これはとても重要な点だと思います。

以下はNotebookLMの利用に関しての議論です。

また、教える側は初心者レベルの質問を用意して、学ぶ側はそれを自分でプロンプトとして入力して、回答を確認する。それが済んだら、より複雑な質問を用意して、学ぶ側はそれを自分でプロンプトとして入力して、回答を確認する。それが済んだら、学ぶ側は各自自分の疑問に思うことをプロンプトで聞きながら、理解を確認するというやり方ができます。学ぶ側は、最初は知識がないので、何を質問したらいいかもわからないので、初心者レベルの質問は教える側が、用意してあげるということに意味があると思います。より複雑な質問も、教える側が用意することで、学ぶ側に教える側の観点が伝わっていくと思います。

ASReviewで重複文献を削除する方法

ASReview (エイエスレビュー)は文献選定作業を大幅に効率化できる、有力なツールであることを以前紹介しました。今回は、重複文献を削除する deduplicateの方法を紹介します。PubMed, Cochrane CENTRAL, Embase, その他の複数のデータベースを用いると、研究論文が重複していることは当然起きます。これらを自動的に除去する方法の一つです。この投稿のPDFのスライドはこちらです。

① まず、文献情報(No, Reference ID, Citation, Title, Abstractなどの情報を含む)のExcel のxlsxファイルを用意します。一行一文献で、一行目にラベルを入力します。

② コマンドプロンプトを起動します。ツールバーの検索フィールドにコマンドプロンプトと書き込むと、アイコンが表示されるので、それをクリックして起動します。

③ ASReviewをインストールします。 以下のコードをコマンドプロンプトに書き込んでEnterキーを押します。Ruquirement already satisfied:・・・・・と出力され、次のコードを待機する状態になります。

pip install asreview

もし、pythonをインストールしていない場合は、ダウンロード、インストールはこちらのサイトから。

④ Pythonを起動します。そのために、以下のコードをコマンドプロンプトに書き込んでEnterキーを押します。

python

⑤ ASReviewData関数を読み込みます。そのために、以下のコードをコマンドプロンプトに書き込んでEnterキーを押します。

from asreview import ASReviewData

⑥ 元のExcelファイルのパスを取得します。一つの方法はファイルのアイコンを右クリックしてパスのコピーを選択します。それにより、パスがクリップボードに格納されます。

⑧ 元のExcelファイルを変数datに読み込みます。まず、以下のコードをメモ帳などのテキストエディターに貼り付けて、”ファイルPath”の部分を選択して貼り付け(Ctr+V)でクリップボードに格納されているパスに置き換えます。

dat = ASReviewData.from_file("ファイルPath")


メモ帳に貼り付けてクリップボードの内容に”ファイルPath”を置き換えた例。ファイルまでのパスはそれぞれのPCによって異なります。ファイル名dce-36-with-dup.xlsx:

さらに、¥の部分を¥¥に置き換えます。編集メニューから置換を利用すると簡単です。修正したコードをコマンドプロンプトに書き込んで(コピー・貼り付け)、Enterキーを押します。これで、変数datにExcelの内容が書き込まれます。

⑨ Deduplicateを実行し結果を変数dedup_datに格納します。以下のコードをコマンドプロンプトに書き込んで、Enterキーを押します。

dedup_dat = dat.drop_duplicates()

⑩ dedup_datをExcelファイルとして保存します。

以下のコードをメモ帳に貼り付けて、”ファイルPath”を元ファイルのパスに置き換えて、ファイル名の部分を書き換えます。

dedup_dat.to_excel("ファイルPath")

例:メモ帳に貼り付けてクリップボードの内容に”ファイルPath”を置き換え、ファイル名を書き換えた例。ファイル名dce-36-without-dup.xlsx:

これで、重複文献を除外したExcelファイルが元のExcelファイルのフォルダ内にできました。

-------

コマンドプロンプトで実行するコードは以下の通りです。これらを1行ずつ実行しますが、全部を一度メモ帳にコピペして、ファイルパスの部分を書き換えてから、1行ずつコマンドプロンプトにコピペして実行するのがいいと思います。

pip install asreview
python
from asreview import ASReviewData
dat = ASReviewData.from_file("ファイルPath\\ファイル名-with-dup.xlsx")
dedup_dat = dat.drop_duplicates()
dedup_dat.to_excel("ファイルPath\\ファイル名-without-dup.xlsx")

Excelファイルを読み込むコードとExcelファイルに保存するコードの部分は、あらかじめファイルパスの部分を書き換えてから、コマンドプロンプトにコピペして実行するようにします。Excelファイルとして保存する際にファイル名を変えないと、元ファイルに上書きされるので、気を付けましょう。ファイルパスをファイルアイコンの右クリックでクリップボードに格納されたパスは区切り文字が¥(または\と表示される)一個ですが、それを¥¥二個にする必要があります。また¥は半角文字です。

重複の判定は、タイトル、抄録の類似性から行うわけですが、デフォルトでは95%の一致で除去する設定だそうです。