サブグループ解析と交互作用検定を正しく行う ― 効果修飾の評価・多重性・forest plotの落とし穴をRで実装する ―

記事の目次
Toggleこの記事でわかること
・サブグループ解析の目的は「効果修飾(治療効果が部分集団で異なる現象)」を評価することにあり、部分集団ごとの有意・非有意を眺めることではないと理解できます。
・「サブグループ内で別々に検定してP値を比べる」やり方がなぜ誤りやすいのか(検出力不足・多重性・post hoc・偶然の有意)を整理できます。
・探索的サブグループ解析と事前規定(pre-specified)サブグループ解析の違い、相対効果と絶対効果でサブグループの見え方が変わる理由がわかります。
・交互作用項 \( T\times S \) をモデルに入れて効果修飾を評価する「交互作用検定」の考え方と、その検出力が主効果より低いことを理解できます。
・定性的交互作用と定量的交互作用の違い、Gail-Simon検定の位置づけがわかります。
はじめに
臨床試験の結果を読むとき、私たちは「全体として治療が効いたか」だけでなく、「どんな患者でより効いたのか」に強い関心を持ちます。高齢者では効果が弱いのではないか、特定のバイオマーカー陽性例では劇的に効くのではないか――こうした問いに答えようとするのがサブグループ解析(subgroup analysis)です。しかしサブグループ解析は、臨床研究のなかでも最も誤用されやすい手法の一つでもあります。forest plot(フォレストプロット)に並んだ多数の部分集団を眺め、たまたまP値が小さかった一群を「この患者では効く」と結論づける――このような解釈は、規制当局からも繰り返し戒められてきました。
本記事は、製薬企業の生物統計担当者・臨床開発に携わる方・統計を実務で使う方を対象に、サブグループ解析と交互作用検定を「正しく」行うための考え方とRでの実装を解説します。まず効果修飾という概念を整理し、なぜサブグループ解析が誤りやすいのかを検出力・多重性・事前規定の観点から確認します。そのうえで、本手法の中核である交互作用検定(test for interaction)の理論――サブグループ内で別々に検定するのではなく、治療とサブグループの交互作用そのものをモデルで評価するという発想――を数式とともに丁寧に見ていきます。後半では、これらをRのコードで実装し、forest plotの作成と落とし穴、多重性への対処までを扱います。
サブグループ解析とは ― 効果修飾を評価する
サブグループ解析の目的を一言で言えば、効果修飾(effect modification)の評価です。効果修飾とは、ある変数(サブグループを定義する因子、たとえば年齢層・性別・バイオマーカーの有無)の水準によって、治療効果の大きさが異なる現象を指します。全体では平均的に一定の効果が観察されても、その内訳を見ると、ある集団では大きく、別の集団では小さい(あるいは向きすら逆)ということが起こり得ます。この「集団によって効果が違う」という構造を、統計的には効果修飾、あるいは治療とサブグループ因子の交互作用(interaction)と呼びます。効果修飾を因果推論の枠組みでどう捉えるかについては、第8回 集団ごとの効果の違いに目を向けるで背景を整理していますので、あわせてご覧ください。

