「相関≠因果」は統計学本でよく目にします。これは正しいのですが、不正確な表現です。正確には、「特定の条件下で、相関=因果」が正しいです。ではその特定の条件下とは何か。それを扱うのが因果推論という統計学の分野です。
「相関≠因果」を生じさせる原因の一つが交絡と呼ばれる現象です。以下でデータを扱いながら考えましょう。
「相関=因果」の状態
まず「相関=因果」となっている状態をデータで表現してみます。Aが曝露(原因)、Yがアウトカム(結果)とします。
set.seed(100)
d1 <- data.frame(A=rbinom(1000,1,0.5))
for(i in 1:1000){
ifelse(d1[i,1]==1, d1[i,2] <- rbinom(1,1,0.7),d1[i,2] <- rbinom(1,1,0.3))
}
names(d1)[which(names(d1)=="V2")] <- "Y"
library(dagitty)
g <- dagitty('dag{
A -> Y
}')
coordinates(g) <- list(x=c(A=0,Y=1),y=c(A=0,Y=0))
plot(g)
作成したデータでは、AはYに対して因果関係にあると言えます。以下の棒グラフでは、A=1とA=0でのYの分布(Y=1とY=0)を示していますが、AはYに対して因果関係があるので、A=1の方がY=1の割合は高くなっています。ちなみにAはYに対してリスク比2.3[2.0 - 2.6]、リスク差38.0%[32.2 - 43.7]のリスクを持っています(いずれも有意)。
library(epiR)
library(epitools)
table(d1)
# Y
# A 0 1
# 0 333 151
# 1 159 357
table1 <- xtabs(~Y+A, data=d1)
barplot(table1, legend=rownames(table1))
epi.2by2(table1)
# Outcome + Outcome - Total Inc risk * Odds
# Exposed + 333 159 492 67.7 2.094
# Exposed - 151 357 508 29.7 0.423
# Total 484 516 1000 48.4 0.938
#
# Point estimates and 95% CIs:
# -------------------------------------------------------------------
# Inc risk ratio 2.28 (1.97, 2.64)
# Odds ratio 4.95 (3.79, 6.47)
# Attrib risk * 37.96 (32.22, 43.69)
# Attrib risk in population * 18.68 (13.64, 23.71)
# Attrib fraction in exposed (%) 56.08 (49.13, 62.09)
# Attrib fraction in population (%) 38.59 (31.85, 44.65)
# -------------------------------------------------------------------
# Test that OR = 1: chi2(1) = 144.196 Pr>chi2 = <0.001
# Wald confidence limits
# CI: confidence interval
# * Outcomes per 100 population units
「相関≠因果」の状態
では先程とは別のデータを新たに作ります。
d2 <- data.frame(L=rnorm(1000,45,15))
for(i in 1:1000){
ifelse(d2[i,1]>60, d2[i,2] <- rbinom(1,1,0.8), d2[i,2] <- rbinom(1,1,0.3))
ifelse(d2[i,1]>60, d2[i,3] <- rbinom(1,1,0.8), d2[i,3] <- rbinom(1,1,0.3))
}
names(d2)[which(names(d2)=="V2")] <- "A"
names(d2)[which(names(d2)=="V3")] <- "Y"
実は今回作成したデータでは、AはYに対して因果関係を持っていません。なぜならAとYは、第3の変数Lによってデータが生成されたからです。
library(dagitty)
g <- dagitty('dag{
L -> Y
L -> A
}')
coordinates(g) <- list(x=c(A=0,L=0.5,Y=1),y=c(A=0,L=1,Y=0))
plot(g)
また先程と同様にリスク比とリスク差を計算してみます。
library(epiR)
library(epitools)
table2 <- xtabs(~Y+A, data=d2)
barplot(table2, legend=rownames(table2))
epi.2by2(table2)
# Outcome + Outcome - Total Inc risk * Odds
# Exposed + 417 210 627 66.5 1.99
# Exposed - 191 182 373 51.2 1.05
# Total 608 392 1000 60.8 1.55
#
# Point estimates and 95% CIs:
# -------------------------------------------------------------------
# Inc risk ratio 1.30 (1.16, 1.46)
# Odds ratio 1.89 (1.46, 2.46)
# Attrib risk * 15.30 (9.03, 21.58)
# Attrib risk in population * 9.59 (3.69, 15.50)
# Attrib fraction in exposed (%) 23.01 (13.75, 31.27)
# Attrib fraction in population (%) 15.78 (8.92, 22.12)
# -------------------------------------------------------------------
# Test that OR = 1: chi2(1) = 22.973 Pr>chi2 = <0.001
# Wald confidence limits
# CI: confidence interval
# * Outcomes per 100 population units
上記の結果を見ると、AはYに対して因果関係に無いにも関わらず、ぞれぞれリスク比1.3[1.2 - 1.5]、リスク差15.3%[9.0 - 21.6]となっています。あたかもAがYに対して因果関係を持っているように見えます。これが交絡と呼ばれる現象です。
交絡への対処
もし仮に交絡がLによって生じていると判明している場合、実はいくつかの方法で対処できます。今回は3つ紹介します。
データの作成段階でLは60を境に曝露とアウトカムに影響することが分かっているので、Lを60より上、以下で2つの層に分けておきます。
for(i in 1:1000){
ifelse(d2[i,1]>60, d2[i,4] <- 1, d2[i,4] <- 0)
}
names(d2)[4] <- "L60"
1. MHの方法による調整リスク比・リスク差の計算
まずMH(マンテルヘンツェル)の方法で調整リスク比、調整リスク差を計算してみます。
table3 <- xtabs(~Y+A+L60,data=d2)
epi.2by2(table3)
# Outcome + Outcome - Total Inc risk * Odds
# Exposed + 417 210 627 66.5 1.99
# Exposed - 191 182 373 51.2 1.05
# Total 608 392 1000 60.8 1.55
#
#
# Point estimates and 95% CIs:
# -------------------------------------------------------------------
# Inc risk ratio (crude) 1.30 (1.16, 1.46)
# Inc risk ratio (M-H) 0.99 (0.90, 1.09)
# Inc risk ratio (crude:M-H) 1.31
# Odds ratio (crude) 1.89 (1.46, 2.46)
# Odds ratio (M-H) 0.97 (0.71, 1.32)
# Odds ratio (crude:M-H) 1.96
# Attrib risk (crude) * 15.30 (9.03, 21.58)
# Attrib risk (M-H) * -0.70 (-9.85, 8.45)
# Attrib risk (crude:M-H) -21.80
# -------------------------------------------------------------------
# M-H test of homogeneity of RRs: chi2(1) = 0.242 Pr>chi2 = 0.62
# M-H test of homogeneity of ORs: chi2(1) = 0.391 Pr>chi2 = 0.53
# Test that M-H adjusted OR = 1: chi2(1) = 0.048 Pr>chi2 = 0.83
# Wald confidence limits
# M-H: Mantel-Haenszel; CI: confidence interval
# * Outcomes per 100 population units
上記の結果を見ると、MHリスク比は0.99、MHリスク差は-0.7%となっています。つまりLによって生じていた交絡を統制し、純粋なAとYの関係を見ることができたことになります。この結果から、AはYに対して因果関係に無いと確認することができました。
2. ロジスティックモデルによる調整オッズ比の計算
ロジスティック回帰を使用することで、交絡の影響を除いたオッズ比を計算できます。この方法の利点は、共変量に入れる変数が増えても調整オッズ比が計算できる点にあります。先程のMHの方法では、統制できる変数の数は非常に限られます。
L60を説明変数に加えて、
logistic <- glm(Y~A+L60, family="binomial", data=d2)
summary(logistic)
#
# Call:
# glm(formula = Y ~ A + L60, family = "binomial", data = d2)
#
# Deviance Residuals:
# Min 1Q Median 3Q Max
# -1.8314 -0.8293 -0.8172 0.6534 1.5870
#
# Coefficients:
# Estimate Std. Error z value Pr(>|z|)
# (Intercept) -0.89073 0.09014 -9.882 <2e-16 ***
# A -0.03464 0.15848 -0.219 0.827
# L60 2.36086 0.22985 10.271 <2e-16 ***
# ---
# Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#
# (Dispersion parameter for binomial family taken to be 1)
#
# Null deviance: 1321.1 on 999 degrees of freedom
# Residual deviance: 1165.5 on 997 degrees of freedom
# AIC: 1171.5
#
# Number of Fisher Scoring iterations: 4
exp(coef(logistic)) #調整オッズ比の点推定値
# (Intercept) A L60
# 0.4103548 0.9659520 10.6000873
exp(confint(logistic)) #信頼区間の上限・下限
# Waiting for profiling to be done...
# 2.5 % 97.5 %
# (Intercept) 0.3431507 0.488691
# A 0.7056189 1.314124
# L60 6.8401512 16.877911
ここで得られた係数をオッズ比に変換する必要があります。なのでexp(-0.03)を計算して、調整オッズ0.97が得られます。信頼区間の下限と上限も同様にして計算できます。
3. 層別化による交絡の統制(層別化)
これが最もシンプルな方法です。単純にL60の2つの層でそれぞれリスク比・リスク差・オッズ比を計算するので、層別化と呼ばれます。各層でのリスク比・リスク差・オッズ比を計算できるので、層ごとの比較ができるのも大きな利点です(性別で層別化を行って比較をしている論文は非常に多いです)。
L1 <- subset(d2,L60==1)
L0 <- subset(d2,L60==0)
tableL1 <- xtabs(~Y+A, data=L1)
tableL0 <- xtabs(~Y+A, data=L0)
epi.2by2(tableL1)
# Outcome + Outcome - Total Inc risk * Odds
# Exposed + 6 25 31 19.4 0.240
# Exposed - 21 110 131 16.0 0.191
# Total 27 135 162 16.7 0.200
#
# Point estimates and 95% CIs:
# -------------------------------------------------------------------
# Inc risk ratio 1.21 (0.53, 2.74)
# Odds ratio 1.26 (0.46, 3.44)
# Attrib risk * 3.32 (-11.94, 18.59)
# Attrib risk in population * 0.64 (-7.87, 9.15)
# Attrib fraction in exposed (%) 17.18 (-87.77, 63.47)
# Attrib fraction in population (%) 3.82 (-15.42, 19.84)
# -------------------------------------------------------------------
# Test that OR = 1: chi2(1) = 0.199 Pr>chi2 = 0.66
# Wald confidence limits
# CI: confidence interval
# * Outcomes per 100 population units
epi.2by2(tableL0)
# Outcome + Outcome - Total Inc risk * Odds
# Exposed + 411 185 596 69.0 2.22
# Exposed - 170 72 242 70.2 2.36
# Total 581 257 838 69.3 2.26
#
# Point estimates and 95% CIs:
# -------------------------------------------------------------------
# Inc risk ratio 0.98 (0.89, 1.08)
# Odds ratio 0.94 (0.68, 1.30)
# Attrib risk * -1.29 (-8.14, 5.57)
# Attrib risk in population * -0.92 (-7.47, 5.64)
# Attrib fraction in exposed (%) -1.87 (-12.37, 7.65)
# Attrib fraction in population (%) -1.32 (-8.60, 5.47)
# -------------------------------------------------------------------
# Test that OR = 1: chi2(1) = 0.134 Pr>chi2 = 0.71
# Wald confidence limits
# CI: confidence interval
# * Outcomes per 100 population units
層別化はシンプルな方法ではありますが、サンプルサイズが小さくなりやすいことが問題となります。実際Lが60より上の層では、リスク比1.2[0.5 - 2.7]とリスク差3.32[-11.9 - 18.6]となっていて、信頼区間が広すぎます。今回の場合は明らかにサンプルサイズが足りていないので、妥当な方法とは言えません。
交絡の統制の難しさ
上記では交絡因子(交絡を引き起こす因子)Lが事前に分かっていたので、交絡の影響を除いたリスク比・リスク差・オッズ比が計算できました。しかし実際の調査やリアルワールドデータ、ビッグデータには、交絡因子は無数に存在しています。加えて交絡因子がすべて測定されているかもしくは既知であるかも私達には検証するすべがありません。ここが交絡のやっかいなところで、いくら交絡因子を列挙して統制しても、得られたAとYの関係が交絡によるものなのか、因果関係なのかが分からないのです。研究・解析を行う人間がすべきなのは、既存の学問的知見や一般常識の観点から、交絡因子を列挙して統制することです。
しかし「相関≠因果」をもたらすのは交絡だけではありません。間違った変数の統制や測定で生じるバイアスも問題となります。次回はこれら系統誤差を取り上げていきたいと思います。