【やさしく解説】交絡(交絡因子)とは ― シンプソンのパラドックスで学ぶ「見かけの効果」とRによる層別・調整 ―

本記事にはプロモーション(広告・アフィリエイトリンク)が含まれます。
記事の目次
Toggleこの記事でわかること
- 交絡(confounding)とは何か:治療とアウトカムの両方に関係する第三の要因が、実際にはない差を「あるように」見せてしまう現象です。3つの条件で判定できます。
- 結論が逆転する実例をRで体験:腎結石治療の実データでは、全体で比べると治療Aの成功率78.0%に対し治療Bが82.6%でBの勝ちですが、結石の大きさで分けると小さい結石でも大きい結石でもAの勝ちになります。
- 層別と回帰による調整:粗オッズ比0.748が、結石サイズを調整すると1.429に変わる様子をCochran-Mantel-Haenszel検定とロジスティック回帰の両方で確認します。
- 調整してはいけない変数がある:中間因子を調整するとOR 0.777の治療効果が1.086まで消え、合流点で層別すると無相関(-0.025)が-0.701の強い負の相関に化けます。
- デザインで防ぐか、解析で調整するか:ランダム化が交絡を防ぐ仕組みをシミュレーションで確かめ、観察研究で使える調整手法を整理します。
はじめに
「この薬を飲んだ人のほうが、飲まなかった人より死亡率が高かった」というデータを見せられたとき、その薬が危険だと結論してよいでしょうか。多くの場合、答えは「まだ言えない」です。そもそも重症の患者ほどその薬を処方されていたのなら、死亡率の差は薬のせいではなく、もともとの重症度の差かもしれないからです。
このように、比べたい2群のあいだにもともと存在していた別の違いが、治療の効果と混ざり合ってしまうことを交絡(こうらく、confounding)といいます。そしてその原因になっている要因を交絡因子(confounder)と呼びます。交絡は臨床研究で最も頻繁に登場するバイアスであり、ランダム化比較試験(RCT)がなぜあれほど手間をかけて実施されるのか、傾向スコアや共変量調整といった手法がなぜ必要なのかも、すべてこの一点から説明できます。
統計を学び始めた方にとって、交絡は「言葉としては知っているが、自分のデータで見分けられるかというと自信がない」という位置にある概念かもしれません。そこで本記事では、抽象的な定義から入るのではなく、結論が完全に逆転する実際のデータをRで動かしながら、交絡が起きる仕組み・見分け方・対処法を順に確認していきます。あわせて、交絡と間違えて調整してしまうとかえって結果を歪める2種類の変数についても、シミュレーションで示します。使用したのはR 4.5.1で、追加パッケージは不要です。
交絡とは何か ― 「見かけの効果」が生まれる仕組み