なぜサブグループ解析は誤りやすいのか。 理由は大きく4つあります。第一に検出力不足です。臨床試験の例数は「全体での主要評価項目」を検出できるように設計されており、部分集団はその一部にすぎません。例数が小さくなれば標準誤差は大きくなり、真の効果があっても検出できない(偽陰性)ことが増えます。第二に多重性です。年齢・性別・病期・地域…と多数のサブグループを次々に調べれば、そのどこかで偶然に有意な結果が出る確率は跳ね上がります。多重性そのものの考え方は多重比較法の基礎と活用で詳しく扱っています。第三にpost hoc(事後的)な探索です。データを見てから「効いていそうな群」を選んで検定すれば、偶然を効果と取り違えやすくなります。第四に、これらが重なった結果としての偶然の有意です。多数の部分集団のうち一つで小さいP値が出ても、それは真の効果修飾ではなく、単なる偶然変動である可能性が高いのです。
探索的サブグループ解析と事前規定サブグループ解析。 サブグループ解析は、その位置づけによって解釈の重みが大きく変わります。試験開始前にプロトコルや統計解析計画書(SAP)で「どの因子を、どの方法で評価するか」を定めておくものを事前規定(pre-specified)サブグループ解析と呼びます。これに対し、データを見た後に思いついて行うものを探索的(exploratory / post hoc)サブグループ解析と呼びます。両者の違いを整理すると次のとおりです。
| 観点 | 事前規定(pre-specified) | 探索的(post hoc) |
|---|---|---|
| 計画のタイミング | データ収集前にプロトコル/SAPで規定 | データを見た後に着想 |
| 多重性の管理 | 評価する因子数を限定・調整方針も明記可能 | 実質的に無数の比較の一つになりやすい |
| 結果の解釈 | 仮説検証的に扱える(それでも交互作用検定が前提) | 仮説生成にとどめ、確証には別試験が必要 |
| 典型的な扱い | 主要解析を補完する位置づけ | あくまで探索・将来の研究への示唆 |
相対効果と絶対効果でサブグループの見え方は変わる。 もう一つ実務上重要なのが、効果を相対尺度(ハザード比HR・オッズ比OR・リスク比RR)で見るか、絶対尺度(リスク差)で見るかによって、サブグループの姿が変わる点です。たとえばハザード比が全サブグループで一定(相対効果は均一)でも、ベースラインのリスクが高い集団ほど、同じHRから得られる絶対的なリスク低下は大きくなります。逆に、絶対効果が一定であれば相対効果は集団ごとに異なります。「効果修飾があるかどうか」は、どの尺度で治療効果を定義したかに依存する概念なのです。したがってサブグループ解析を計画・解釈する際には、臨床的に意味のある尺度を意識的に選ぶ必要があります。この論点は、そもそも何を推定したいのかという推定対象の議論と直結しており、ICH E9(R1) Estimandフレームワーク徹底解説で扱う考え方とも通じます。
交互作用検定の理論 ― サブグループ内検定ではなく交互作用を見る
サブグループ解析で最もよくある誤りは、「サブグループごとに別々に検定し、そのP値を比べる」というやり方です。たとえば「男性では有意(P=0.01)、女性では非有意(P=0.20)だったので、この治療は男性に効く」という結論は、統計的には正当化されません。
「一方の群で有意、他方で非有意」というP値の食い違いは、効果が本当に異なる証拠にはなりません。効果の大きさが両群でまったく同じでも、例数や事象数の違いから、片方だけ有意になることは偶然でも普通に起こります。有意・非有意という二値の切れ目をまたぐだけで「効果が違う」と読んでしまうのは典型的な誤りです。効果が異なるかどうかを判断したいなら、サブグループ内で別々に検定するのではなく、両群の効果の「差」そのもの=交互作用を直接検定しなければなりません。
交互作用項をモデルに入れる。 正しいアプローチは、治療の指示変数 \( T \) とサブグループの指示変数 \( S \)、そしてその積である交互作用項 \( T\times S \) を一つの回帰モデルに同時に入れ、交互作用項の係数を検定することです。連続アウトカムの線形回帰であれば、モデルは次のように書けます。
\[ Y = \beta_0 + \beta_1 T + \beta_2 S + \beta_3 (T\times S) + \varepsilon \]
ここで \( Y \) はアウトカム、\( T \) は治療の有無(1=治療、0=対照)、\( S \) はサブグループ(1=群B、0=群A)を表す指示変数、\( \varepsilon \) は誤差項です。この式で \( \beta_1 \) は「群A(\( S=0 \))における治療効果」を表し、群B(\( S=1 \))における治療効果は \( \beta_1 + \beta_3 \) になります。したがって \( \beta_3 \) は「群Aと群Bで治療効果がどれだけ異なるか」=効果修飾(交互作用)の大きさそのものを表します。私たちが検定すべき帰無仮説は「サブグループ内で治療が効くか(\( \beta_1=0 \))」ではなく、「効果が群間で異なるか(\( \beta_3=0 \))」なのです。この \( \beta_3 \) を検定するのが交互作用検定にほかなりません。生存時間アウトカムのCox回帰やロジスティック回帰でも考え方は同じで、交互作用項の係数を対数ハザード比・対数オッズ比のスケールで検定します。
定性的交互作用と定量的交互作用。 効果修飾には性質の異なる2種類があります。両者の違いを整理すると次のとおりです。
| 種類 | 意味 | 臨床的含意 |
|---|---|---|
| 定量的交互作用 (quantitative) | 効果の向きは同じだが大きさが群間で異なる | どの群でも同方向に有益。程度の差にとどまる |
| 定性的交互作用 (qualitative) | 効果の向きが逆転する(一方で有益・他方で有害) | 治療方針が群で変わり得る。臨床的に極めて重大 |
定量的交互作用は「効き方の程度が違うだけ」であり、方向は一致しているため、臨床判断が根本から変わることは多くありません。一方、定性的交互作用は一方の群で有益・他方の群で有害と向きが逆転するもので、もし本当に存在すれば治療推奨そのものを左右する重大な所見です。ただし、見かけ上の向きの逆転は偶然でも起こりやすいため、慎重な検証が求められます。定性的交互作用の有無を専用に検定する手法としてGail-Simon検定(Gail-Simon test)が知られています。これは通常の交互作用検定が「効果の大きさに差があるか」を見るのに対し、「効果の符号が群間で逆転しているか」に焦点を当てた検定であり、定性的交互作用を主張したい場面での位置づけを担います。サブグループを層として扱い、層別に効果を推定・統合する発想の全体像は、層別解析により因果効果を推定するも参考になります。
交互作用検定は主効果より検出力が低い。 最後に、実務上きわめて重要な事実を確認しておきます。交互作用(差の差)を検出するための検出力は、主効果を検出するための検出力よりも大幅に低くなります。効果修飾の大きさが主効果と同程度である「理想的」な状況を仮定しても、同じ検出力で交互作用を検出するには、一般に主効果の約4倍の例数が必要とされます。これは、交互作用が2つの効果の「差」であり、差の推定量の分散が個々の効果の推定量より大きくなることに由来します。裏を返せば、通常の試験規模で交互作用検定が非有意であっても、それは「効果修飾が無い」ことの証明にはなりません。交互作用検定の非有意は「効果修飾があるとは言えない」にとどまり、サブグループ間の効果が等しいと積極的に結論できるわけではない――この非対称性を理解しておくことが、サブグループ解析を正しく運用する出発点になります。
Rによるサブグループ解析と交互作用検定の実装
ここからは実際のデータを使い、サブグループ解析と交互作用検定(効果修飾の統計的評価)をRで動かしていきます。理論だけでは腑に落ちにくい「サブグループ内のハザード比」「交互作用P値の読み方」「forest plotでの一貫性の確認」を、コード・出力・解釈の3点セットで追体験してください。
使用データ:survival パッケージの lung
題材には、Rの survival パッケージに同梱された肺がん患者228名の生存データ lung を用います。主な変数は次のとおりです。
time:観察期間(日)、status:転帰(1=打ち切り, 2=死亡)sex:性別(1=男性, 2=女性)… 今回の群(比較したい要因)として扱いますph.ecog:ECOG全身状態スコア(0=良好〜3=不良)、age:年齢 … サブグループ因子として扱います
「性別による予後の差(ハザード比)が、全身状態や年齢によって変わるか(効果修飾があるか)」を評価する、という設定です。Cox回帰そのものの基礎はCox比例ハザードモデル入門も参照してください。
library(survival)
data(lung)
# 群:性別を因子化(男性を基準)
lung$sex <- factor(lung$sex, levels = c(1, 2), labels = c("男性", "女性"))
# サブグループ因子:ECOG全身状態(0=良好 / 1以上=低下)と年齢(65歳で二分)
lung$ecog_grp <- factor(ifelse(lung$ph.ecog >= 1, "ECOG≥1", "ECOG0"),
levels = c("ECOG0", "ECOG≥1"))
lung$age_grp <- factor(ifelse(lung$age >= 65, "65歳以上", "65歳未満"),
levels = c("65歳未満", "65歳以上"))
全体の Cox 回帰で性別の主効果を推定する
まず、サブグループに分ける前に、全体集団での性別の主効果(ハザード比)を推定します。
fit_sex <- coxph(Surv(time, status) ~ sex, data = lung)
summary(fit_sex)
Call:
coxph(formula = Surv(time, status) ~ sex, data = lung)
n= 228, number of events= 165
coef exp(coef) se(coef) z Pr(>|z|)
sex女性 -0.5310 0.5880 0.1672 -3.176 0.00149 **
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
exp(coef) exp(-coef) lower .95 upper .95
sex女性 0.588 1.701 0.4237 0.8162
Concordance= 0.579 (se = 0.021 )
Likelihood ratio test= 10.63 on 1 df, p=0.001
性別(女性 vs 男性)のハザード比は HR=0.59(95%CI: 0.42–0.82, P=0.0015) でした。これは女性の死亡リスクが男性より約41%低いことを示し、肺がんコホートでよく知られた傾向と一致します。ただしこれは全体平均の効果であり、「どの患者でも一様に41%低い」と主張するものではありません。この平均効果がサブグループ間で均一かどうかを、次の交互作用検定で確かめます。
交互作用項を入れた Cox 回帰と尤度比検定
効果修飾を統計的に評価する正攻法は、モデルに交互作用項(群 × サブグループ因子)を加え、その項の有無でモデルの当てはまりが改善するかを尤度比検定(LRT)で調べることです。個々のサブグループでP値を比較するのではなく、この1本の交互作用検定で判断するのが原則です。
# 主効果のみ vs 交互作用あり
fit_main <- coxph(Surv(time, status) ~ sex + ecog_grp, data = lung)
fit_int <- coxph(Surv(time, status) ~ sex * ecog_grp, data = lung)
anova(fit_main, fit_int) # 交互作用の尤度比検定
Analysis of Deviance Table
Cox model: response is Surv(time, status)
Model 1: ~ sex + ecog_grp
Model 2: ~ sex * ecog_grp
loglik Chisq Df P(>|Chi|)
1 -736.71
2 -736.58 0.2601 1 0.6100
交互作用の尤度比検定は χ²=0.26, df=1, P=0.61 で有意ではありませんでした。すなわち「性別の効果はECOG良好群と低下群とで統計的に異なるとは言えない=サブグループ間で効果はおおむね均一」と読みます。交互作用が非有意なら、原則として全体のHR(0.59)を全患者に適用するのが妥当で、サブグループごとの数値差は偶然変動の範囲と考えます。ただし交互作用検定は検出力が低いため、「P>0.05だから効果修飾は絶対にない」と断定せず、あくまで探索的な所見として扱う姿勢が重要です。
サブグループごとのハザード比を算出する
参考情報として、各サブグループ内で別々にCoxモデルを当て、性別のHRを算出します。ここでの数値は「探索的な目安」であり、判断の主役はあくまで前段の交互作用P値です。
subgroups <- list(
"ECOG0(良好)" = subset(lung, ecog_grp == "ECOG0"),
"ECOG≥1(低下)" = subset(lung, ecog_grp == "ECOG≥1"),
"65歳未満" = subset(lung, age_grp == "65歳未満"),
"65歳以上" = subset(lung, age_grp == "65歳以上")
)
res <- lapply(subgroups, function(d) {
s <- summary(coxph(Surv(time, status) ~ sex, data = d))
c(n = s$n, HR = s$conf.int[1], low = s$conf.int[3],
high = s$conf.int[4], p = s$coefficients[5])
})
round(do.call(rbind, res), 3)
n HR low high p
ECOG0(良好) 63 0.521 0.279 0.973 0.040
ECOG≥1(低下) 164 0.618 0.420 0.909 0.015
65歳未満 138 0.603 0.403 0.902 0.013
65歳以上 90 0.557 0.338 0.917 0.022
各サブグループのHR・95%信頼区間・サブグループ内P値・(前段で得た)交互作用P値を一覧にまとめます。
| サブグループ | n | HR (95%CI) | サブグループ内P | 交互作用P |
|---|---|---|---|---|
| 全体 | 228 | 0.59 (0.42–0.82) | 0.001 | — |
| ECOG0(良好) | 63 | 0.52 (0.28–0.97) | 0.040 | 0.61 |
| ECOG≥1(低下) | 164 | 0.62 (0.42–0.91) | 0.015 | 0.61 |
| 65歳未満 | 138 | 0.60 (0.40–0.90) | 0.013 | 0.82 |
| 65歳以上 | 90 | 0.56 (0.34–0.92) | 0.022 | 0.82 |
サブグループ内のHRは 0.52〜0.62 の狭い範囲に収まり、いずれも全体推定の 0.59 を95%信頼区間の中に含んでいます。年齢の交互作用Pも0.82と非有意でした。ECOG0群の内P値が0.040とややきわどく見えますが、これはn=63と小さいために区間が広い(0.28–0.97)だけで、効果の大きさ自体は他群と整合的です。「サブグループ内P値の有意・非有意の切り替わり」に一喜一憂せず、区間の重なりと交互作用Pで一貫性を判断するのが正しい読み方です。
forest plot で効果の一貫性を可視化する
最後に、サブグループ別HRを forest plot に描き、効果が一貫しているかを視覚的に確認します。ここでは追加パッケージ依存の少ない ggplot2 で自作する例を示します(forestplot パッケージを使えば、表と図を並べた出版品質の図も作成できます)。forest plotの読み方の基本はメタアナリシス入門(フォレストプロット)も参考になります。
library(ggplot2)
plot_df <- data.frame(
subgroup = c("全体", "ECOG0(良好)", "ECOG≥1(低下)", "65歳未満", "65歳以上"),
HR = c(0.588, 0.521, 0.618, 0.603, 0.557),
low = c(0.424, 0.279, 0.420, 0.403, 0.338),
high = c(0.816, 0.973, 0.909, 0.902, 0.917)
)
# 上から順に並べるため因子順を反転
plot_df$subgroup <- factor(plot_df$subgroup, levels = rev(plot_df$subgroup))
ggplot(plot_df, aes(x = HR, y = subgroup)) +
geom_vline(xintercept = 1, linetype = "dashed", color = "grey50") + # HR=1の基準線
geom_errorbarh(aes(xmin = low, xmax = high), height = 0.2) + # 95%CIの横線
geom_point(size = 3, color = "#2E86C1") + # HRの点
scale_x_log10(breaks = c(0.25, 0.5, 1, 2)) + # HRは対数軸
labs(x = "ハザード比(対数スケール, 女性/男性)", y = NULL,
title = "性別効果のサブグループ別 forest plot") +
theme_minimal(base_size = 13)

