Rで解析:フォレストプロットを作成「ggforestplotR」パッケージの紹介
複数の変数の効果量と信頼区間を一覧できるフォレストプロットは便利ですが、作図用のデータを整え、体裁の整った図に仕上げるには手間がかかります。本パッケージは、データを作図用に整えるコマンドが収録されているだけでなく、「ggplot2」パッケージのコマンドを適応できるので図の体裁を整えるのも簡単です。
パッケージバージョンは0.3.0。Windows 11 x64 (build 26200)のR version 4.6.1で確認しています。
<おすすめのRに関する書籍です>
Rではじめるデータサイエンス 第2版 | Hadley Wickham, Mine Çetinkaya-Rundel, Garrett Grolemund, 大橋 真也
Rによる機械学習[第3版] (Programmer's SELECTION)
パッケージのインストール
下記コマンドを実行してください。
# パッケージのインストール
install.packages("ggforestplotR")
# パッケージの読み込み
library("ggforestplotR")
# コマンド例に必要なパッケージ
# install.packages("broom")
library("broom")
# install.packages("tidyverse")
library("tidyverse")スポンサーリンク
コマンド例
詳細はコメント、パッケージのヘルプを確認してください。
フォレストプロットの作成手順は、「tidy_forest_model」と「bind_forest_models」を使用してモデルオブジェクトを整理し、次に「add_forest_table」や「add_split_table」を使って要約表や分割表を追加し、最後に「ggforestplot」です。
複数モデルの係数を1つのフォレストプロット用データに結合:bind_forest_modelsコマンド
コマンド例ではggplot2パッケージのコマンドで色・ラベル・体裁を整えています。
| オプション | 意味 | 初期値 |
|---|---|---|
| models | fitしたモデルオブジェクトを格納した、空でないリストを指定 | |
| model_labels | フォレストプロット上で各モデルを識別するラベルを指定;未指定の場合はリストの名前。なければ「Model 1」「Model 2」が名前に使われる | NULL |
| exponentiate | 推定値を指数変換するかどうかを指定;NULLの場合はtidy_forest_model()がモデルごとに適切なスケールを自動判定する。単一の論理値、またはモデルごとに1つずつ論理値を指定することも可能 | NULL |
| … | tidy_forest_model()にそのまま渡す追加の引数を指定(conf.level、intercept、term_labels、sort_termsなど) |
# 基本モデルを作成
fit1 <- lm(mpg ~ wt + hp, data = mtcars)
# 調整済みモデルを作成
fit2 <- lm(mpg ~ wt + qsec, data = mtcars)
# 2つのモデルの係数を1つのフォレストプロット用データに結合する(group列にモデル名が入る)
bound <- bind_forest_models(list(Base = fit1, Adjusted = fit2))
# フォレストプロットを作成(点・基準線・行の塗り分けはこの関数の引数で指定する)
p <- ggforestplot(
bound,
striped_rows = TRUE, # 行を交互に塗り分けて見やすくする
stripe_fill = "grey96", # 塗り分けの色
point_size = 2.8, # 点(推定値)のサイズ
ref_line = 0, # 効果なしを示す基準線(加法モデルなので0)
ref_color = "grey70" # 基準線の色
)
# ggplot2パッケージのコマンドで色・ラベル・体裁を整える
p <- p +
# モデル名(group)の色を手動で指定し、凡例タイトルも付ける
scale_colour_manual(
name = "モデル",
values = c(Base = "#2C7FB8", Adjusted = "#D95F0E")
) +
# タイトルや軸ラベルを付ける
labs(
title = "回帰係数のフォレストプロット",
subtitle = "mtcars を用いた2モデルの比較",
x = "推定値(95%信頼区間)",
caption = "データ: mtcars"
) +
# 全体の体裁を微調整する(theme_bwを上書きせず追記する)
theme(
plot.title = element_text(face = "bold"),
legend.position = "top",
panel.grid.minor = element_blank()
)
# 図を表示
p
単一のモデルをフォレストプロット用データに整形:tidy_forest_modelコマンド
モデルの結果をわかりやすく整理し、フォレストプロットで可視化したい場合に便利です。
| オプション | 意味 | 初期値 |
|---|---|---|
| model | fitしたモデルオブジェクト | |
| conf.int | 信頼区間を要求するかどうか | TRUE |
| conf.level | 信頼区間の水準 | 0.95 |
| exponentiate | 推定値を指数変換するかどうかを指定する論理値;そのままbroom::tidy()に渡される | NULL |
| intercept | インターセプト項を使用するかどうか | FALSE |
| term_labels | 表示用にターム名を再ラベルする | NULL |
| sort_terms | 行の並び順を指定。”none”, “descending”, “ascending”から選択 | “none” |
# broomパッケージが利用可能な場合のみ実行
if (requireNamespace("broom", quietly = TRUE)) {
# 線形回帰モデルを作成
fit <- lm(mpg ~ wt + hp + qsec, data = mtcars)
# フォレストプロット用データに整形する
tidy_forest_model(fit)
# 乱数のシードを固定
set.seed(123)
# ロジスティック回帰用のサンプルデータを作成
logit_data <- data.frame(
age = rnorm(250, mean = 62, sd = 8),
bmi = rnorm(250, mean = 28, sd = 4),
treatment = factor(rbinom(250, 1, 0.45), labels = c("Control", "Treatment"))
)
# 線形予測子を計算
linpred <- -9 + 0.09 * logit_data$age + 0.11 * logit_data$bmi +
0.9 * (logit_data$treatment == "Treatment")
# 線形予測子からイベントの発生有無を生成
logit_data$event <- rbinom(250, 1, plogis(linpred))
# ロジスティック回帰モデルをfitする
logit_fit <- glm(event ~ age + bmi + treatment, data = logit_data, family = binomial())
# オッズ比として表示するため指数変換して整形する
tidy_forest_model(logit_fit, exponentiate = TRUE)
}実行結果:
> tidy_forest_model(fit)
term estimate conf.low conf.high label group grouping separate_groups n events p.value
1 wt -4.35879720 -5.9006341 -2.81696034 wt <NA> <NA> <NA> <NA> <NA> 3.217222e-06
2 hp -0.01782227 -0.0485098 0.01286526 hp <NA> <NA> <NA> <NA> <NA> 2.441762e-01
3 qsec 0.51083369 -0.3888708 1.41053822 qsec <NA> <NA> <NA> <NA> <NA> 2.546284e-01
std.error statistic
1 0.75270039 -5.790879
2 0.01498117 -1.189645
3 0.43922153 1.163043
> tidy_forest_model(logit_fit, exponentiate = TRUE)
term estimate conf.low conf.high label group grouping separate_groups n events
1 age 1.094012 1.056100 1.136280 age <NA> <NA> <NA> <NA> <NA>
2 bmi 1.109515 1.035159 1.192999 bmi <NA> <NA> <NA> <NA> <NA>
3 treatmentTreatment 1.905342 1.112625 3.299050 treatmentTreatment <NA> <NA> <NA> <NA> <NA>
p.value std.error statistic
1 1.371793e-06 0.01860639 4.829060
2 3.961390e-03 0.03606915 2.881220
3 1.981210e-02 0.27669215 2.329887フォレストプロットに要約表を追加:add_forest_tableコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| plot | ggforestplot()で作成したプロットを指定;NULLのまま「+ add_forest_table(…)」構文で使うことも可能 | NULL |
| position | 表をフォレスト図の左側か右側に配置するかどうか。”left”, “right”から選択 | “left”, “right” |
| columns | 表示するサイドテーブルの列を、表示順に指定;組み込み名”term”、”n”、”events”、”estimate”、”ci”、”p”のほか、元データフレームの任意の列名や列番号も指定可能。”conf.low”・”conf.high”は”ci”の別名として扱われる | NULL |
| term_header | 用語のヘッダー文 | “Term” |
| n_header | 標本数のヘッダー文 | “N” |
| events_header | イベント数のヘッダー文 | “Events” |
| estimate_label | 推定値のヘッダー表示ラベル | NULL |
| p_header | 有意水準のヘッダー文 | “P-value” |
| column_labels | 表の列名を再ラベルするための名前付きベクトル | NULL |
| digits | 非推奨の引数(estimate_digits・interval_digits・p_digitsを個別に使用)。推定値と有意水準の書式に使う桁数を指定 | 2 |
| estimate_digits | 桁数を指定 | NULL |
| interval_digits | 信頼区間の境界値の桁数を指定 | NULL |
| p_digits | p値の桁数を指定 | NULL |
| estimate_fmt | 推定値の書式を指定。デフォルトは「推定値 ({信頼下限}, 信頼上限)」か「推定値」で、列にCIが含まれる場合は「推定値」のみ | NULL |
| ci_fmt | 信頼区間の書式を指定。列にCIが含まれる場合に使用し、「({信頼下限}, 信頼上限})」もしくは「{信頼下限, 信頼上限}」をサポートする | NULL |
| text_size | 表の内容の文字サイズを指定。デフォルトは3.2 | NULL |
| header_text_size | 表の列ラベルの文字サイズを指定。デフォルトは11 | NULL |
| header_fontface | 表の列ラベルのフォントを指定。デフォルトは「bold」 | “bold” |
| header_family | 表の列ラベルのオプションのフォントファミリーを指定 | NULL |
| striped_rows | 表に交互行のストライプを描くかどうかを指定。デフォルトはggforestplot()で使用されるストライプ設定 | NULL |
| stripe_fill | 行の塗り色を指定 | NULL |
| stripe_colour | 行の輪郭線の色を指定 | NULL |
| stripe_alpha | 行の透明度を指定 | NULL |
| grid_lines | 表に黒い水平グリッドラインを描くかどうかを指定 | FALSE |
| grid_line_colour | 表のグリッドラインの色を指定 | “black” |
| grid_line_size | 表のグリッドラインの太さを指定 | 0.3 |
| grid_line_linetype | 表のグリッドラインの種類を指定 | 1 |
# サンプルの係数データフレームを作成
coefs <- data.frame(
term = c("Age", "BMI", "Treatment"),
estimate = c(0.3, -0.2, 0.4),
conf.low = c(0.1, -0.4, 0.2),
conf.high = c(0.5, 0.0, 0.6),
sample_size = c(120, 115, 98),
p_value = c(0.012, 0.031, 0.004))
# フォレストプロットを作成
p <- ggforestplot(coefs, n = "sample_size", p.value = "p_value")
# プロットの左側に要約表を追加
add_forest_table(
p,
position = "left",
columns = c("term", "n", "estimate", "p"),
estimate_label = "Beta")
# 「+」演算子を使って、プロットの右側に要約表を追加する場合
ggforestplot(coefs, n = "sample_size", p.value = "p_value") +
add_forest_table(
position = "right",
columns = c("term", "n", "estimate", "p"),
estimate_label = "Beta")・プロットの左側に要約表を追加