交絡因子とは、次の3つの条件をすべて満たす変数のことです。この3条件は交絡を判定するときの実質的なチェックリストになります。
| 条件 | 内容 | 冒頭の例でいうと |
|---|---|---|
| ① 曝露と関連している | 治療を受けやすい人と受けにくい人で、その変数の分布が違う | 重症の患者ほどその薬を処方されていた |
| ② アウトカムの原因である | 治療とは無関係に、その変数自体がアウトカムを左右する | 重症であること自体が死亡率を上げる |
| ③ 中間因子ではない | 治療の結果として起こった変数ではない | 重症度は投薬前に決まっている(投薬の結果ではない) |
①と②だけを覚えている方が多いのですが、実務で判断を誤りやすいのは③です。治療を始めた後に測定された変数は、たとえ強くアウトカムと関係していても交絡因子ではありません。この点は後の章でシミュレーションを使って確認します。
臨床研究で問題になるバイアス(系統誤差)は、大きく選択バイアス・情報バイアス・交絡の3つに分類されます。選択バイアスは「誰をデータに含めたか」で生じる歪み、情報バイアスは「どう測ったか」で生じる歪みで、いずれもデータを集める段階の問題です。これに対して交絡は、測定も選抜も完璧に行われていたとしても残ります。集め方が正しくても、比べている2つの集団がそもそも別物であれば、比較の結果は治療の効果を表さないからです。この意味で、交絡はデータの品質ではなく比較の構造の問題だといえます。
交絡が厄介なのは、それが解析の失敗ではなくデータの生成過程そのものに由来する点です。データを丁寧に集めても、標本サイズを10倍にしても、交絡バイアスは小さくなりません。むしろ標本が大きいほど、偏った推定値が狭い信頼区間で報告され、誤った結論に自信がついてしまいます。「Nを増やせば解決する」種類の問題ではないことを、最初に押さえておいてください。
交絡は偶然のばらつき(誤差)とは性質が異なります。偶然のばらつきは標本サイズを増やせば小さくなりますが、交絡は増やしても消えません。信頼区間が狭いことは、その推定値が正しいことを何ひとつ保証しないのです。
シンプソンのパラドックスをRで体験する
交絡が極端な形で現れると、全体で見たときと、グループに分けて見たときで結論が逆になることがあります。これをシンプソンのパラドックス(Simpson’s paradox)と呼びます。
有名な実例が、腎結石に対する2つの治療法を比較した観察データです。Charigら(1986年、BMJ)が報告し、Julious と Mullee(1994年、BMJ)がパラドックスの教材として紹介したもので、治療Aは開腹手術、治療Bは経皮的腎砕石術(体への負担が小さい新しい術式)にあたります。まずデータを作り、全体の成功率を比べてみます。
stone <- data.frame(
treatment = c("A", "A", "B", "B"),
size = c("小さい結石", "大きい結石", "小さい結石", "大きい結石"),
success = c(81, 192, 234, 55),
failure = c(6, 71, 36, 25)
)
stone$total <- stone$success + stone$failure
stone$rate <- stone$success / stone$total
# 全体(層を無視した粗い比較)
overall <- aggregate(cbind(success, total) ~ treatment, data = stone, FUN = sum)
overall$rate <- overall$success / overall$total
print(overall)
> treatment success total rate
> 1 A 273 350 0.7800000
> 2 B 289 350 0.8257143
全体で比べると、治療Aの成功率は78.0%、治療Bは82.6%です。差は4.6ポイントで、患者数も両群350例ずつと揃っています。ここだけを見れば「負担の小さい治療Bのほうが成功率が高い」と読むのが自然でしょう。
ところが、結石の大きさで2つに分けると景色が一変します。
print(stone[, c("treatment", "size", "success", "total", "rate")])
> treatment size success total rate
> 1 A 小さい結石 81 87 0.9310345
> 2 A 大きい結石 192 263 0.7300380
> 3 B 小さい結石 234 270 0.8666667
> 4 B 大きい結石 55 80 0.6875000
小さい結石では A 93.1% vs B 86.7% でAの勝ち、大きい結石でも A 73.0% vs B 68.8% でAの勝ちです。どちらの層でもAが勝っているのに、合計するとBが勝つという、直感に反する現象が起きています。これがシンプソンのパラドックスです。

