## はじめに
フォレストプロット(forest plot)は、複数の研究結果を視覚的に比較するためのグラフです。メタ解析の結果を示す際によく使用されます。
本記事では、専門的なメタ解析コマンドを使わず、Stataの基本的なグラフ機能を使って既に計算済みの結果をシンプルにプロット化する方法を紹介します。オッズ比や信頼区間が既に分かっている場合に、視覚的に分かりやすいフォレストプロットを作成できます。
## データの準備
まず、プロットするデータを準備します。ここでは架空の臨床研究におけるサブグループ解析の結果を想定して、各サブグループの推定値(回帰係数など)と全体の統合推定値をデータとして作成します。
データの準備としては、Excelなどで個人で準備してもらっても大丈夫です。推定値と信頼区間の上限・下限をまとめたファイルを用意して、Stataで読み込んで使用できます。
```stata
clear
* サブグループ解析データの作成
input str10 subgroup estimate lower upper
"Male" -0.18 -0.32 -0.02
"Female" -0.05 -0.18 0.12
"Age>=65" -0.12 -0.25 0.05
"Age<65" -0.15 -0.28 0.00
"BMI>=25" -0.22 -0.35 -0.05
"BMI<25" -0.08 -0.22 0.08
"Overall" -0.13 -0.22 -0.03
end
```
各列の意味は以下の通りです:
- `subgroup`:サブグループ名
- `estimate`:推定値(回帰係数など)
- `lower`:95%信頼区間の下限
- `upper`:95%信頼区間の上限
データを確認してみます。
```stata
list
```
```
+-------------------------------------+
| subgroup estimate lower upper |
|-------------------------------------|
1. | Male -.18 -.32 -.02 |
2. | Female -.05 -.18 .12 |
3. | Age>=65 -.12 -.25 .05 |
4. | Age<65 -.15 -.28 0 |
5. | BMI>=25 -.22 -.35 -.05 |
|-------------------------------------|
6. | BMI<25 -.08 -.22 .08 |
7. | Overall -.13 -.22 -.03 |
+-------------------------------------+
```
データの順序(最初の行がMale、最後の行がOverall)を保持してプロットします。
## フォレストプロットの作成
サブグループをカテゴリごとにまとめて表示します。男女を近づけ、年齢を近づけ、BMIと全体を適切な間隔で配置します。
![[forest_plot_stata.png|400]]
完全なコードは後述の「完全なStataコード」セクションを参照してください。以下では、コードの重要な部分を抜粋して説明します。
### コードの説明
```stata
gen y_position = .
replace y_position = 9 if subgroup == "Male"
replace y_position = 8 if subgroup == "Female"
replace y_position = 6 if subgroup == "Age>=65"
replace y_position = 5 if subgroup == "Age<65"
replace y_position = 3 if subgroup == "BMI>=25"
replace y_position = 2 if subgroup == "BMI<25"
replace y_position = 0 if subgroup == "Overall"
```
各サブグループのy軸位置を手動で指定します。Male=9, Female=8で近接配置し、Age>=65=6, Age<65=5で近接配置し、BMI>=25=3, BMI<25=2で近接配置します。Overall=0で最下部に配置します。
```stata
twoway (scatter y_position estimate, msymbol(square) msize(large) mcolor(black))
```
点推定値を四角で表示します。
```stata
(rcap lower upper y_position, horizontal lcolor(black))
```
信頼区間を横線で表示します。
```stata
xline(0, lpattern(dash) lcolor(gs8))
```
推定値=0の位置に縦の破線を引いて基準線とします。
```stata
ylabel(1 "BMI<25" 2 "BMI>=25" 4 "Age<65" 5 "Age>=65" 7 "Female" 8 "Male" 10 "Overall", angle(0) noticks)
```
y軸の目盛り位置とラベルを対応させます。
```stata
graphregion(color(white)) plotregion(color(white))
```
背景を白に設定します。
## 完全なStataコード
```stata
clear
* サブグループ解析データの作成
input str10 subgroup estimate lower upper
"Male" -0.18 -0.32 -0.02
"Female" -0.05 -0.18 0.12
"Age>=65" -0.12 -0.25 0.05
"Age<65" -0.15 -0.28 0.00
"BMI>=25" -0.22 -0.35 -0.05
"BMI<25" -0.08 -0.22 0.08
"Overall" -0.13 -0.22 -0.03
end
* y軸の位置を手動で設定(サブグループをまとめる)
gen y_position = .
replace y_position = 9 if subgroup == "Male"
replace y_position = 8 if subgroup == "Female"
replace y_position = 6 if subgroup == "Age>=65"
replace y_position = 5 if subgroup == "Age<65"
replace y_position = 3 if subgroup == "BMI>=25"
replace y_position = 2 if subgroup == "BMI<25"
replace y_position = 0 if subgroup == "Overall"
* フォレストプロット作成
twoway (scatter y_position estimate, msymbol(square) msize(large) mcolor(black)) ///
(rcap lower upper y_position, horizontal lcolor(black)), ///
xline(0, lpattern(dash) lcolor(gs8)) ///
ylabel(0 "Overall" 2 "BMI<25" 3 "BMI>=25" 5 "Age<65" 6 "Age>=65" 8 "Female" 9 "Male", angle(0) noticks) ///
ytitle("") ///
xtitle("Estimate (95% CI)") ///
title("Treatment Effect by Subgroup") ///
legend(off) ///
graphregion(color(white)) plotregion(color(white))
graph export "forest_plot_stata.png", replace width(2400)
```
## オッズ比など対数軸が必要な場合
オッズ比やハザード比など、1を基準とする指標の場合は対数軸を使用します。この場合は`xscale(log)`を追加します。
```stata
clear
* オッズ比のデータ例
input str10 subgroup or lower upper
"Male" 0.82 0.68 0.98
"Female" 0.95 0.82 1.12
"Overall" 0.87 0.78 0.97
end
* y軸の位置を設定
gen y_position = _n
* 対数軸でのプロット
twoway (scatter y_position or, msymbol(square) msize(large) mcolor(black)) ///
(rcap lower upper y_position, horizontal lcolor(black)), ///
xline(1, lpattern(dash) lcolor(gs8)) ///
xscale(log) ///
ylabel(1 "Male" 2 "Female" 3 "Overall", angle(0) noticks) ///
ytitle("") ///
xtitle("Odds Ratio (95% CI)") ///
title("Treatment Effect by Subgroup") ///
legend(off) ///
graphregion(color(white)) plotregion(color(white))
graph export "forest_plot_stata_or.png", replace width(2400)
```
![[forest_plot_stata_or.png|400]]
対数軸を使うことで、1より大きい値と小さい値が対称的に表示されます。
## まとめ
Stataの基本的なグラフ機能を使えば、専門的なメタ解析コマンドを使わなくても、シンプルなフォレストプロットを作成できます。回帰係数などの推定値をプロットする場合は0を基準線とし、オッズ比などをプロットする場合は対数軸で1を基準線とします。