Copilotに聞きながらメタアナリシスを実行:metaパッケージを使って

まずRのメタアナリシス用のパッケージに何があるか聞いてみます。

Copilotの回答は青いブロックの右端のアイコンをクリックすると表示したり隠したりできます。

メタアナリシスのためのRのパッケージを教えて。

Rにはメタアナリシスを行うための便利なパッケージがいくつかあります。代表的なものを紹介しますね。

  • metafor: メタアナリシスのための強力なパッケージで、固定効果モデルやランダム効果モデルの適用、フォレストプロットの作成などが可能です。
  • meta: メタアナリシスのための包括的なパッケージで、異質性の評価や出版バイアスの検討など、多くの機能を備えています。
  • rmeta: よりシンプルなメタアナリシスの実装を提供するパッケージで、基本的な統計解析を行うのに適しています。

これらのパッケージを使えば、メタアナリシスのデータ統合や異質性の評価、視覚化などがスムーズに行えます。どのパッケージを選ぶかは、分析の目的や必要な機能によります。試してみたいものはありますか?

Copilotの提案の中からmetaパッケージを使ってみようと思います。二値変数アウトカムの場合のメタアナリシスを実行するスクリプトを提案してもらいましょう。

Rのmetaパッケージで二値変数アウトカムの場合のメタアナリシスを
実行し、フォレストプロット、ファンネルプロットを作成します。
分散逆数法でランダム効果モデルを用います。対照群の症例数にnc、イベント数にrc、介入群の症例数にnt、イベント数にrtという変数名を使います。プロットは新規のウインドウにそれぞれ出力してください。

meta パッケージを使って、分散逆数法 に基づくランダム効果モデルを適用し、二値変数アウトカムのメタアナリシスを実行するRスクリプトを紹介します。フォレストプロットとファンネルプロットを 新規ウインドウ に出力します。

スクリプト

# 必要なパッケージの読み込み
library(meta)

# 仮のデータセット
dat <- data.frame(
  study = c("Study 1", "Study 2", "Study 3", "Study 4", "Study 5"),
  rt = c(10, 20, 15, 25, 30),  # 介入群のイベント数
  nt = c(100, 200, 150, 250, 300),  # 介入群の総数
  rc = c(5, 15, 10, 20, 25),  # 対照群のイベント数
  nc = c(100, 200, 150, 250, 300)   # 対照群の総数
)

# メタアナリシスの実行(分散逆数法を用いたランダム効果モデル)
meta_analysis <- metabin(rt, nt, rc, nc, data = dat, 
                         studlab = study, sm = "RR", method = "Inverse", 
                         fixed = FALSE, random = TRUE)
                         common = FALSE
# メタアナリシスの結果をコンソールに出力
print(meta_analysis)

# 新規ウインドウでフォレストプロットを作成
windows()
forest(meta_analysis, xlab = "Risk Ratio", ref = 1)

# 新規ウインドウでファンネルプロットを作成
windows()
funnel(meta_analysis)

ポイント

  • metabin() 関数を使用して、二値変数アウトカムのメタアナリシスを実行。
  • sm = "RR" でリスク比(Risk Ratio)を指定。
  • method = "Inverse"分散逆数法 を適用。
  • random = TRUEランダム効果モデル を使用。
  • windows() を使って 新規ウインドウ にプロットを出力。

このスクリプトを実行すれば、分散逆数法を用いたメタアナリシスを適切に実施できます。試してみて、調整したい点があれば教えてくださいね!詳しい解説は こちら で確認できます。

仮のデータセットの作成から、メタアナリシスの実行のスクリプトがコピーできる形で提案されたのでそのままRで実行したらこのような結果になりました。τ二乗値、I二乗値、統合値に対するZ値、p値も出力されています。