なぜこうなるのかは、治療の割り付けを見ると一目でわかります。
tab_alloc <- xtabs(total ~ treatment + size, data = stone)
print(tab_alloc)
print(round(prop.table(tab_alloc, margin = 1), 3))
> size
> treatment 小さい結石 大きい結石
> A 87 263
> B 270 80
>
> size
> treatment 小さい結石 大きい結石
> A 0.249 0.751
> B 0.771 0.229
治療Aを受けた患者の75.1%は大きい結石でしたが、治療Bでは22.9%にすぎません。つまり難しい症例が治療Aに偏って集まっていたわけです。医師が「大きい結石には確実性の高い開腹手術を選ぶ」という合理的な判断をした結果であり、データの不備ではありません。しかしこの偏りのせいで、Aは不利な条件で戦わされ、全体の成績が押し下げられました。結石サイズこそが交絡因子です。3条件を確認すると、①治療の選択と強く関連し(75.1%対22.9%)、②大きい結石は治療法によらず成功率が低く(73.0%と68.8%)、③結石の大きさは治療前に決まっている、とすべて満たしています。
算術としてのからくりも確認しておきましょう。全体の成功率は、各層の成功率をその層に何人いたかで重み付けした平均です。治療Aは 0.931×(87/350) + 0.730×(263/350) = 0.780、治療Bは 0.867×(270/350) + 0.688×(80/350) = 0.826 と計算されます。どちらの層でもAの成功率が高いのに合計で負けるのは、Aでは成績の出にくい大きい結石に0.751という大きな重みがかかり、Bでは成績の出やすい小さい結石に0.771の重みがかかっているためです。層ごとの実力ではなく、重みの違いが全体の数字を決めてしまっているわけです。逆にいえば、両群の重みが同じであれば逆転は起こりません。ランダム化が交絡を防ぐのは、まさにこの重みを両群で揃える仕組みだからです。
この逆転は、オッズ比で見るとさらに明瞭になります。
# 粗オッズ比(層を無視)
or_crude <- (overall$success[1] / (overall$total[1] - overall$success[1])) /
(overall$success[2] / (overall$total[2] - overall$success[2]))
cat("粗オッズ比(A vs B):", round(or_crude, 3), "\n")
# 層別オッズ比
or_small <- (81 / 6) / (234 / 36)
or_large <- (192 / 71) / (55 / 25)
cat("小さい結石でのオッズ比(A vs B):", round(or_small, 3), "\n")
cat("大きい結石でのオッズ比(A vs B):", round(or_large, 3), "\n")
> 粗オッズ比(A vs B): 0.748
> 小さい結石でのオッズ比(A vs B): 2.077
> 大きい結石でのオッズ比(A vs B): 1.229
層を無視した粗オッズ比は0.748で、1を下回るためAが不利という読み方になります。しかし層別すると2.077と1.229、いずれも1を超えてAが有利です。オッズ比の解釈そのものに不安がある方はオッズ比・相対リスク・ハザード比の違いで基本を整理できます。
では、2つの層をまとめた「調整済みの1つの効果」はどう求めればよいでしょうか。二値アウトカムを層別に統合する古典的な方法が、Cochran-Mantel-Haenszel(CMH)検定です。
arr <- array(
c(81, 6, 234, 36,
192, 71, 55, 25),
dim = c(2, 2, 2),
dimnames = list(
outcome = c("成功", "失敗"),
treatment = c("A", "B"),
size = c("小さい結石", "大きい結石")
)
)
print(mantelhaen.test(arr, correct = FALSE))
> Mantel-Haenszel chi-squared test without continuity correction
>
> data: arr
> Mantel-Haenszel X-squared = 2.4339, df = 1, p-value = 0.1187
> alternative hypothesis: true common odds ratio is not equal to 1
> 95 percent confidence interval:
> 0.9157934 2.2858487
> sample estimates:
> common odds ratio
> 1.446847
結石サイズで調整した共通オッズ比は1.447(95%信頼区間 0.916〜2.286、p=0.1187)です。粗オッズ比0.748から1.447へ、1をまたいで反転しました。ただし信頼区間は1を含んでおり、この標本では「Aが有意に優れている」とまでは言えません。方向が変わったことと統計的に有意かどうかは別の話であり、ここを混同しないことが大切です。CMH検定そのものの理論はコクラン・マンテル・ヘンツェル検定で詳しく扱っています。
同じ調整は、ロジスティック回帰に交絡因子を共変量として入れることでも実現できます。層が2つしかない今回はCMHで十分ですが、調整したい変数が年齢や検査値のように連続量である場合や、複数ある場合には回帰による調整が実用的です。
# 集計表から個票データへ展開
ind <- data.frame(
treatment = rep(rep(c("A", "A", "B", "B"), times = 2),
times = c(81, 192, 234, 55, 6, 71, 36, 25)),
size = rep(rep(c("小さい結石", "大きい結石", "小さい結石", "大きい結石"), times = 2),
times = c(81, 192, 234, 55, 6, 71, 36, 25)),
success = rep(c(1, 0), times = c(81 + 192 + 234 + 55, 6 + 71 + 36 + 25))
)
ind$treatment <- factor(ind$treatment, levels = c("B", "A"))
ind$size <- factor(ind$size, levels = c("小さい結石", "大きい結石"))
fit_crude <- glm(success ~ treatment, data = ind, family = binomial)
fit_adj <- glm(success ~ treatment + size, data = ind, family = binomial)
print(round(exp(cbind(OR = coef(fit_crude), confint.default(fit_crude))), 3))
print(round(exp(cbind(OR = coef(fit_adj), confint.default(fit_adj))), 3))
> --- 調整なし ---
> OR 2.5 % 97.5 %
> (Intercept) 4.738 3.594 6.245
> treatmentA 0.748 0.515 1.088
>
> --- 結石サイズで調整 ---
> OR 2.5 % 97.5 %
> (Intercept) 6.935 4.965 9.685
> treatmentA 1.429 0.912 2.239
> size大きい結石 0.283 0.177 0.453
調整なしの治療Aのオッズ比は0.748、結石サイズを共変量に加えると1.429となり、CMHの1.447とほぼ一致しました。あわせて注目したいのが結石サイズ自身のオッズ比0.283で、大きい結石は成功オッズが約7割低いことを意味します。このアウトカムへの強い影響と、先ほど見た治療への強い偏りが揃ったからこそ、粗解析が反転するほどのバイアスが生じたわけです。ロジスティック回帰の読み方は2値変数とロジスティック回帰にまとめています。
交絡と間違えやすい2つの落とし穴 ― 中間因子と合流点
ここまでの流れだけを見ると「関係のありそうな変数はとりあえず全部モデルに入れておけば安全」と思えるかもしれません。しかし、これは誤りです。調整してはいけない変数を調整すると、バイアスを取り除くどころか自分で作り出すことになります。代表的なものが中間因子と合流点の2つです。
まず中間因子(mediator)です。治療の結果として変化した変数を指し、先ほどの3条件の③に反します。降圧薬がイベントを減らす経路をシミュレーションで作り、血圧まで調整するとどうなるかを見てみましょう。
set.seed(1234)
n <- 5000
drug <- rbinom(n, 1, 0.5) # 治療(ランダム化済み)
bp <- 130 - 8 * drug + rnorm(n, 0, 10) # 血圧=治療の結果(中間因子)
event <- rbinom(n, 1, plogis(-4 + 0.05 * bp)) # イベントは血圧のみで決まる
m_total <- glm(event ~ drug, family = binomial)
m_over <- glm(event ~ drug + bp, family = binomial)
cat("総効果(中間因子を調整しない)のOR:", round(exp(coef(m_total)[2]), 3), "\n")
cat("中間因子(血圧)まで調整したOR :", round(exp(coef(m_over)[2]), 3), "\n")
> 総効果(中間因子を調整しない)のOR: 0.777
> 中間因子(血圧)まで調整したOR : 1.086
この設定では、薬は血圧を平均8mmHg下げ、その血圧低下を通じてのみイベントを減らします。中間因子を入れずに推定した総効果はOR 0.777で、薬がイベントを約22%減らすという正しい姿を捉えています。ところが血圧を共変量に加えると1.086となり、効果が消えるどころか逆方向にすら見えます。同じ血圧の人どうしを比べてしまえば、薬の恩恵は定義上ゼロだからです。これを過剰調整(over-adjustment)といいます。治療開始後に測った変数は、原則としてモデルに入れないでください。
もう1つが合流点(collider、コライダー)です。2つの要因が共通して影響を与えている結果変数のことで、これで層別すると、本来無関係だったもの同士に見かけの関連が生まれます。有名な「有名人の才能と容姿」の例で確かめます。
set.seed(2024)
n <- 5000
talent <- rnorm(n) # 才能
looks <- rnorm(n) # 容姿(才能とは独立)
famous <- talent + looks > 1.5 # 有名になれるのは合計が高い人だけ
cat("母集団全体での相関:", round(cor(talent, looks), 3), "\n")
cat("有名人だけに限定した相関:", round(cor(talent[famous], looks[famous]), 3), "\n")
cat("有名人の人数:", sum(famous), "\n")
> 母集団全体での相関: -0.025
> 有名人だけに限定した相関: -0.701
> 有名人の人数: 718
母集団では才能と容姿は無相関(-0.025)に作ってあります。ところが有名人718人だけを取り出すと相関は-0.701と、強い負の相関に変わりました。「有名なのに演技が下手なら、それは容姿のおかげ」という推論が成り立ってしまうのは、有名かどうかで選抜したからです。臨床研究でこれに相当するのは、入院患者だけ・治療を継続できた患者だけ・検査を受けた患者だけといった条件で解析対象を絞る場面で、選択バイアスの正体はしばしばこの構造です。
「アウトカムと関連する変数を全部入れる」「p値が小さい変数を残す」といった機械的な変数選択は、中間因子や合流点を巻き込む危険があります。統計的な当てはまりではなく、時間の前後関係と因果の向きで入れる変数を決めてください。図で整理する方法が因果推論にDAGを活用するで解説されています。
交絡への対処 ― デザインで防ぐか、解析で調整するか
交絡への対処は、大きく「試験のデザインで最初から防ぐ」方法と、「集めたデータを解析で調整する」方法に分かれます。
最も強力なのは前者、すなわちランダム化です。治療の割り付けをコインの表裏で決めれば、割り付けは患者の特性と定義上無関係になり、測定していない要因まで含めて両群に均等に散らばります。これがどれほど効くのかをシミュレーションで確かめます。真の治療効果はゼロ(OR 1.00)に固定し、重症度だけがアウトカムを悪化させる状況を作りました。
set.seed(4869)
n <- 2000
severity <- rbinom(n, 1, 0.4) # 重症フラグ(真の予後因子)
trt_obs <- rbinom(n, 1, ifelse(severity == 1, 0.75, 0.25)) # 観察研究:重症ほど新薬
trt_rct <- rbinom(n, 1, 0.5) # RCT:重症度と無関係
print(round(tapply(severity, trt_obs, mean), 3))
print(round(tapply(severity, trt_rct, mean), 3))
p_obs <- plogis(-0.5 - 1.5 * severity + 0.0 * trt_obs) # 治療効果はゼロ
p_rct <- plogis(-0.5 - 1.5 * severity + 0.0 * trt_rct)
y_obs <- rbinom(n, 1, p_obs)
y_rct <- rbinom(n, 1, p_rct)
or <- function(y, x) round(exp(coef(glm(y ~ x, family = binomial))[2]), 3)
cat("観察研究の粗OR:", or(y_obs, trt_obs), "\n")
cat("RCTの粗OR :", or(y_rct, trt_rct), "\n")
cat("観察研究の調整OR:",
round(exp(coef(glm(y_obs ~ trt_obs + severity, family = binomial))[2]), 3), "\n")
> 観察研究での重症割合(新薬 vs 対照):
> 0 1
> 0.166 0.661
>
> RCTでの重症割合(新薬 vs 対照):
> 0 1
> 0.385 0.387
>
> 真の治療効果 = OR 1.00(効果なし)のとき
> 観察研究の粗OR: 0.597
> RCTの粗OR : 1.126
> 観察研究の調整OR: 1.153
観察研究では重症者の割合が対照群16.6%に対し新薬群66.1%と大きく偏りました。その結果、効果がまったくないはずの薬の粗ORが0.597と算出され、40%もアウトカムを改善したように見えます。一方でランダム化した場合の重症割合は38.5%と38.7%でほぼ同じになり、粗ORは1.126と真値1.00の近くに収まりました。差の0.126は偶然のばらつきであり、標本サイズを増やせば縮みます。観察研究のほうも重症度を調整すれば1.153まで戻りますが、これは重症度を測定できていたからできたことです。ランダム化の割り付け方法そのものはランダム化割付の方法とR実装で扱っています。
観察研究では、この「測定できていない交絡因子」が最後まで残ります。だからこそRCTが医薬品開発の根拠として重視されるわけですが、現実には倫理的・実務的にRCTが組めない場面も多くあります。使える対処法を整理すると次のようになります。
| 段階 | 方法 | 特徴と注意点 |
|---|---|---|
| デザイン | ランダム化 | 未測定の交絡因子まで均等化できる唯一の方法。可能なら最優先 |
| デザイン | 層別ランダム化・限定・マッチング | 特定の因子を設計段階で揃える。限定は一般化可能性が狭まる |
| 解析 | 層別解析(CMH法) | 直感的で説明しやすい。調整因子が増えると層が細かくなりすぎる |
| 解析 | 共変量調整(回帰モデル) | 連続量も複数因子も扱える。モデルの形が誤っていると調整が不十分 |
| 解析 | 傾向スコア(マッチング・IPTW) | 多数の共変量を1次元に集約できる。バランス診断が必須 |
| 解析 | 操作変数法・感度分析 | 未測定交絡に踏み込める。成立には強い仮定が必要 |
実務でよく使われる傾向スコアは傾向スコア分析(Propensity Score Analysis)とはと逆確率重み付け(IPTW)によるATE推定で、RCTにおけるベースライン共変量の扱いは共変量調整(ANCOVA)徹底解説で具体的に確認できます。
実務での落とし穴とFAQ
・交絡因子は3条件で判定する。特に「治療の結果ではない」の確認を忘れない
・標本サイズを増やしても交絡バイアスは消えない。狭い信頼区間は正しさの保証にならない
・調整で推定値が大きく動いたら、その変数の分布が群間でどれだけ偏っているかを必ず確認する
・治療開始後に測った変数(中間因子)と、選抜条件(合流点)は調整しない
・可能ならデザインで防ぐ。観察研究では未測定交絡が残ることを結論に明示する
Q. ベースライン特性の表でp値を出し、有意な因子だけを調整すればよいですか?
推奨されません。ランダム化された試験では群間の偏りは定義上偶然によるもので、そこにp値を当てるのは検定の使い方として不適切です。また観察研究でも、p値は標本サイズに依存するため、小規模研究では強い偏りが見逃され、大規模研究では臨床的に無意味な差が有意になります。調整すべき変数は、データを見る前に臨床的な知識と時間の前後関係から決め、解析計画書に書いておくのが正攻法です。p値の性質そのものはp値とは何か?で整理しています。
Q. 調整前後で推定値がどれくらい動いたら「交絡があった」と判断しますか?
疫学では、調整前後で効果指標が10%以上変化したら交絡因子とみなす、という目安(10%ルール)が古くから使われています。今回の腎結石データでは0.748から1.447へと倍近く動いたので、この基準では文句なく交絡ありです。ただしこれは判断の補助であって、変化が小さければ調整しなくてよいという意味ではありません。理論的に交絡因子だとわかっている変数は、動きが小さくても調整したままにしておくのが安全です。
Q. 層別すると層ごとの効果がバラバラでした。どうすればよいですか?
層によって効果の大きさが本当に違うのなら、それは交絡ではなく効果修飾(交互作用)です。今回は小さい結石でOR 2.077、大きい結石で1.229と差がありますが、いずれも同じ方向を向いており、共通オッズ比でまとめても大きな誤りにはなりません。しかし方向まで逆になる場合は、無理に1つの数字に統合せず、層別に報告するほうが誠実です。交絡は「均す」もの、効果修飾は「示す」ものと覚えておくとよいでしょう。
Q. ランダム化した試験なら、共変量調整は不要ですか?
交絡を取り除くという目的に限れば、ランダム化された試験で調整は必須ではありません。今回のシミュレーションでも、RCTの粗オッズ比1.126は真値1.00の近くにありました。それでも実際の臨床試験で事前に共変量調整を規定するのは、別の理由からです。ひとつは検出力で、アウトカムを強く予測する因子(多くはベースライン値)をモデルに入れると誤差が小さくなり、同じ症例数でも差を検出しやすくなります。もうひとつは説得力で、偶然生じたベースラインの偏りに対して結果が頑健であることを示せます。ただし調整する変数は結果を見る前に解析計画書で決めておくことが前提です。詳しくは共変量調整(ANCOVA)徹底解説をご覧ください。
Q. 交絡因子を測定し忘れていたと後から気づきました。何ができますか?
そのデータの解析だけで完全に取り戻すことはできません。現実的な対応は、未測定交絡がどの程度あれば結論がひっくり返るかを定量的に示す感度分析です。あわせて、結果の記述で「未測定交絡の可能性を否定できない」と明記します。観察データから因果効果を推定する枠組みはTarget Trial Emulation(TTE)とはで、規制活用の文脈はリアルワールドエビデンス(RWE)入門で扱っています。
📚 この記事をより深く理解するための参考書籍
交絡と因果推論を、数式に頼らず腹落ちする形で学べる3冊を紹介します。