この図では、全体推定をダイヤモンド、各サブグループを点と横線で表し、HR=1の縦線をまたぐかどうか、そして点が縦にほぼ一直線に並ぶか(=効果が一貫しているか)を一目で確認できます。今回はすべての点がHR=1より左(女性で予後良好)に揃い、区間も大きく重なっているため、「性別効果はサブグループ間で一貫している」という交互作用検定の結論と視覚的にも合致します。逆に、ある群だけが基準線の反対側に飛び出していたり、点が大きくばらついて見えたりする場合は、効果修飾の可能性を疑うサインになります。
forest plotは強力な可視化ですが、見た目のばらつきだけで効果修飾を語らないことが肝心です。サブグループが多いほど、偶然どれかの点は基準線をまたぎます。図はあくまで交互作用検定(LRT)を補助する説明ツールと位置づけ、最終判断は交互作用P値と、事前に規定したサブグループ数・多重性の考慮に基づいて行いましょう。
実務でのポイントと落とし穴
サブグループ解析でもっとも重要な原則は、解析するサブグループ・比較の方向・使用する統計手法を、データを見る前に試験実施計画書(プロトコル)や統計解析計画書(SAP)で事前規定(pre-specification)しておくことです。事前に定めていないサブグループを、結果が出てから探索的に切り出してしまうと、多数の比較の中で偶然「有意」に見える所見が必ず紛れ込みます。サブグループの数だけ検定を繰り返せば第一種の過誤(偽陽性)は急速に膨らむため、多重性の調整、あるいは少なくとも「これは探索的所見である」という位置づけの明示が欠かせません。
次に徹底したいのが、「交互作用検定を主、サブグループ内検定は従」という原則です。「あるサブグループでのみ p<0.05 だった」という主張は、実は治療効果がサブグループ間で異なることの証拠にはなりません。効果が本当に修飾されているかどうかは、あくまで治療×サブグループの交互作用項を直接検定して判断します。サブグループ内の p 値だけを並べて「この層には効いた/効かなかった」と語るのは、統計的にも規制的にも最も戒められる誤用です。 得られたサブグループ所見をどこまで信頼してよいかは、いくつかの観点を組み合わせて評価します。BMJ などで提案されている信頼性評価の枠組みでは、たとえば次のような観点が挙げられています。
- 事前に規定された仮説だったか(後付けの探索ではないか)
- 交互作用検定そのものが有意か(サブグループ内 p 値の対比ではなく)
- 効果の差に生物学的・薬理学的な妥当性があるか
- 少数の(できれば1つの)サブグループに限定された主張か
- 他の試験や外部エビデンスで再現されているか
これらを満たすほど所見の信頼性は高まり、逆にどれも欠くようであれば「仮説生成」にとどめるべき、というのが実務上の目安になります。
サブグループ解析は「①事前規定・②多重性への配慮・③交互作用検定を主軸」の3点を守れば、探索的所見を確証的結論と取り違える事故の大半は防げます。SAP の段階で、評価するサブグループ・交互作用モデル・結果の位置づけ(確証か探索か)まで明文化しておきましょう。
規制の視点も、基本的にこれと同じ方向を向いています。EMA は確証的臨床試験におけるサブグループの取り扱いに関するガイドライン(Guideline on the investigation of subgroups in confirmatory clinical trials)で、事前規定と結果の過剰解釈への戒めを求めています。FDA も同様に、事前に計画されたサブグループ解析と、探索的・仮説生成的なサブグループ解析とを明確に区別するよう促しています。全体集団で主要評価項目が示されたうえで、サブグループ解析は結果の一貫性(consistency)を確認する補助的な位置づけとするのが、標準的な運用です。
「サブグループAでは p<0.05、Bでは p≥0.05 だった、だからAには効く」という主張は、よくある誤用の典型です。これは交互作用の証拠ではなく、多くの場合、検出力(サンプルサイズ)の差を効果の差と取り違えたものにすぎません。効果修飾は必ず交互作用項で評価してください。
最後に、forest plot の読み方にも落とし穴があります。各サブグループの点推定値がばらついて見えても、それは多くの場合、層ごとのサンプルサイズが小さいことによる偶然のばらつきにすぎません。信頼区間の幅とその重なり、そして交互作用の p 値をセットで確認しなければ、「効果が層によって違う」と早合点してしまいます。図の見た目のばらつきではなく、交互作用検定という定量的な指標で判断する姿勢が大切です。
この記事をより深く理解するための参考書籍
より体系的に学びたい方に向けて、実在する書籍を3冊紹介します。