・「+」演算子を使って、プロットの右側に要約表を追加する場合

フォレストプロットの前後に表を分割して配置:add_split_tableコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| plot | ggforestplotで作成されたプロットを指定。NULLの場合、+ add_split_table(…) 構文を使用する | NULL |
| left_columns | 左側に表示する列を指定 | NULL |
| right_columns | 右側に表示する列を指定 | NULL |
| term_header | 用語のヘッダー文 | “Term” |
| n_header | 標本数のヘッダー文 | “N” |
| events_header | イベント数のヘッダー文 | “Events” |
| estimate_label | 推定値のヘッダー表示ラベル | NULL |
| p_header | 有意水準のヘッダー文 | “P-value” |
| column_labels | 列名を指定 | NULL |
| digits | 非推奨の引数(estimate_digits・interval_digits・p_digitsを個別に使用)。推定値と有意水準の書式に使う桁数を指定 | 2 |
| estimate_digits | 桁数を指定 | NULL |
| interval_digits | 信頼区間の境界値の桁数を指定 | NULL |
| p_digits | p値の桁数を指定 | NULL |
| estimate_fmt | 推定値の書式を指定 | NULL |
| ci_fmt | 信頼区間の書式を指定。(ci)を含む場合 | NULL |
| text_size | 表の内容の文字サイズを指定。デフォルトは3.2 | NULL |
| header_text_size | 表の列ラベルの文字サイズを指定。デフォルトは11 | NULL |
| header_fontface | 表の列ラベルのフォントを指定。デフォルトは「bold」 | “bold” |
| header_family | 表の列ラベルのオプションのフォントファミリーを指定 | NULL |
| striped_rows | 表の行に交互のストライプを描くかどうかを指定 | NULL |
| stripe_fill | 行の塗り色を指定 | NULL |
| stripe_colour | 行の輪郭線の色を指定 | NULL |
| stripe_alpha | 行の透明度を指定 | NULL |
| left_width | 左側の表ブロックの幅を指定;未指定の場合、表示する列数とplot_widthから自動算出される | NULL |
| plot_width | フォレストプロットパネルの幅を指定。デフォルトは2.5 | NULL |
| right_width | 右側の表ブロックの幅を指定;未指定の場合、表示する列数とplot_widthから自動算出される | NULL |
# サンプルの係数データフレームを作成
coefs <- data.frame(
term = c("Age", "BMI", "Treatment"),
estimate = c(0.3, -0.2, 0.4),
conf.low = c(0.1, -0.4, 0.2),
conf.high = c(0.5, 0.0, 0.6),
sample_size = c(120, 115, 98),
p_value = c(0.012, 0.031, 0.004)
)
# フォレストプロットを作成
p <- ggforestplot(coefs, n = "sample_size", p.value = "p_value")
# プロットの左右に列名を指定して表を分割配置
add_split_table(
p, left_columns = c("term", "n"),
right_columns = c("estimate", "p"),
estimate_label = "HR")
# 「+」演算子を使い、列番号を指定して表を分割配置する場合
# プロットの左右に列名を指定して表を分割配置と同じ
# ggforestplot(coefs, n = "sample_size", p.value = "p_value") +
# add_split_table(
# left_columns = c(1, 5),
# right_columns = c(2, 6),
# estimate_label = "HR")・プロットの左右に列名を指定して表を分割配置