metabin()関数の実行でエラーメッセージが出ています。固定効果モデルの場合fixed = FALSEではなく、common = FALSEと記述するということです。実際にそのように書き換えて実行するとエラーメッセージは出なくなりました。上のスクリプトの赤字の部分です。

フォレストプロットに提示されているp値はQ統計値に対するp値で、統合値に対するp値はコンソールに出力されている、z p-valueの方です。この例では、0.0520でした。

さて、自分のデータセットでメタアナリシスをする場合、仮のデータセットの部分を書き換えて、以下同様にスクリプトを実行するのがひとつの方法です。

Excelでデータを用意する場合、study, nc, rc, nt, rtのラベルでそれぞれのデータを入力し、データ範囲を選択して、コピー操作をして、Rで次のスクリプトを実行します。

dat = read.table("clipboard", sep = "\t", header = TRUE)

例えば、このようなデータを用意して、左上のセルから右下のセルの範囲を選択して、コピー(Ctr+C)し、Rの方で、上記のスクリプトを実行すると変数datにデータが格納され、それをdatで確認できます。それ以下は同じスクリプトを実行します。次のような結果が得られました。

それでは、ファンネルプロットの非対称性のBeggの検定、Eggerの検定はどうするか聞いてみます。

metaパッケージでファンネルプロットの非対称性のBeggの検定、
Eggerの検定のためのスクリプトは?

その部分だけを示します。

# Begg検定(順位相関検定)
begg_test <- metabias(meta_analysis, method = "rank")
print(begg_test)

# Egger検定(回帰分析による検定)
egger_test <- metabias(meta_analysis, method = "linreg")
print(egger_test)

今回の例では、これらの検定は研究数が10個以上でないとできないという、エラーメッセージが出ました。

さて、統合値に対するPrediction Intervalも出力するにはどうするか聞いてみます。

metaパッケージで統合値に対するPrediction Intervalも出力し、
フォレストプロットにも追加するにはどうしますか?

関連したところだけを以下に示します。また、addpredとなっていた引数名をpredictionに訂正してあります。


# メタアナリシスの結果をコンソールに出力(予測区間を含む)
print(meta_analysis, prediction = TRUE)

# フォレストプロットの作成(予測区間を追加)
forest(meta_analysis, xlab = "Risk Ratio", ref = 1, prediction = TRUE)

これで出力されたフォレストプロットがこちらです。

さて、今回もCopilotの提案には間違いがありました。commonとすべきところがfixedに、predictionとすべきところがaddpredになっていました。それについて次の様に聞いてみたところ、正しいスクリプトが提案されました。

addpredではないのでは?

その通りです!meta パッケージのフォレストプロットで 予測区間 (Prediction Interval, PI) を追加するには、prediction = TRUE を指定します。

予測区間を出力し、フォレストプロットに追加する方法

# 必要なパッケージの読み込み
library(meta)

# 仮のデータセット
dat <- data.frame(
  study = c("Study 1", "Study 2", "Study 3", "Study 4", "Study 5"),
  rt = c(10, 20, 15, 25, 30),  # 介入群のイベント数
  nt = c(100, 200, 150, 250, 300),  # 介入群の総数
  rc = c(5, 15, 10, 20, 25),  # 対照群のイベント数
  nc = c(100, 200, 150, 250, 300)   # 対照群の総数
)

# メタアナリシスの実行(リスク比を使用)
meta_analysis <- metabin(rt, nt, rc, nc, data = dat, 
                         studlab = study, sm = "RR", method = "Inverse", 
                         fixed = FALSE, random = TRUE)

# メタアナリシスの結果をコンソールに出力(予測区間を含む)
print(meta_analysis, prediction = TRUE)

# フォレストプロットの作成(予測区間を追加)
forest(meta_analysis, xlab = "Risk Ratio", ref = 1, prediction = TRUE)

ポイント

  • print(meta_analysis, prediction = TRUE) を指定すると、統合値の 予測区間 がコンソールに出力されます。
  • forest(meta_analysis, prediction = TRUE) を指定すると、フォレストプロットに 予測区間 が追加されます。

