【ベイズ因子】オッズ比の使われ方を紹介します

こんにちは、青の統計学です。

今回はロジスティック回帰の解釈で定番の、オッズ比について考えていきます。

オッズ比は二つのカテゴリに分けられるデータに対して有用な指標であり、特に、疾患や事象が発生する確率について研究する際に使用されます。

今回は、「オッズ」や「オッズ比」を統計学の観点から実例を通してみてみましょう。

オッズ比(odds ratio)

2832年12月1日、A市でノロウィルスの集団感染が起きました。感染した人たちの生活を辿ると、共通して一日前に「あるイタリアンレストラン」に行っていたことがわかりました。どうやら、このイタリアンレストランの料理が感染源で問題ないようです。



ただ、「どのメニューのどの材料」にウィルスが付着していたのかわからないと、同じ材料を使っている店に警告や販売元の市場へ販売停止命令ができません。




以下の表を見て、どのメニューにウィルスがついているか推測してください。


ただし、レストランに行き食中毒になったのは40人(X+Y)で、食中毒になっていないのは60人(A+B)です。
食べた(X)食べてない(Y)食べた(A)食べてない(B)
ボンゴレビアンゴ28124218
コブサラダ19212535
イカスミパスタ12282832
タイのマリネ3821941
調査票

食中毒など、死者が出る可能性もある事象においては、スピード感を持った判断が必要です。

このため、全ての証拠を集めた後、判断してから失敗のないように原因の食材を回収していくことはできません。

「食中毒が起きた」という結果から、もっとも可能性のある原因を見つけるという「ベイズ統計学」の考え方が使えます。

オッズ(odds)

では、解説を行います。まず、オッズ比の前に「オッズ」を理解する必要があります。

オッズとは、「ある事象が起きる確率を起こらない確率で割った値」のことです。

$$odds = \frac{P}{1-P}$$

そして、オッズ比とは「2つのオッズの比をとったもの」です。

では各メニューのオッズ比を見ていきましょう。

「食べたと食べてない」というオッズを2つ使い、「感染したと感染してない」という1つのオッズを作っているイメージです。

$$odds Ratio = \frac{\frac{X}{Y}}{\frac{A}{B}}$$

食べた(X)食べてない(Y)食べた(A)食べてない(B)オッズ比
ボンゴレビアンゴ281242181
コブサラダ192125351.274
イカスミパスタ122828320.489
タイのマリネ382194141.036
調査票

オッズ比が1よりも高くなると、原因である可能性が高いです。

そしてオッズ比を見ると、「タイのマリネ」が非常に高いことがわかります。

つまり、1単位食べるとノロウィルスに感染する確率が高い食材は「タイのマリネ」と言えます。

この後は、区間推定を行い下限が1よりも大きいことを確かめると信憑性は上がりますが、今回のオッズ比では「タイのマリネ」で間違い無いでしょう。

では原因は、鯛でしょうか?ソースでしょうか?野菜でしょうか?ここからは、調査員に任せましょう。

発展|ベイズ因子とオッズの関係

ベイズ因子は、データに基づく2つの競合する統計的仮説の相対的な確証の尺度です。

ベイズ因子\(B_{12}\)は、仮説\(H_1\)に対するデータの尤度と、仮説\(H_2\)に対するデータの尤度の比で定義されます。

$$B_{12} = p(Data|H_1) / p(Data|H_2)$$

ここで、\(p(Data|H)\)は、仮説Hの下でデータが観測される尤度です。

ベイズ因子が1より大きければ\(H_1\)を、1より小さければ\(H_2\)をデータが支持していることになります。

事前オッズと事後オッズ

オッズとは、ある事象が起こる確率をその事象が起こらない確率で割ったものでしたね。

ベイズ統計学においては、仮説の事前オッズ(Prior Odds)と事後オッズ(Posterior Odds)が重要です。

$$prior\,odds = p(H_1) / p(H_2) $$

