研究者: Rでロジスティック回帰分析を行ったら、対照群(Control)ではなく介入群が基準になってオッズ比が 0.2 と表示されてしまいました……。基準を入れ替えて見やすくする方法はありますか?
統計ER: それはRの「因子水準(Factor Levels)の順序ルール」が原因です!
forcats::fct_rev()を使えば1行で水準を反転できますし、任意のカテゴリを基準に指定することも簡単です。さっそく手順を解説しましょう!
臨床研究において電子カルテやアンケートからデータを抽出した際、「さあ、さっそくt検定や多変量解析を行おう」とRを立ち上げたものの、エラーが発生して解析が停止した経験や、回帰分析の出力が見づらくなってしまった経験はないだろうか。
特に、意図しない群が基準(リファレンス)になってオッズ比が 0.2 などと表示されたり、ggplot2で棒グラフを描いたらY軸の項目の上下順序が意図と逆に表示されたりするケースが多発する。
こうした現象の主な原因は、Rにおける「因子水準(Factor Levels)の順序ルール」にある。
Rの因子型(factor)データは、裏側で「水準(levels)の並び順」を保持しており、モデルの比較基準やグラフの描画順はこの水準順序に厳格に従う。
本記事では、因子水準の順番を直感的に反転(逆順に)させる鉄板テクニック(特に forcats::fct_rev())を中心に、任意のカテゴリを自由自在に基準群に設定する方法までを分かりやすく解説する。
前処理で因子水準をサクッと整え、クリアで査読者に伝わりやすい解析結果・論文図表を作成しよう。
なぜ因子水準の順序が重要なのか?(解析と作図のルール)
Rで文字列データ(character)を因子型(factor)に変換すると、指定しない限りアルファベット順(または50音順)で自動的に水準(levels)が設定される。この水準順序は、主に以下の2つの場面で決定的な影響を及ぼす。
1. 回帰分析における「基準カテゴリ(Reference Group)」の決定
ロジスティック回帰分析やCoxプロポーショナルハザードモデルなどの回帰モデルでは、因子水準の最初のレベル(第1水準)が自動的に比較の基準(Reference = 1.0)として割り当てられる。
たとえば、介入群(Treatment)と対照群(Control)の2群比較を行う際、水準が ("Control", "Treatment") であれば Control が基準となる。しかし、何らかの理由で水準が ("Treatment", "Control") になっていると、Treatment が基準となり、オッズ比(OR)やハザード比(HR)が逆数表示(例: OR = 0.2)になってしまうのだ。
2. ggplot2やフォレストプロットでの「描画順(Y軸・凡例)」
ggplot2 や forestplot などの作図パッケージでは、グラフの凡例や軸の並び順が因子水準に連動する。
ポイント:ggplot2におけるY軸描画の基本仕様 > Y軸(縦軸)にカテゴリ変数を配置した場合、第1水準がY軸の一番下、以降の水準が上に向かって順に描画されるのがデフォルト仕様である。このため、臨床プロトコル通り「Stage I ➔ Stage IV」の順で上から下に並べたい場合に、見た目が上下反転してしまう現象が起こる。
因子水準をサクッと逆順にする方法(forcats vs Base R)
因子水準を逆順(反転)にする方法はいくつか存在するが、最もおすすめなのは tidyverse パッケージ群に含まれる forcats パッケージ を活用する方法である。
最推奨!forcats::fct_rev() で1行で逆順にする
forcats パッケージの fct_rev() 関数を使用すると、既存の水準順序をそのまま一瞬で真逆に反転させることができる。
library(tidyverse)
# サンプル因子の作成(デフォルトではアルファベット順)
group <- factor(c("Control", "Treatment_A", "Treatment_B"))
levels(group)
# [1] "Control" "Treatment_A" "Treatment_B"
# fct_rev() で水準順序を反転
group_rev <- fct_rev(group)
levels(group_rev)
# [1] "Treatment_B" "Treatment_A" "Control"
fct_rev()の強み > 第一引数に因子型変数を渡すだけで記述でき、パイプ演算子(%>%や|>)の中でも直感的に組み込める点が最大のメリットである。
Base R派向け:factor() と rev() を組み合わせる方法
追加のパッケージを読み込まず、標準関数(Base R)のみで処理したい場合は、levels 引数に rev(levels(x)) を渡す。
# Base R での逆順処理
group_base_rev <- factor(group, levels = rev(levels(group)))
levels(group_base_rev)
# [1] "Treatment_B" "Treatment_A" "Control"
やや構文が冗長になるため、基本的には fct_rev() を使用するのが可読性の面からも推奨される。
【実戦】因子水準を反転させる2大活用シーン
ここからは、実際の臨床研究・論文執筆で頻繁に遭遇する実務シーンでの具体的な活用例を紹介する。
シーン1:ロジスティック回帰のオッズ比(OR)の基準を反転する
以下の例では、対照群(Control)と介入群(Treatment)で疾患(Disease)の発症率をロジスティック回帰分析で評価する。
library(tidyverse)
# サンプルデータの作成
set.seed(123)
df <- tibble(
disease = sample(c(0, 1), 100, replace = TRUE, prob = c(0.7, 0.3)),
# 意図せず Treatment が第1水準になっているケース
group = factor(sample(c("Control", "Treatment"), 100, replace = TRUE),
levels = c("Treatment", "Control"))
)
# 【意図しない解析】Treatment が基準になってしまい、OR < 1 で見づらい
model_bad <- glm(disease ~ group, data = df, family = binomial)
summary(model_bad)
# 【改善処理】fct_rev() で基準を Control(第1水準)に入れ替える
df <- df %>%
mutate(group_correct = fct_rev(group))
# 【理想的な解析】Control が基準となり、理解しやすい直感的な結果が得られる
model_good <- glm(disease ~ group_correct, data = df, family = binomial)
summary(model_good)
基準群を逆順に整えることで、論文本文やTableへ記載する際の解釈ミスを劇的に減らすことが可能になる。
シーン2:ggplot2 やフォレストプロットのY軸並び順を整える
癌の進行度(Stage I 〜 IV)ごとの患者数を横向き棒グラフで描画する際、デフォルトでは下から「Stage I」と積み上がってしまう。これを「上が Stage I、下が Stage IV」の順に修正する。
library(tidyverse)
# サンプルデータ
df_stage <- tibble(
stage = factor(c("Stage I", "Stage II", "Stage III", "Stage IV"),
levels = c("Stage I", "Stage II", "Stage III", "Stage IV")),
count = c(120, 85, 45, 15)
)
# 【デフォルトの描画】下から Stage I ➔ 上に向かって Stage IV(上下不自然)
ggplot(df_stage, aes(x = count, y = stage)) +
geom_col(fill = "steelblue") +
labs(title = "デフォルト:下がStage Iになる")
# 【改善後の描画】fct_rev() でY軸の描画順を逆転(上から Stage I ➔ Stage IV)
ggplot(df_stage, aes(x = count, y = fct_rev(stage))) +
geom_col(fill = "steelblue") +
labs(y = "Stage", title = "改善後:上がStage Iになる")
y = fct_rev(stage) と作図関数内で指定するだけで、データフレーム自体を書き換えることなく見た目を一瞬で整えることができる。
【コラム】任意のカテゴリを基準(リファレンス)に変更する方法
ここまでは「水準全体を逆順にする方法」を説明してきたが、実務では「特定のカテゴリ(例: Control群や標準治療群)だけをピンポイントで最先頭(リファレンス)に移動させたい」というケースも多い。
そのような場合に活躍する手法を解説する。
特定の1つだけを基準に指定する:forcats::fct_relevel()
forcats パッケージの fct_relevel() を使うと、指定した水準を最先頭(第1水準)に引き上げることができる。
# サンプル水準:("Treatment_B", "Control", "Treatment_A")
group_multi <- factor(c("Treatment_B", "Control", "Treatment_A"))
# "Control" だけを第1水準(基準群)に移動する
group_releveled <- fct_relevel(group_multi, "Control")
levels(group_releveled)
# [1] "Control" "Treatment_B" "Treatment_A"
なお、第2水準以降の順番も細かく指定したい場合は、fct_relevel(x, "Control", "Treatment_A", "Treatment_B") のように複数の順序を引数に渡せばよい。
Base Rで指定する:relevel() 関数
Base R で特定のカテゴリを基準群に変更したい場合は、relevel() 関数を使用する。
# Base R で "Control" を基準群にする
group_base_relevel <- relevel(group_multi, ref = "Control")
levels(group_base_relevel)
# [1] "Control" "Treatment_B" "Treatment_A"
回帰分析の直前に relevel(df$group, ref = "Control") と1行実行するテクニックは、Base R ユーザーの解析で長年重宝されている古典的かつ信頼性の高い手法である。
ありがちなトラップ:rev() を単体で使ってもレベルは変わらない!
注意:初心者あるあるの落とし穴 > ベクトルに対して単に
rev()を適用しても、データの行順が反転するだけで、因子水準(Factor Levels)の順序は変化しないので注意しよう。
x <- factor(c("Low", "Medium", "High"))
levels(x)
# [1] "High" "Low" "Medium" (アルファベット順)
# 誤った処理:ベクトル自体に rev() をかける
x_wrong <- rev(x)
print(x_wrong)
# [1] High Medium Low
levels(x_wrong)
# [1] "High" "Low" "Medium" (水準の順番は変わっていない!)
因子水準を変更したい場合は、必ず fct_rev(x) や factor(x, levels = rev(levels(x))) を使用することを徹底しよう。
【まとめ】因子水準の操作をマスターしてストレスフリーな解析へ
Rにおける因子水準の操作ルールを整理すると以下のようになる。
- すべての水準を丸ごと反転(逆順)させたいとき:
forcats::fct_rev(x) - 特定のカテゴリだけを基準群(リファレンス)にしたいとき:
forcats::fct_relevel(x, "基準にしたい名称")(Base R ならrelevel(x, ref = "..."))
データ前処理の段階で因子水準の意図を明確にしておけば、回帰分析でのオッズ比の計算ミスや、作図時の見た目の不自然さに悩まされることはなくなる。
適切な前処理をマスターし、査読者や共同研究者に一目で伝わる信頼性の高い研究成果を作り上げていこう。





コメント