この方法を試してみて、さらにカスタマイズしたい点があれば教えてくださいね!詳しい解説は こちら で確認できます。

metabin()のfixedも違うのでは?

その通りです!meta パッケージの metabin() 関数では、固定効果モデルとランダム効果モデルの指定方法が fixed ではなく、common(固定効果モデル)と random(ランダム効果モデル)を使います。

正しいメタアナリシスの実行方法

# 必要なパッケージの読み込み
library(meta)

# 仮のデータセット
dat <- data.frame(
  study = c("Study 1", "Study 2", "Study 3", "Study 4", "Study 5"),
  rt = c(10, 20, 15, 25, 30),  # 介入群のイベント数
  nt = c(100, 200, 150, 250, 300),  # 介入群の総数
  rc = c(5, 15, 10, 20, 25),  # 対照群のイベント数
  nc = c(100, 200, 150, 250, 300)   # 対照群の総数
)

# メタアナリシスの実行(リスク比を使用)
meta_analysis <- metabin(rt, nt, rc, nc, data = dat, 
                         studlab = study, sm = "RR", method = "Inverse", 
                         common = FALSE, random = TRUE)

# メタアナリシスの結果をコンソールに出力(予測区間を含む)
print(meta_analysis, prediction = TRUE)

# フォレストプロットの作成(予測区間を追加)
forest(meta_analysis, xlab = "Risk Ratio", ref = 1, prediction = TRUE)

ポイント

  • common = FALSE固定効果モデルを無効化
  • random = TRUEランダム効果モデルを適用
  • print(meta_analysis, prediction = TRUE)予測区間を出力
  • forest(meta_analysis, prediction = TRUE)フォレストプロットに予測区間を追加

この方法を試してみて、さらにカスタマイズしたい点があれば教えてくださいね!詳しい解説は こちら で確認できます。

実際にRでスクリプトを実行するとエラーメッセージがでたり、思っているのと違ったことが実行されたりした場合、間違いと思われるところを指摘すると、訂正を提案してくれるようです。

最後に、forest()関数の引数refは何かを聞いてみました。

metaパッケージのforest()関数のref引数は何ですか?

meta パッケージの forest() 関数における ref 引数は、フォレストプロットの参照線の位置 を指定するためのものです。通常、効果量の基準値(例えば 10)を設定します。

ref 引数の使い方

forest(meta_analysis, xlab = "Risk Ratio", ref = 1)
  • ref = 1リスク比 (RR) の場合、1 を基準線として設定
  • ref = 0標準化平均差 (SMD) の場合、0 を基準線として設定

ポイント

  • ref を指定すると、フォレストプロットに 垂直の基準線 が追加されます。
  • オッズ比やリスク比 の場合は ref = 1 が一般的。
  • 標準化平均差 (SMD) の場合は ref = 0 を使用。

詳しい解説は こちら で確認できます。試してみたい設定はありますか?

フォレストブロットでX軸の無効果の位置に垂直線を引く時に値を指定するのが一般的な使い方の様です。

今回は、Copilotを利用することで、スクリプトをタイプする必要が無いというところは大きな利点であることを再確認しましました。

オッズ比、ハザード比、平均値差、標準化平均値差などほかの効果指標の場合はどうなるか、Copilotに聞いたら、スクリプトを提案してくれるでしょう。

追加:metaパッケージのforest()関数ではlayoutにJAMAのスタイル、RevMan5のスタイルを指定できます。

windows()
forest(meta_analysis, xlab = "Risk Ratio", ref = 1, layout="JAMA")

windows()
forest(meta_analysis, xlab = "Risk Ratio", ref = 1, layout="RevMan5")

上がJAMAのスタイル、下がRevMan5のスタイルで、デフォルトとはデザインが違います。

AIで作成するダイアログ動画