関連記事・次のステップ
因果推論の考え方を最初から順に追いたい方は、製薬業界のための因果推論入門から始めて、因果推論にDAGを活用する・層別解析により因果効果を推定する・多変量回帰モデルを因果推論に用いると読み進めるのがおすすめです。
調整手法を実装まで落とし込みたい方は、傾向スコア分析とはと傾向スコア分析を用いた交絡調整、逆確率重み付け(IPTW)によるATE推定へ。層別解析の理論的背景はコクラン・マンテル・ヘンツェル検定、モデルによる調整は共変量調整(ANCOVA)徹底解説と2値変数とロジスティック回帰が対応します。
統計の基礎からもう一度固めたい方には、p値とは何か?・オッズ比・相対リスク・ハザード比の違い・回帰分析と相関:因果を見抜くためにをご覧ください。同じく「見かけの効果」に注意が必要な現象として平均への回帰とはも参考になります。Rの操作そのものが不安な方はR入門から始められます。
臨床試験の枠組みを知りたい方は、臨床試験のフェーズ(第I相〜第IV相)とは・ランダム化割付の方法とR実装・ITT・FAS・PP・mITTの違いを完全整理が入口になります。
まとめ
本記事では、交絡(交絡因子)とは何かを、結論が逆転する実データを通して確認しました。
交絡因子は、①治療の選択と関連し、②アウトカムの原因であり、③治療の結果ではない、という3条件で判定できます。腎結石治療のデータでは結石の大きさがこれに該当し、治療Aには大きい結石が75.1%も集まっていました。その結果、小さい結石でも大きい結石でも治療Aの成功率が高い(93.1%対86.7%、73.0%対68.8%)にもかかわらず、全体で比べると78.0%対82.6%でAが負けるという逆転が生じます。結石サイズで調整するとオッズ比は0.748から1.447へ反転し、ロジスティック回帰でも1.429とほぼ同じ値が得られました。
一方で、何でも調整すればよいわけではないことも確かめました。治療の結果として変化する中間因子まで調整すると、OR 0.777という本物の効果が1.086まで消えてしまいます。また2つの要因が共通して影響する合流点で解析対象を絞ると、無相関だった変数間に-0.701という強い相関が生まれます。モデルに入れる変数は、統計的な当てはまりではなく、時間の前後関係と因果の向きで選ぶ必要があります。
そして最後に、交絡への最も確実な備えはデザインだという点です。真の効果がゼロの薬でも、重症者が新薬群に偏った観察研究では粗オッズ比0.597という「効いているように見える」結果が出ました。同じ条件でランダム化すれば重症割合は38.5%と38.7%に揃い、粗オッズ比は1.126と真値の近くに落ち着きます。解析での調整は測定できた変数にしか効きませんが、ランダム化は測定していない要因にも効く。この違いが、臨床試験でランダム化がここまで重視される理由です。
自分のデータを前にしたときは、まず「治療を受けた人と受けなかった人は、治療以外にどこが違っていたか」を紙に書き出すところから始めてみてください。その問いに答えられる変数を集められているかどうかが、解析の質を決めます。次の一歩として、多数の共変量をまとめて調整する実務的な手法を学びたい方は傾向スコア分析(Propensity Score Analysis)とはを、調整すべき変数を図から判断する方法を身につけたい方は因果推論にDAGを活用するをご覧いただければと思います。交絡を見抜く目は、統計解析の技術というより、データの背後にある現実を想像する力そのものです。