$$posterior \, odds = (p(H_1|Data) / p(H_2|Data)$$

ここで、\(p(H)\)は仮説Hの事前確率、\(p(H|Data)\)は仮説\(H\)の事後確率です。

ベイズ因子とオッズの関係

事前オッズと事後オッズの比は、ベイズ因子に等しくなります。

$$\frac{posterior\,odds }{ prior\,odds} = \frac{p(H_1|Data) / p(H_2|Data)}{p(H_1) / p(H_2)} = (p(Data|H_1) / p(Data|H_2)) = B_{12}$$

つまり、ベイズ因子は事前オッズから事後オッズへの乗数の役割を果たします。

ベイズ因子が大きければ、データに基づき\(H_1\)を支持する事後オッズが大きくなります。

ベイズ因子の値の解釈には以下のようなスケールが提案されています。

  • \(B_{12} > 100 : H_1\)を強く支持する決定的な証拠
  • \(30 < B_{12} < 100 : H_1\)をかなり支持する強い証拠
  • \(3 < B_{12} < 30 : H_1\)を支持する確かな証拠
  • \(1 < B_{12} < 3 : H_1\)を僅かに支持するデータ
  • \(1/3 < B_{12} < 1 : H_2\)を僅かに支持するデータ
  • \(1/30 < B_{12} < 1/3 : H_2\)を支持する確かな証拠

このようにベイズ因子は、仮説間のオッズの変化を通して、データがどちらの仮説を支持しているかを判断する指標となります。

ロジスティック回帰モデル(logistic regressor)

ロジスティック回帰でもオッズは使われています。

今回の食中毒の例を取りましょう。

「ノロウィルスに感染するかしないか」という問題は、0か1をとる2値問題です。

以下のような回帰モデルを考えます。

ただし\(y<0\)の時は\(y=0,y>0\)の時は\(y=1\)を取るものとします。

$$y_{i} = \alpha+\beta x_{i}+u_{i}$$

また、個人\(i\)が\(y=1\)(ノロウィルスにかかる)になる確率を\(p_i\)とし、個人\(i\)が\(y=0\)になる確率(ノロウィルスにかからない)確率を\(1-p_i\)とします。

この時、誤差項を除いた説明変数\(\alpha+\beta x\)と\(y\)の関係を分布関数で結ぶ時、

分布関数が正規分布:プロビットモデル

$$p_{i}=Φ(\alpha+\beta x_{i})$$

分布関数がロジスティック分布:ロジット関数

$$log \frac{p_{i}}{1-p_{i}}=\alpha+\beta x_{i}$$

ロジット関数の逆関数:ロジスティック回帰モデル

$$p_{i}= \frac{exp(\alpha+\beta x_{i})}{1+exp(\alpha+\beta x_{i})}$$

2番目のロジット関数を見てください。

先ほどの説明変数を、オッズを対数化したものと表します。

これをロジットと呼びます。

オッズを知りたい場合は、ロジット関数を使い、確率を知りたい場合はロジスティック関数を使います。

この部分について、もうちょっと深掘りしてみましょう。

ロジスティック回帰モデルでは、線形予測子 \(\mathbf{X}\beta\) は実際にはlog(odds)、つまりロジット(logit)を表しています。

つまり、

$$log(odds) = logit(\pi) = log(pi/(1-\pi)) = \mathbf{X}\beta$$

となる関係があります。

ですので、ロジスティック回帰の係数ベクトル\(\beta\)を見ただけでは、直接的にはオッズではなく、オッズの対数値(ロジット)を表しています。

そのため、オッズ自体の値を知りたい場合は、以下のように指数関数をとる必要があります。

$$odds = exp(\mathbf{X}\beta) = exp(logit(\pi))= \pi / (1-\pi)$$

この場合、\(\mathbf{X}\beta\)が1増えるごとに、オッズは \(exp(1) = 2.718… \)倍になることになります。

つまり、ロジスティック回帰モデルから直接オッズを読み取るには、係数ベクトル\(\beta\)ではなく、\(exp(\mathbf{X}\beta)\)を計算する必要があり、\(\beta\)の値自体はオッズの対数(ロジット)を表していることに注意が必要です。

ロジスティック回帰の解釈では、この対数オッズ(ロジット)の変化量を見ることが一般的です。

CODE|python

以下はオッズ比を求めるpythonのコードです。

それぞれの観測回数と確率を算出できれば、オッズ比を算出することができます

# オッズ比を求めるために、2つのカテゴリに分けられるデータが必要です。
# 以下は、事象Aが起こる確率と、事象Bが起こる確率を求めるためのコードです。

event_a = 100 # 事象Aが起こった回数
event_b = 200 # 事象Bが起こった回数
total = event_a + event_b # トータル回数

prob_a = event_a / total # 事象Aが起こる確率
prob_b = event_b / total # 事象Bが起こる確率

# オッズ比を求める
odds_ratio = (prob_a / (1 - prob_a)) / (prob_b / (1 - prob_b))

print("Odds Ratio: ", odds_ratio)

FOLLOW ME !