GoogleのNotebookLMは自分で選択した情報ソース:PDFファイル、ウェブサイト、YouTubeの動画、その他をアップロードして、それらの情報に基づいて、要約を作成したり、質問に対する回答を得たり、さらに二人の”詳細な会話”の音声ファイルを作成することができます。単にソース情報の要約を作成するだけでなく、”詳細な会話”のカスタマイズで対話の内容について指示し、さまざまな課題に関するダイアログを作成することができます。

作成した音声ファイル(WAV形式)をダウンロードし、たとえば、Microsoft Wordのディクテーションのトランスクリプトからそのファイルを開いて、文字起こしすることができます。さらに、そのテキストから、Gammaでスライドを作成し、必要な修正を加えて、PPT、PDF、PNGファイルとして出力することができます。

音声ファイルとスライド画像のファイルから動画を作成し、YouTubeのIZ statチャンネルにアップしました。動画の作成はVideopadを用いた手作業です。

「エビデンスの確実性と利益・害のバランス分析 – ダイアログ」(9:28) Link

「システマティックレビューにおけるAIの活用 – ダイアログ」(7:45) Link

「コクランRoB 2ツール:ITT効果とPer-protocol効果の評価の違い – ダイアログ」 (8:17) Link

「共有意思決定(SDM):患者さんとの対話を通じた最適な医療選択 – ダイアログ」(6:20)Link 医師に向けての視点で

「共有意思決定(SDM):医療者と患者の協働アプローチ – 医療利用者に向けての視点で – ダイアログ」(7:34)Link

「臨床研究のバイアスの理解:推定値への影響 – ダイアログ」(15:14) Link

これらの動画は聞き役と、説明する役の二人の対話で、話し言葉なので、スライドを見ながら聞いていると何となく要点が分かるような気になります。

NotebookLMではプロンプトの書き方で、同じソースでも異なるアウトプットになり、重点の置き方が違った内容になりますが、非常に効率化が図れます。”詳細な会話”ではなく、テキストでの回答を得て、それを保存しておくこともできます。Gammaでのスライド作成も、自分では描けないようなプロフェッショナルな画像を挿入してくれ、適切にまとめてくれ、やはり非常に効率化が図れます。

Network Meta-analysisのためのデータ形式とnetmetaでNMAを実行

Network meta-analysisで使われるデータ形式について、以下のような表現が一般的です:

  1. One row per study: この形式は、各研究が1行で表される場合に使われます。英語では「wide format」や「study-level data」と呼ばれることが多いです。
  2. One row per pair: 各ペアのデータが1行で表される形式です。英語では「long format」や「pairwise data」として言及されることがあります。

Gerta Rückerらの、Rのパッケージnetmetaは頻度論派frequentist統計学によるネットワークメタアナリシスを実行し、エビデンスの確実性の評価に必要なアウトプットが可能です。

Wide formatでは、Rのスクリプトの中で、介入のラベル名などを書き込む必要があります。Pairwise data形式の場合は、データの中に含まれている介入のラベル名を用いてペア比較及びネットワークが作られるため、同じスクリプトで異なるデータソースに対処できます。

図1.上のデータがWide formatで、下が同じデータをPaiwise dataに変換したもの。連続変数アウトカムの場合の例。

Pairwise dataの形式で、ネットワークメタアナリシスに必要なデータをExcelで用意し、データの範囲を選択して、コピーしRで次のスクリプトを実行すると、クリップボード経由でデータが渡され、ネットワークメタアナリシスを実行し、結果が出力されます。最初に結果のファイルを保存するフォルダを選択あるいは新規作成するダイアログボックスが出て、そのあとは終了まで少し時間がかかります。Net heat diagramは条件によって作成されない場合もあります。

Excelのテンプレートファイルはこちらから右クリックしてダウンロードして使ってください。Link

