Copilot、GeminiによるPICO要約の作成

システマティックレビューでは採用文献あるいは除外文献の一覧を作成する必要があります。Cochraneレビューでは、そのような一覧は、Characteristics of studiesとCharacteristics of excluded studiesと呼ばれています。前者では、第一著者のFamily name 年度、Methods, Participants, Interventions, Outcomes, Identification, Notesが構成項目です。後者は第一著者のFamily name 年度と除外理由が提示されます。

また、MindsのSR用テンプレート(全体版 URL: https://minds.jcqhc.or.jp/methods/cpg-development/minds-manual/)では、【SR-3 二次スクリーニング後の一覧表】がそれに相当し、文献、研究デザイン、P、I、C、O、除外、コメントが構成項目です。こちらは、全文を読んで行う二次選定で除外された文献について、除外の項目で理由を記述するようになっていますので、一次選定で採用された文献については、すべてPICO要約を作成することになります。

論文のアブストラクトからPICOの要約とCommentsをAIで作成できるか試してみました。2025年11月19日の時点で、CopilotはSmart(GPT-5)を用い、GeminiはGemini PRO 2.5 FlashモデルはFastを用います。結論から言うと、ほぼそのまま使用できるレベルのPICO要約表が極めて短時間で作成できます。

PICO要約がAIで作成できれば、効率化が図れます。そこで、まず、アブストラクトを1つずつ処理するやり方を試してみます。PubMedでその文献のAbstractを提示させ、Abstractの部分を選択し、コピー操作を行って、以下のプロンプトの後に、貼り付けます。そして、Enter Keyを押すか、↑のボタン(Copilotの場合)あるいは⇨のボタン(Geminiの場合)をクリックします。書誌情報はここでは取り込まず、別の方法で抽出されている場合を想定しており、PICOとコメントだけです。

以下の論文のアブストラクトからPopulation, Intervention, Comparator, Outcome、すなわちPICOのそれぞれの要点およびコメントを書き出してください。PICOの要点は他の研究と比較する際にそれぞれの属性の違いが分かる程度に詳細を含めてください。Pの項には全症例数、Iの項には介入群の症例数、Cの項には対照群の症例数を入れてください。出力したテキストはコピーして貼り付けられるようにしてください。形式は以下の通りで、:から書き足して、各要素の最後は改行で区切ってください。研究デザインはランダム化比較試験はRCT、コホート研究はCohort、症例対照研究はCase-control、横断研究はCross-sectional、それ以外Othersに分類してください。LaTeXの数式環境($など)は用いずに、通常のテキストとして出力し、最後に改行が入る形式にしてください。
P: 対象者の要点。
I: 介入の要点。
C: 対照の要点。
O: アウトカムの要点。
Comments: 研究デザイン 研究全体に関するコメント。
****ここにAbstractのテキストを貼り付ける****

あっという間に、以下のようなPICO要約が出力されます。この例の文献は最後に引用を付けています。

P: 138例がランダム化され、123例が解析対象。対象は肝硬変を伴う肝細胞癌患者。背景はChild-Pugh Aが70%、アルコール性肝硬変76%、Okuda stage Iが71%、多結節型腫瘍70%、門脈枝血栓10%。
I: 62例。Transarterial Lipiodol Chemoembolisation (TACE)+Tamoxifen併用療法。
C: 61例。Tamoxifen単独療法。
O: 主要アウトカムは全生存率とQOL(Spitzer Index)。2年生存率はTamoxifen群22%、TACE群25%(P=0.68)。QOLに有意差なし(P=0.70)。サブ解析(Okuda I)では2年生存率Tamoxifen群28%、TACE群32%(P=0.58)。予後因子としてAFP>400ng/mL、腹痛、肝腫大、Child-Pughスコアが有意。
Comments: RCT。多施設第III相試験。TACE+TamoxifenはTamoxifen単独と比較して生存率・QOLの改善を示さず、予後因子の解析が主な意義。

もう少し簡略化したPICO要約のためのプロンプトが以下のプロンプトです。

以下の論文のアブストラクトからPopulation, Intervention, Comparator, Outcome、すなわちPICOのそれぞれの要点およびコメントを書き出してください。出力したテキストはコピーして貼り付けられるようにしてください。形式は以下の通りで、:から書き足して、各要素の最後は改行で区切ってください。研究デザインはランダム化比較試験はRCT、コホート研究はCohort、症例対照研究はCase-control、横断研究はCross-sectional、それ以外Othersに分類してください。LaTeXの数式環境($など)は用いず、**も不要です。通常のテキストとして出力し、最後に改行が入る形式にしてください。
P: 対象者の要点。
I: 介入の要点。
C: 対照の要点。
O: アウトカムの要点。
Comments: 研究デザイン 研究全体に関するコメント。
****ここにAbstractのテキストを貼り付ける****

その出力結果です。だいぶ短くなりました。”Pの項には全症例数、Iの項には介入群の症例数、Cの項には対照群の症例数を入れてください。”を入れた方がいいかもしれません。

P: 肝硬変を伴う肝細胞癌患者。対象は1995~2002年に登録された患者138例のうち123例が解析対象。主な背景はChild-Pugh Aが70%、アルコール性肝硬変が76%、Okuda stage Iが71%、多結節型腫瘍が70%、門脈枝血栓が10%。
I: トランス動脈性リピオドール化学塞栓療法(TACE)+タモキシフェン併用。
C: タモキシフェン単独。
O: 全生存率(2年生存率:TACE群25%、タモキシフェン群22%、有意差なし)、QOL(Spitzer Indexで両群差なし)。サブ解析ではOkuda stage I群でも有意差なし。予後因子としてAFP高値、腹痛、肝腫大、Child-Pughスコアが独立因子。
Comments: RCT 多施設共同第III相ランダム化比較試験。TACE併用は生存率・QOLの改善を示さず、予後因子の探索的解析が主な意義。。

Geminiでも同じような結果が得られますが、以下の様になります。

P: 肝細胞癌(HCC)および肝硬変を有する患者。全症例数138名(適格症例123名)。Child-Pugh分類Aが70%、アルコール性肝硬変が76%、OkudaステージIが71%、多結節性腫瘍が70%、区域性門脈血栓症が10%。
I: 経動脈的リピオドール塞栓術(TACE)とタモキシフェンの併用。介入群の症例数62名(適格症例)。
C: タモキシフェン単独療法。対照群の症例数61名(適格症例)。
O: 全生存期間(2年時点の生存率がタモキシフェン群22% vs TACE群25%でP=.68)。生活の質(Spitzer Index)。
Comments: 研究デザイン: RCT。研究全体に関するコメント: HCCと肝硬変の患者に対する緩和的治療において、TACEとタモキシフェンの併用はタモキシフェン単独と比較して、生存期間も生活の質も改善しないことが示唆された。AFP > 400 ng/mL、腹痛、肝腫大、Child-Pughスコアが独立した予後因子として同定された。OkudaステージIのサブグループ解析でも有意な生存期間の改善は認められなかった。

簡略版

P: 肝細胞癌(HCC)および肝硬変を有する患者。
I: 肝動脈塞栓化学療法(TACE)とタモキシフェンの併用療法。
C: タモキシフェン単独療法。
O: 全生存期間(overall survival)、および生活の質(quality of life, Spitzer Index level)。
Comments: 研究デザイン: RCT
研究全体に関するコメント: 多施設共同の第III相ランダム化比較試験で、肝細胞癌に対するTACEとタモキシフェンの併用療法の有効性をタモキシフェン単独療法と比較しています。結果は、TACEの追加が生存期間も生活の質も改善しないことを示唆しています。

続けて、別のアブストラクトの処理をさせたい場合は、「同じように処理して。」のプロンプトに続けてアブストラクトを貼り付けて実行させるだけで大丈夫です。

プロンプトは必要に応じて、修正、追加していろいろ試してみて下さい。今回も自分で考案したさまざまなプロンプトを試してみましたが、一応使用可能だと思ったので、紹介しました。


さらに、複数の文献のPICO要約表の作成も可能です。例えば、PubMedでPMIDのリストを作成するなどして、必要な文献の検索結果を表示させます。それをAbstract形式でSaveしてテキストファイルとしてダウンロードします。他の方法で作成する場合も、書誌情報とアブストラクトが含まれている必要があります。

そして、そのテキストファイルをCopilotのチャットエリア(プロンプトを書き込むフィールド)にドラグアンドドロップします。(Geminiも同じです)。それに続けて、以下のプロンプトを書き出して、Enter Keyを押すと結果が得られます。なお、チャットエリアで、改行を入れたい場合は、Shift Keyを押しながら、Enter Keyを押します。途中で間違ってEnter Keyを押してしまうと、そこでAIの応答が始まってしまうので、注意が必要です。

Copilotの例。
Gemilniの例。
この論文のアブストラクト集のテキストから、Population, Intervention, Comparator, Outcome、すなわちPICOの要点および短いコメントを表形式で書き出し、日本語でひとつの表にしてください。PICOの要点は他の研究と比較する際にそれぞれの属性の違いが分かる程度に詳細を含めてください。Pの項には全症例数、Iの項には介入群の症例数、Cの項には対照群の症例数を入れてください。列名はStudy ID, Design, P, I, C, O, Commentsとして、PICOのフルスペルおよび日本語の説明の追加は不要です。Study IDは第一著者Family name+" "+Initials+" "+年度を用いてください。Designはランダム化比較試験はRCT、コホート研究はCohort、症例対照研究はCase-control、横断研究はCross-sectional、それ以外Othersに分類してください。表はコピーしてExcelに貼り付けられるようにしてください。文献の出版年度の新しい方から順に並べてください。LaTeXの数式環境($など)は用いず、**も不要です。

簡略版

この論文のアブストラクト集のテキストから、Population, Intervention, Comparator, Outcome、すなわちPICOの要点および短いコメントを表形式で書き出し、日本語でひとつの表にしてください。Pの項には全症例数、Iの項には介入群の症例数、Cの項には対照群の症例数を入れてください。列名はStudy ID, Design, P, I, C, O, Commentsとして、PICOのフルスペルおよび日本語の説明の追加は不要です。Study IDは第一著者Family name+" "+Initials+" "+年度を用いてください。Designはランダム化比較試験はRCT、コホート研究はCohort、症例対照研究はCase-control、横断研究はCross-sectional、それ以外Othersに分類してください。表はコピーしてExcelに貼り付けられるようにしてください。文献の出版年度の新しい方から順に並べてください。LaTeXの数式環境($など)は用いず、**も不要です。

Copilotでは直接Excelファイルとして保存することもできますが、結果のコピーボタンをクリックして、Excelシートに貼り付け、不要な部分を削除する方法がスピーディーです。以下の例は、簡略版ではない方のプロンプトの結果です。

GeminiではGoogleドライブのスプレッドシートへ直接出力できるボタンが出てきます。Googleスプレッドシートから、Excelファイルとして保存することができます。

これらの表を自分で入力することを考えると、極めて効率化が図れると言えます。今回の例では6文献でしたが、本当にあっという間にできてしまいます。除外の列は入れてありませんが、Excel間のコピー・貼り付けで、【SR-3 二次スクリーニング後の一覧表】はあっという間に作成できそうです。

また、列名がプロンプトの指示通りにならなかったり、その他にも意図したとおりにならないことがあり得ますので、そのような際にはプロンプトを追加するなり、工夫してみて下さい。

PubMedでAbstract形式でSaveしたテキストファイルだけでなく、必要な情報を含むExcelファイルからも同じことができます。CopilotもGeminiもExcelファイルをドラグアンドドロップで受け付けてくれますので、上記のテキストファイルと同じように読み込ませることができます。例えば、次のようなExcelファイルを文献処理用のソフトウェアで用意して、使うことができます。

この例の場合、プロンプトのStudy IDの取り込みに関する部分を、”Study IDは第一著者Family name+” “+Initials+” “+年度を用いてください。”から”Study IDはReference IDの値をそのまま用いてください。”に書き換えてもいいでしょう。

またBunkanという文献管理用のマクロが付いたExcel Bookを使う場合、まずファイルを編集可能にするために、ファイルのアイコンを右クリックして、プロパティを選択し、全般のタブの画面で下の方のセキュリティの項目の許可するにチェックを入れ、OKボタンをクリックします。これでコピー操作ができるようになるので、目的のSheetの下の方にあるラベルを右クリックして、ポップアップメニューから移動またはコピーを選択し、左下のコピーを作成するにチェックを入れ、移動先ブック名で(新しいブック)を選択し、OKをクリックします。これで、新しいExcelファイルに同じ文献一覧が表示されますので、そのファイルをファイル名を付けて、xlsxファイルとして保存します。このようにして保存したExcelファイルはCopilotあるいはGeminiにドラグアンドドロップして読み込ませることができますので、あとは同じように処理できます。

さて、最後に研究デザインの分類については、すべてのデザインについてテストをしていないので、もしうまく分類されなかった場合、その部分のプロンプトを書き換える必要があるかもしれません。また、今回はアブストラクトの情報からPICO要約を作成しましたが、Copilot、GeminiはPDFファイルもドラグアンドドロップで情報を読み込ませることができるので、ひとつずつであれば全文のPDFファイルからもPICO要約ができるかもしれません。全文に合わせてプロンプトの修正が必要な箇所が出てくるかもしれませんが。

また、PICO要約は一次選定後の文献一覧から作成しますが、一次選定もAIにやらせることもできます。適格基準:採用基準と除外基準をプロンプトで記述して、それで選定された文献からPICO要約を作成するようにプロンプトを記述すれば1ステップで実行できるはずです。ただし、まだ本格的には試していなので、文献数を制限する必要があるかもしれませんし、ASReviewなどの機械学習を用いる方法と比較することも必要になるでしょう。(ASReviewに関する以前の投稿はこちら)。

文献:
最初の例の論文:Doffoël M, Bonnetain F, Bouché O, Vetter D, Abergel A, Fratté S, Grangé JD, Stremsdoerfer N, Blanchi A, Bronowicki JP, Caroli-Bosc FX, Causse X, Masskouri F, Rougier P, Bedenne L; Fédération Francophone de Cancérologie Digestive. Multicentre randomised phase III trial comparing Tamoxifen alone or with Transarterial Lipiodol Chemoembolisation for unresectable hepatocellular carcinoma in cirrhotic patients (Fédération Francophone de Cancérologie Digestive 9402). Eur J Cancer. 2008 Mar;44(4):528-38. doi: 10.1016/j.ejca.2008.01.004. Epub 2008 Jan 31. PMID: 18242076.

Stanを使うベイジアンメタアナリシス用のコード:時間イベントアウトカムのHR用

時間イベントアウトカムつまり生存分析のハザード比Hazard Ratio (HR)の統合値と95%確信区間Credible Intervalを、Stanを用いてベイジアンメタアナリシスで求め、Forest plotを作成するコードです。

データはExcelで図のように準備します。介入群の症例数、対照群の症例数、ハザード比HRの自然対数、その標準誤差の値が必要になります。labelは研究名のラベル、対照、介入のラベル、アウトカム、効果指標のタイプ、その略称です。

使用法は今まで紹介した、RR, OR, HR, MD, SMDのためのスクリプトと同じです。Rを起動しておき、エディターにコピーした下記コードを貼り付けて、最初の5つのライブラリの読み込みを実行しておきます。Excelに戻って、セルB3からG9までの範囲を選択して、コピー操作(Ctrl+C)を行って、Rに戻り、exdato = read.delim(“clipboard”,sep=”\t”,header=TRUE)のスクリプトを実行します。続いて、それ以下のスクリプトを全部実行させると、Forest plotが出力されます。効果指標の点推定値と95%確信区間、および予測区間を提示します。

Markov Chain Monte Carlo (MCMC)シミュレーションを行うので、少し時間がかかります。chains = 4, warmup = 10000, iter = 30000に設定しているので、計80000個がサンプリングされます。ウォームアップ、繰り返しの回数は必要に応じて変更してください。

Forest plotが出力された時点で、各研究の効果推定値、95%確信区間、統合値と95%確信区間、予測区間の値をクリップボードにコピーしていますので、Excel評価シートなどに貼り付けることができます。

ハザード比HRのメタアナリシス用コード
#####Bayesian meta-analysis of Hazard Raio (HR)######

library(rstan)
library(bayesplot)
library(dplyr)
library(HDInterval)
library(forestplot)

# Get data via clipboard.
exdato = read.delim("clipboard",sep="\t",header=TRUE)
labem = exdato[,"label"]
em = labem[6]
labe_study = labem[1]
labe_cont = labem[2]
labe_int = labem[3]
labe_outc = labem[4]
labe_em = labem[5]

exdat=na.omit(exdato)
# Number of studies
K <- nrow(exdat)

# データの準備
if(colnames(exdat)[1]=="author"){
study = exdat$author
}
if(colnames(exdat)[1]=="study"){
study = exdat$study
}
nc=exdat$nc
nt=exdat$nt
meta_data <- list(
  K = K,
  yi = exdat$yi,
  sei = exdat$sei
)

#Stan model code
stan_model_code <- "
data {
  int<lower=0> K;              // 研究数
  vector[K] yi;                // 各研究の logHR
  vector<lower=0>[K] sei;      // 各研究の標準誤差
}
parameters {
  real mu;                     // 全体平均 logHR
  real<lower=0> tau;           // 異質性(標準偏差)
  vector[K] theta;             // 各研究の真の効果
}
model {
  theta ~ normal(mu, tau);     // 真の効果の分布
  yi ~ normal(theta, sei);     // 観測値の分布
}
generated quantities {
  real tau_sq = tau^2;         // 異質性の分散
  real I2 = tau_sq / (tau_sq + mean(sei .* sei)); // I²の推定
  real pred = normal_rng(mu, sqrt(tau_sq + mean(sei .* sei))); // 予測区間の一例
}"


# Stan モデルのコンパイルとサンプリング
fit <- stan(
  model_code = stan_model_code,
  data = meta_data,
  iter = 30000,
  warmup = 10000,
  chains = 4,
  seed = 123,
  control = list(adapt_delta = 0.98)
)

# 結果の表示
print(fit, pars = c("mu", "tau", "tau_sq", "I2", "pred"), probs = c(0.025, 0.5, 0.975))

# 事後分布の可視化
posterior <- extract(fit)
#mcmc_areas(as.data.frame(posterior), pars = c("mu", "tau", "I2", "pred"))

# Summary HR and 95% credible interval
mu_HR = exp(mean(posterior$mu))
mu_HR_lw = exp(quantile(posterior$mu,probs=0.025))
mu_HR_up = exp(quantile(posterior$mu,probs=0.975))
p_val_HR = round(2*min(mean(posterior$mu >0), mean(posterior$mu <0)), 6)	#Bayesian p-value for summary logRR
if(mean(posterior$mu)>0){
prob_direct_HR = round(mean(posterior$mu > 0),6)
label = "p(HR>1)="
}else{
prob_direct_HR = round(mean(posterior$mu < 0),6)
label = "p(HR<1)="
}
# Prediction Inerval and 95% credible interval
pi_HR_lw = exp(quantile(posterior$pred,probs=0.025))
pi_HR_up = exp(quantile(posterior$pred,probs=0.975))

# Tau-squared mode and 95% HDI (High Density Interval) of logHR
dens=density(posterior$tau_sq)
tau_squared=dens$x[which.max(dens$y)]	#mode
ci_tau_squared=hdi(posterior$tau_sq)	#95% HDI

# I-squared mode and 95% HDI (High Density Interval) of logHR
dens=density(posterior$I2)
I_squared=100*dens$x[which.max(dens$y)]		#mode
ci_I_squared=100*hdi(posterior$I2)		#95% HDI

# logHR of each study = theta[,i]
hr=rep(0,K)
hr_lw=rep(0,K)
hr_up=rep(0,K)
for(i in 1:K){
hr[i] = exp(mean(posterior$theta[,i]))
hr_lw[i] = exp(quantile(posterior$theta[,i],probs=0.025))
hr_up[i] = exp(quantile(posterior$theta[,i],probs=0.975))
}
# 各研究の効果推定値の重み%各研究の効果推定値の重み%:事後不確実性の程度(推定の安定性)
# 重みを格納するベクトルを初期化
weights <- numeric(K)
weight_percentages <- numeric(K)
for (i in 1:K) {
  # i番目の研究のlogRRのサンプリング値を取得
  theta_i_samples <- posterior$theta[, i]
  # そのサンプリングされた値の分散を計算
  # これを「実効的な逆分散」と考える
  variance_of_theta_i <- var(theta_i_samples)
  # 重みは分散の逆数
  weights[i] <- 1 / variance_of_theta_i
}
# 全重みの合計
total_weight <- sum(weights)
# 各研究の重みのパーセンテージ
weight_percentages <- (weights / total_weight) * 100
wpc = format(round(weight_percentages,digits=1), nsmall=1)
wp = weight_percentages/100
#Forest plot box sizes on weihts
wbox=c(NA,NA,(K/4)*sqrt(wp)/sum(sqrt(wp)),0.5,0,NA)	

#Forest plot by forestplot
#setting fs for cex
fs=1
if(K>20){fs=round((1-0.02*(K-20)),digits=1)}

m=c(NA,NA,hr,mu_HR,mu_HR,NA)
lw=c(NA,NA,hr_lw,mu_HR_lw,pi_HR_lw,NA)
up=c(NA,NA,hr_up,mu_HR_up,pi_HR_up,NA)

hete1=""
hete2=paste("I2=",round(I_squared, 2),"%",sep="")

hete3=paste("tau2=",format(round(tau_squared,digits=4),nsmall=4),sep="")

#hete2=paste("I2=",round(mean_I_squared_logRR, 2), "%\n"," (",round(ci_I_squared_logRR[1], 2)," ~ ",
#round(ci_I_squared_logRR[2], 2),")",sep="")

#hete3=paste("tau2=",format(round(mean_tau_squared_logRR,digits=4),nsmall=4), "\n",
#" (",format(round(ci_tau_squared_logRR[1],digits=4),nsmall=4)," ~ ",
#format(round(ci_tau_squared_logRR[2],digits=4),nsmall=4),")  ",sep="")

hete4=""
hete5=paste("p=",p_val_HR, sep="")
hete6=paste(label,prob_direct_HR,sep="")

au=study
sl=c(NA,toString(labe_study),as.vector(au),"Summary Estimate","Prediction Interval",NA)

spac=c("    ",NA,rep(NA,K),NA,NA,NA)

ncl=c(NA,"Number",nc,NA,NA,hete1)
rcl=c(NA,NA,rep(NA,K),NA,NA,hete2)

ntl=c(labe_int,"Number",nt,NA,NA,hete3)
rtl=spac

ml=c(labe_outc,labe_em,format(round(hr,digits=3),nsmall=3),format(round(mu_HR,digits=3),nsmall=3),NA,hete5)
ll=c(NA,"95% CI lower",format(round(hr_lw,digits=3),nsmall=3),format(round(mu_HR_lw,digits=3),nsmall=3),format(round(pi_HR_lw,digits=3),nsmall=3),hete6)
ul=c(NA,"95% CI upper",format(round(hr_up,digits=3),nsmall=3),format(round(mu_HR_up,digits=3),nsmall=3),format(round(pi_HR_up,digits=3),nsmall=3),NA)
wpcl=c(NA,"Weight(%)",wpc,100,NA,NA)
ll=as.vector(ll)
ul=as.vector(ul)
sum=c(TRUE,TRUE,rep(FALSE,K),TRUE,FALSE,FALSE)
zerov=1
labeltext=cbind(sl,ntl,rtl,ncl,rcl,spac,ml,ll,ul,wpcl)
hlines=list("3"=gpar(lwd=1,columns=1:11,col="grey"))
dev.new()
plot(forestplot(labeltext,mean=m,lower=lw,upper=up,is.summary=sum,graph.pos=7,
zero=zerov,hrzl_lines=hlines,xlab=toString(labe_em),txt_gp=fpTxtGp(ticks=gpar(cex=fs),
xlab=gpar(cex=fs),cex=fs),xticks.digits=2,vertices=TRUE,graphwidth=unit(50,"mm"),colgap=unit(3,"mm"),
boxsize=wbox,
lineheight="auto",xlog=TRUE,new_page=FALSE))
####
###Pint indiv estimates with CI and copy to clipboard.
nk=K+2
efs=rep("",nk)
efeci=rep("",nk)
for(i in 1:nk){
efs[i]=ml[i+2]
efeci[i]=paste(ll[i+2],"~",ul[i+2])
}

efestip=data.frame(cbind(efs,efeci))
efestip[nk,1]=""
print(efestip)
write.table(efestip,"clipboard",sep="\t",row.names=FALSE,col.names=FALSE)
print("The estimates of each study and the summary estimate are in the clipboard.")

#############

Forest plotが出力された後、続けて以下のFunnel plot作成用のスクリプトを実行すると、Funnel plotが出力されます。

Funnel plot作成用のスクリプト
########################
library(metafor)

#Plot funnel plot.
if(em == "HR"){
yi = hr
vi=1/weights
sei = sqrt(1/weights)
mu = mu_HR
dev.new(width=7,height=7)
funnel(yi, sei = sei, level = c(95), refline = mu,xlab = "HR", ylab = "Standard Error")
}

#Asymmetry test with Egger and Begg's tests.
egger=regtest(yi, sei=sei,model="lm", ret.fit=FALSE)
begg=ranktest(yi, vi)

#Print the results to the console.
print("Egger's test:")
print(egger)
print("Begg's test")
print(begg)

#Add Begg and Egger to the plot.
fsfn=1
em=toString(exdat$label[6])
outyes=toString(exdat$label[4])
funmax=par("usr")[3]-par("usr")[4]
gyou=funmax/12
fxmax=par("usr")[2]-(par("usr")[2]-par("usr")[1])/40
text(fxmax,gyou*0.5,"Begg's test",pos=2,cex=fsfn)
kentau=toString(round(begg$tau,digits=3))
text(fxmax,gyou*1.2,paste("Kendall's tau=",kentau,sep=""),pos=2,cex=fsfn)
kenp=toString(round(begg$pval,digits=5))
text(fxmax,gyou*1.9,paste("p=",kenp,sep=""),pos=2,cex=fsfn)

text(fxmax,gyou*3.5,"Egger's test",pos=2,cex=fsfn)
tstat=toString(round(egger$zval,digits=3))
text(fxmax,gyou*4.2,paste("t statistic=",tstat,sep=""),pos=2,cex=fsfn)
tstap=toString(round(egger$pval,digits=5))
text(fxmax,gyou*5.1,paste("p=",tstap,sep=""),pos=2,cex=fsfn)
#####################################

Funnel plotの非対称性の検定法であるBeggの検定、Eggerの検定を出版バイアスの評価に用いる場合、研究数が10以上(5以上という研究者もいる)必要とされています。