係数データからフォレストプロットを描画:ggforestplotコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| data | tidyな係数データフレームかbroom::tidy()がサポートするモデルオブジェクトを指定 | |
| term | モデルの項識別子を保持する列名を指定 | “term” |
| estimate | 点推定値を保持する列名を指定 | “estimate” |
| conf.low | 下限の信頼区間を示す列名 | “conf.low” |
| conf.high | 上限の信頼区間を示す列名 | “conf.high” |
| label | 表示行ラベルに使用するオプションの列名 | term |
| term_labels | 表示用語の名前を再定義するためのオプションのベクトル。用語の値と表示するラベルが一致する必要がある | NULL |
| group | 色分け推定に使用するオプションの列名 | NULL |
| facet | 行を区切るファセットプロットセクションに使用するオプションの列名。ファクター型の場合、レベルがファセット順序を制御する | NULL |
| facet_strip_position | ファセットストリップラベルの位置決め。”left”, “right”から選択 | “left” |
| separate_groups | グリッド線で囲むことができるラベルされた変数ブロックを特定するオプションの列名 | NULL |
| n | サンプルサイズを指定 | NULL |
| events | イベント数を指定 | NULL |
| p.value | 有意水準を指定 | NULL |
| exponentiate | 真偽値;TRUEならば推定値を対数スケールに変換し、基準線を1に引く。モデルオブジェクトの場合、NULLはCoxモデルのハザード比のように、推測可能な標準スケールを使用する | NULL |
| sort_terms | 行の並び順を指定 | c(“none”, “descending”, “ascending”) |
| point_size | 係数マーカーの点の大きさを指定 | 2.3 |
| point_shape | 係数マーカーの形状を指定 | 19 |
| linewidth | 信頼区間の太さを指定 | 0.5 |
| line_size | 非推奨(linewidthを使用) | NULL |
| staple_width | 信頼区間の端部の幅を指定 | 0.2 |
| ci_limits | 表示する信頼区間の長さを指定 | NULL |
| ci_arrows | 真偽値;TRUEの場合、ci_limitsで切り詰められた信頼区間に外向きの矢印を描画する | TRUE |
| ci_arrow_length | CIの長さ | 0.08 |
| ci_arrow_type | 矢頭の種類 | c(“closed”, “open”) |
| dodge_width | グループ推定の水平回避 | 0.6 |
| separate_lines | 各ブロックにグリッド線を引くか | FALSE |
| separator_line_linetype | 区切り線の種類 | 2 |
| separator_line_colour | 区切り線の色 | “black” |
| separator_line_size | 区切り線の太さ | 0.4 |
| striped_rows | 交互行を塗りつぶすか | FALSE |
| stripe_fill | 塗りつぶし色 | “grey95” |
| stripe_colour | 行の境界線の色 | NA |
| stripe_alpha | 影の透明度 | 1 |
| ref_line | 基準線を引くx座標、またはNULLで非表示;未指定の場合、加法モデルでは0、指数変換されたモデルでは1が使われる | NULL |
| ref_label | 基準線に添付する任意のラベル | NULL |
| ref_linetype | 基準線の種類 | 2 |
| ref_color | 基準線の色 | “grey60” |
# サンプルの係数データフレームを作成
coefs <- data.frame(
term = c("Age", "BMI", "Treatment"),
estimate = c(0.10, -0.08, 0.34),
conf.low = c(0.02, -0.16, 0.12),
conf.high = c(0.18, 0.00, 0.56))
# 初期設定でフォレストプロット
ggforestplot(coefs)
# 交互の行ストライプと点スタイルを変えてフォレストプロット
ggforestplot(coefs, striped_rows = TRUE, point_shape = 17)
係数データフレームをフォレストプロット用の標準形式に変換:as_forest_dataコマンド
| オプション | 意味 | 初期値 |
|---|---|---|
| data | 係数推定値と区間を含むデータフレーム | |
| term | モデル項識別子を保持する列名 | |
| estimate | 点推定値を保持する列名 | |
| conf.low | 信頼区間の下限を示す列名 | |
| conf.high | 信頼区間の上限を示す列名 | |
| label | 表示行ラベルに使用するオプションの列名 | term |
| term_labels | 表示用語の名前を再定義するためのオプションのベクトル。用語の値と表示するラベルが一致する必要がある | NULL |
| group | 行ごとに複数の推定値を色分けするためのオプションの列名 | NULL |
| grouping | 行をグループ化したプロットセクションに分割するためのオプションの列名 | NULL |
| separate_groups | 区切り線で囲むことができるラベル付き変数ブロックを特定するオプションの列名 | NULL |
| n | サンプルサイズを指定 | NULL |
| events | イベント数を指定 | NULL |
| p.value | 有意水準を指定 | NULL |
| exponentiate | 真偽値;推定値と信頼区間が正の値であることを要求 | FALSE |
| sort_terms | 行の並び順を指定 | c(“none”, “descending”, “ascending”) |
# サンプルデータを作成
raw <- data.frame(
variable = c("Age", "BMI", "Treatment"),
beta = c(0.10, -0.08, 0.34),
lower = c(0.02, -0.16, 0.12),
upper = c(0.18, 0.00, 0.56))
# 列名を、フォレストプロット対応の列名に変換する
as_forest_data(
data = raw,
term = "variable",
estimate = "beta",
conf.low = "lower",
conf.high = "upper")
<おすすめのRに関する書籍です>
はじめてのR: ごく初歩の操作から統計解析の導入まで | 村井 潤一郎
Amazonで村井 潤一郎のはじめてのR: ごく初歩の操作から統計解析の導入まで。
この記事が誰かの役に立ちますように。
スポンサーリンク