Rで実行するスクリプトは:
Windows:
dat=read.delim(“clipboard”,sep=”\t”,header=TRUE);source(“https://stat.zanet.biz/useRs/scripts/nma-with-netmeta.R”)
Mac:
dat=read.delim(pipe(“pbpaste”),sep=”\t”,header=TRUE);source(“https://stat.zanet.biz/useRs/scripts/nma-with-netmeta.R”)

Network graph, Forest plot, Node-splitting forest plotと表データ、Rankgram、SUCRA plot、などが得られます。

R Shinyでnetmetaを動作させ、Forest plotだけでなく、エビデンスの確実性の評価などを行う表やバイアスリスクのまとめなどのチャートを作成できるCINeMA (Confidence in Network Meta-Analysis)というウェブサイトがあります。CINeMA considers 6 domains: (i) within-study bias, (ii) reporting bias, (iii) indirectness, (iv) imprecision, (v) heterogeneity, and (vi) incoherenceだそうです。CochraneのHiggins JTPやNetwork meta-analsisのリーダーたちであるChaimani A、Salanti Gらが開発に係わっています。

Cochrane RoB 2を用いるウェブツール

ランダム化比較試験のバイアスリスク評価ツールであるCochrane risk of bias toolが2019年からversion 2.0となり、シグナリングクエスチョンに答えることで、研究ごとのバイアスリスクをLow, Some concerns, Highの3段階で評価する方法に変わりました。Link Excelマクロを用いて、自動判定するファイルも用意されています。

ドロップダウンメニューからシグナリングクエスチョンに対する回答を選択していくと、バイアスリスク評価ができるウェブツールを以前から公開していました。今回、ドメイン2の治療企図からの乖離によるバイアスリスクについて判定アルゴリズムを1つ追加しました。Link

今回の課題は、ドメイン2のPart 1の判定アルゴリズムです。今までは、図1に示すような回答の組み合わせの場合、Part 1の判定は未決で白丸のままでした。

図1. ドメイン2 Part 1のバイアスリスク判定。

このような場合、白丸部分をクリックすると、図2のように関連するアルゴリズムが表示されます。青の太字が選択した回答と一致している部分で、この組み合わせの中には、y y pn NANA y NAという組み合わせはありません。判定がLowになる回答の組み合わせは3つだけでした。

図2.青の太字が選択した回答と一致している部分で、この組み合わせの中には、y y pn NANA y NAという組み合わせはない。

これらの回答の組み合わせは、上記Cochrane risk of bias tool version 2.0に関する解説のページで、Link Full guidance documentにかかれているアルゴリズムに沿って作成したものです。該当する箇所は、Table 6またはFigure 2です。そこを見ると、シグナリングクエスチョン2.1と2.2は”Either Y/PY/NI“で、2.3がN/PNの場合Low riskの判定となることが記載されています。”Either Y/PY/NI”の解釈で、いずれかが”Y/PY/NI”であるという場合に、両方が”Y/PY/NI”であるも含めるか、いずれか片方だけが”Y/PY/NI”の場合だけに限定するかが問題となります。今までは、後者の解釈に基づいてアルゴリズムを設定していましたが、今回、両方が”Y/PY/NI”である場合も含めるアルゴリズムに変更することにしました。言い換えると、参加者も医療提供者も介入について知ることができる場合でも、すなわちいずれも盲検化が行われていない場合でも、治療企図からの乖離が臨床試験の文脈と関係ない場合は、Low riskと判定するということになります。また、医療提供者あるいは参加者だけが介入を知っている場合と、両者とも知っている場合は同じ評価になるという意味でもあります。盲検化の有無よりも、治療企図からの乖離が臨床試験の文脈と関係あるかどうかの判断がより重要になるということにもなります。

さて、今回お話ししているウェブツールはアルゴリズムを各自の望ましいと思うものに書き換えて利用することができるようになっています。今回その機能を用いてアルゴリズムを修正しました。図3で示すように、MenuからAlgorithmを選択すると、図4に示す、その時点のアルゴリズム一覧が示されます。

図3.Menuからアルゴリズムを表示させる。
図4.その時点のアルゴリズム一覧。2.1でLowになる回答の組み合わせは3種類だけ。

ここに、シグナリングクエスチョンの2.1の回答の組み合わせでLow判定になるものを追加します。タブ区切りで図5に示すように、1行を追加しました。

図5.2.1にLowになる回答の組み合わせを追加。

そして、図5に示す、Saveボタンをクリックすると、図6のように、確認のメッセージが出るので、OKをクリックします。

図6.書き換えたアルゴリズム一覧を保存する際の確認のメッセージ。

次に、このウェブページ全体をHTMLファイルとして保存します。図7のように、MenuからSaveを選択します。

図7.HTMLファイルとして保存する。MenuからSaveをクリック。
図8.名前を付けて保存する。

図8のように、ブラウザの右上の方にファイルをダウンロードしてPCに保存するメッセージが出るので、名前を付けて保存をクリックします。もし、Study IDとOutcomeが入力されている場合は、それらの文字列をアンダーバーで結合したファイル名が提示されます。

図9.ファイル保存のためのダイアログ。ファイル名を付け、あるいは修正して保存ボタンをクリック。

図9のようにファイル保存のためのダイアログが出るので、ファイル名を付けて保存します。

図10.ダウンロードの状況。

ブラウザの右上の方に、ダウンロードの状況が表示され、終了すると図10のように表示されるので、ここでファイルを開くをクリックすると保存したHTMLファイルがブラウザで開かれます。また、フォルダのアイコンをクリックするとそのファイルを含むフォルダが開かれます。このパネルが無くなった後であれば、・・・をクリックしてダウンロードを選択すると、直前までダウンロードしたファイルの一覧が表示されるので、そこから選択して開くこともできます。

図11.ダウンロードしたファイルでアルゴリズムを確認。

ダウンロードしたファイルをブラウザで開き、MenuからAlgorithmを選択して、2.1の所を確認すると修正した内容に変わっています。

図12.ドメイン2のテスト。

ドメイン2で2.1のシグナリングクエスチョンに最初と同じ組わせてで回答を選択すると、今度は、Lowの判定になります。

さて、ダウンロードしたファイルを右クリックしてコピーして貼り付け操作を行うとファイルを複製使用することができます。インターネットに接続された環境であれば、上記のURLを開いた場合と、同じように動きます。

バイアスリスク評価はひとつの研究-ひとつのアウトカムで1枚ずつ用いて行い、MenuからSaveして記録しておくことができます。その場合、保存されたHTMLファイルはローカルPCにあります。例えば、研究が5件で評価するアウトカムが5つであれば、25枚のHTMLファイルを保存することになります。

また、ひとつの研究-ひとつのアウトカムの評価が終わったら、上の方にあるCopy to Clipboard with Summaryのボタンをクリックし、Excelで開いたMindsのRoB 2用の評価シートに結果を貼り付けることもできます。

このウェブツールはバイアスリスクのドメインの行をクリックするとシグナリングクエスチョンが、各シグナリングクエスチョンをクリックすると解説が表示されます。

図13.シグナリングクエスチョンの表示と解説の表示。各行をクリックすると表示される。

Cochrane risk of bias tool version 2.0ではシグナリングクエスチョンの回答に基づく判定とレビュアの判定が異なる場合、後者を優先することになっています。このウェブツールではその変更はできないので、評価シートの方でレビュアの判定を設定してください。その旨をコメント欄に記入してSaveしておくといいと思います。

また、バイアス効果の向き、すなわち、過大評価(介入群に有利)・過小評価(対照群に有利)、差が無い方へ・差がある方へ、の判定はオプショナルになっていますが、ドメイン名の右のラジオボタンで記録することはできます。