## はじめに
フォレストプロット(forest plot)は、複数の研究結果を視覚的に比較するためのグラフです。メタ解析の結果を示す際によく使用されます。
本記事では、`meta`パッケージのような専門的なメタ解析パッケージを使わず、ggplot2を使って既に計算済みの結果をシンプルにプロット化する方法を紹介します。オッズ比や信頼区間が既に分かっている場合に、視覚的に分かりやすいフォレストプロットを作成できます。
## 必要なパッケージ
```r
# パッケージのインストール(初回のみ)
install.packages("ggplot2")
# パッケージの読み込み
library(ggplot2)
```
## データの準備
まず、プロットするデータを準備します。ここでは架空の臨床研究におけるサブグループ解析の結果を想定して、各サブグループの推定値(回帰係数など)と全体の統合推定値をデータフレームとして作成します。
データの準備としては、Excelなどで個人で準備してもらっても大丈夫です。推定値と信頼区間の上限・下限をまとめたファイルを用意して、Rで読み込んで使用できます。
```r
# サブグループ解析データの作成
d <- data.frame(
subgroup = c("Male", "Female", "Age>=65", "Age<65", "BMI>=25", "BMI<25", "Overall"),
estimate = c(-0.18, -0.05, -0.12, -0.15, -0.22, -0.08, -0.13),
lower = c(-0.32, -0.18, -0.25, -0.28, -0.35, -0.22, -0.22),
upper = c(-0.02, 0.12, 0.05, 0.00, -0.05, 0.08, -0.03)
)
```
各列の意味は以下の通りです:
- `subgroup`:サブグループ名
- `estimate`:推定値(回帰係数など)
- `lower`:95%信頼区間の下限
- `upper`:95%信頼区間の上限
データを確認してみます。
```r
print(d)
```
```
subgroup estimate lower upper
1 Male -0.18 -0.32 -0.02
2 Female -0.05 -0.18 0.12
3 Age>=65 -0.12 -0.25 0.05
4 Age<65 -0.15 -0.28 0.00
5 BMI>=25 -0.22 -0.35 -0.05
6 BMI<25 -0.08 -0.22 0.08
7 Overall -0.13 -0.22 -0.03
```
データの順序(最初の行がMale、最後の行がOverall)を保持してプロットします。
## フォレストプロットの作成
サブグループをカテゴリごとにまとめて表示します。男女を近づけ、年齢を近づけ、BMIと全体を適切な間隔で配置します。
![[forest_plot_improved.png|400]]
完全なコードは後述の「完全なRコード」セクションを参照してください。以下では、コードの重要な部分を抜粋して説明します。
### コードの説明
```r
d$y_position <- c(9, 8, 6, 5, 3, 2, 0)
```
各サブグループのy軸位置を手動で指定します。Male=9, Female=8で近接配置し、Age>=65=6, Age<65=5で近接配置し、BMI>=25=3, BMI<25=2で近接配置します。Overall=0で最下部に配置します。
```r
ggplot(d, aes(x = estimate, y = y_position))
```
x軸に推定値、y軸に手動設定した位置を使用します。
```r
geom_vline(xintercept = 0, linetype = "dashed", color = "gray50")
```
推定値=0の位置に縦の破線を引いて基準線とします。
```r
geom_point(size = 4, shape = 15)
geom_errorbarh(aes(xmin = lower, xmax = upper), height = 0.3)
```
点推定値を四角(shape = 15)で表示し、信頼区間を横線で表示します。
```r
scale_y_continuous(breaks = d$y_position, labels = d$subgroup)
```
y軸の目盛り位置(breaks)とラベル(labels)を対応させます。
```r
theme(panel.grid.major.y = element_blank(),
panel.grid.minor = element_blank(),
plot.background = element_rect(fill = "white", color = NA),
panel.background = element_rect(fill = "white", color = NA))
```
y軸のグリッド線を削除し、背景を白に設定します。
## 完全なRコード
```r
# パッケージの読み込み
library(ggplot2)
# サブグループ解析データの作成
d <- data.frame(
subgroup = c("Male", "Female", "Age>=65", "Age<65", "BMI>=25", "BMI<25", "Overall"),
estimate = c(-0.18, -0.05, -0.12, -0.15, -0.22, -0.08, -0.13),
lower = c(-0.32, -0.18, -0.25, -0.28, -0.35, -0.22, -0.22),
upper = c(-0.02, 0.12, 0.05, 0.00, -0.05, 0.08, -0.03)
)
# y軸の位置を手動で設定(サブグループをまとめる)
d$y_position <- c(9, 8, 6, 5, 3, 2, 0)
# フォレストプロット作成
ggplot(d, aes(x = estimate, y = y_position)) +
geom_vline(xintercept = 0, linetype = "dashed", color = "gray50") +
geom_point(size = 4, shape = 15) +
geom_errorbarh(aes(xmin = lower, xmax = upper), height = 0.3) +
scale_y_continuous(breaks = d$y_position,
labels = d$subgroup) +
labs(title = "Treatment Effect by Subgroup",
x = "Estimate (95% CI)",
y = "") +
theme_minimal() +
theme(panel.grid.major.y = element_blank(),
panel.grid.minor = element_blank(),
plot.background = element_rect(fill = "white", color = NA),
panel.background = element_rect(fill = "white", color = NA))
```
## オッズ比など対数軸が必要な場合
オッズ比やハザード比など、1を基準とする指標の場合は対数軸を使用します。この場合は`scale_x_log10()`を追加します。
```r
# オッズ比のデータ例
or_data <- data.frame(
subgroup = c("Male", "Female", "Overall"),
or = c(0.82, 0.95, 0.87),
lower = c(0.68, 0.82, 0.78),
upper = c(0.98, 1.12, 0.97)
)
or_data$subgroup <- factor(or_data$subgroup, levels = rev(or_data$subgroup))
# 対数軸でのプロット
ggplot(or_data, aes(x = or, y = subgroup)) +
geom_vline(xintercept = 1, linetype = "dashed", color = "gray50") +
geom_point(size = 4, shape = 15) +
geom_errorbarh(aes(xmin = lower, xmax = upper), height = 0.2) +
scale_x_log10() + # 対数軸に変換
labs(title = "Treatment Effect by Subgroup",
x = "Odds Ratio (95% CI)",
y = "") +
theme_minimal() +
theme(panel.grid.major.y = element_blank(),
panel.grid.minor = element_blank(),
plot.background = element_rect(fill = "white", color = NA),
panel.background = element_rect(fill = "white", color = NA))
```
![[forest_plot_or.png|400]]
対数軸を使うことで、1より大きい値と小さい値が対称的に表示されます。
## まとめ
ggplot2を使えば、専門的なメタ解析パッケージを使わなくても、シンプルなフォレストプロットを作成できます。回帰係数などの推定値をプロットする場合は0を基準線とし、オッズ比などをプロットする場合は対数軸で1を基準線とします。