本文へスキップ
からだにいいもの

Rのトピックスを中心に『まだ、まだ、知らない、役に立つ情報?』を発信します。

Rで解析:フォレストプロットを作成「ggforestplotR」パッケージの紹介

複数の変数の効果量と信頼区間を一覧できるフォレストプロットは便利ですが、作図用のデータを整え、体裁の整った図に仕上げるには手間がかかります。本パッケージは、データを作図用に整えるコマンドが収録されているだけでなく、「ggplot2」パッケージのコマンドを適応できるので図の体裁を整えるのも簡単です。

パッケージバージョンは0.3.0。Windows 11 x64 (build 26200)のR version 4.6.1で確認しています。

パッケージのインストール

下記コマンドを実行してください。

# パッケージのインストール
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パッケージのコマンドで色・ラベル・体裁を整えています。

オプション意味初期値
modelsfitしたモデルオブジェクトを格納した、空でないリストを指定
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コマンド

モデルの結果をわかりやすく整理し、フォレストプロットで可視化したい場合に便利です。

オプション意味初期値
modelfitしたモデルオブジェクト
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コマンド

オプション意味初期値
plotggforestplot()で作成したプロットを指定;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_digitsp値の桁数を指定NULL
estimate_fmt推定値の書式を指定。デフォルトは「推定値 ({信頼下限}, 信頼上限)」か「推定値」で、列にCIが含まれる場合は「推定値」のみNULL
ci_fmt信頼区間の書式を指定。列にCIが含まれる場合に使用し、「({信頼下限}, 信頼上限})」もしくは「{信頼下限, 信頼上限}」をサポートするNULL
text_size表の内容の文字サイズを指定。デフォルトは3.2NULL
header_text_size表の列ラベルの文字サイズを指定。デフォルトは11NULL
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コマンド

オプション意味初期値
plotggforestplotで作成されたプロットを指定。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_digitsp値の桁数を指定NULL
estimate_fmt推定値の書式を指定NULL
ci_fmt信頼区間の書式を指定。(ci)を含む場合NULL
text_size表の内容の文字サイズを指定。デフォルトは3.2NULL
header_text_size表の列ラベルの文字サイズを指定。デフォルトは11NULL
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.5NULL
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コマンド

オプション意味初期値
datatidyな係数データフレームか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_lengthCIの長さ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")


この記事が誰かの役に立ちますように。

スポンサーリンク
価格および配送状況は変更される場合があります。購入時は商品ページをご確認ください。
当サイトに表示されている商品情報はAmazonから提供されたものであり、更新または削除される場合があります。
karada-goodはAmazonアソシエイトとして、適格販売により収入を得ています。