関連記事
- Breslow-Day検定の理論と実装 ― 層別オッズ比の均一性検定は、二値アウトカムにおける効果修飾(交互作用)の評価そのもので、本記事の交互作用検定と表裏一体です。
- 多重比較法の基礎と活用 ― 複数のサブグループを検定する際に避けて通れない多重性の問題と、その調整法の基礎を整理できます。
- ICH E9(R1) Estimandフレームワーク徹底解説 ― サブグループ解析で「そもそも何を推定したいのか」を明確にするうえで、estimand の考え方が土台になります。
まとめ
本記事では、サブグループ解析と交互作用検定を正しく行うための考え方を、効果修飾の概念から、交互作用項を用いたモデル化、多重性への対処、forest plot の読み方、そして R での実装まで通して整理してきました。要点は、①治療効果がサブグループ間で異なるか否かは交互作用検定で判断する、②サブグループ内の個別 p 値だけで「効く/効かない」を語らない、③解析は事前規定し、多重性と探索的な位置づけを常に意識する、という3点に集約されます。
サブグループ解析は、うまく使えば「どの患者集団により大きな便益が期待できるか」というきわめて実務的な問いに答える強力な道具になります。一方で、事前規定と多重性への配慮を欠いたまま結果を切り出すと、偽陽性の所見に振り回され、意思決定を誤らせる危険もはらんでいます。だからこそ、探索的な発見はあくまで「次の試験で検証すべき仮説」として謙虚に扱い、確証的な結論は全体集団の主要解析に委ねる、という役割分担を徹底していただければと思います。
なお、サブグループ解析を支える周辺のトピックとして、治療効果を精緻に推定するための共変量調整(ANCOVA)徹底解説や、事前に定めた仮説群を効率的に検定するGatekeeping法とはもあわせてご覧いただくと、確証的試験の設計・解析の全体像がより立体的に見えてくるはずです。











