確率 p は 0 から 1 の値しか取らない。一方、回帰分析では説明変数の線形結合 \beta_0 + \beta_1 x は -\infty から +\infty まで任意の実数値を取りうる。このギャップを埋めるのがロジット変換とプロビット変換である。
これらの変換は、確率を実数全体に写す関数であり、対数変換やBox-Cox変換と並ぶ重要なデータ変換手法である。特にロジスティック回帰やプロビット回帰といった2値応答の回帰モデルで中心的な役割を果たす。
ロジット変換
定義
ロジット変換(logit transformation)は、確率 p \in (0, 1) を実数全体 (-\infty, +\infty) に写す変換である。
ここで \dfrac{p}{1-p} はオッズ(odds)と呼ばれる。オッズは「起こる確率 / 起こらない確率」の比であり、ロジット変換はオッズの対数を取る操作と解釈できる。
具体的な値
| 確率 p | オッズ \dfrac{p}{1-p} | ロジット |
|---|---|---|
| 0.01 | 0.0101 | −4.60 |
| 0.10 | 0.111 | −2.20 |
| 0.25 | 0.333 | −1.10 |
| 0.50 | 1.000 | 0.00 |
| 0.75 | 3.000 | +1.10 |
| 0.90 | 9.000 | +2.20 |
| 0.99 | 99.0 | +4.60 |
p = 0.5 のときロジット値は 0 になり、p = 0.5 を中心に対称な変換である。
逆変換:ロジスティック関数
ロジット変換の逆変換はロジスティック関数(logistic function)またはシグモイド関数(sigmoid function)と呼ばれる。
この関数は任意の実数 x を (0, 1) の範囲に写す。ニューラルネットワークの活性化関数としても広く使われている。
プロビット変換
定義
プロビット変換(probit transformation)は、標準正規分布の累積分布関数 \Phi(x) の逆関数を用いた変換である。
ここで \Phi(x) は標準正規分布の累積分布関数である。
直感的には、「確率 p を与える標準正規分布の分位点」がプロビット値である。
具体的な値
| 確率 p | プロビット |
|---|---|
| 0.01 | −2.33 |
| 0.10 | −1.28 |
| 0.25 | −0.67 |
| 0.50 | 0.00 |
| 0.75 | +0.67 |
| 0.90 | +1.28 |
| 0.99 | +2.33 |
ロジット変換と同様に p = 0.5 で 0 になり、p = 0.5 を中心に対称である。
ロジットとプロビットの比較
両者は非常によく似た形をしており、中央付近(p \approx 0.5)ではほぼ一致する。違いが出るのは端付近で、ロジット変換のほうが端での変化が急(より急激に \pm\infty に発散する)。
両者の間には近似的な関係がある。
この関係から、ロジスティック回帰とプロビット回帰の係数には約 1.81 倍の比例関係がある。実際の分析では、どちらを使っても結果はほぼ同じになることが多い。
ロジット変換:係数がオッズ比として解釈できる。医学・疫学で好まれる。
プロビット変換:潜在変数モデルとして解釈できる。毒性学や計量経済学で好まれる。
回帰モデルへの応用
ロジスティック回帰
応答変数 Y が 0 または 1 の2値変数であるとき、その期待値(= 1になる確率)\pi を説明変数で回帰するモデルがロジスティック回帰である。
係数 \beta_j の解釈は明快である。説明変数 x_j が1単位増加すると、オッズが e^{\beta_j} 倍になる。
プロビット回帰
同様に、プロビット変換を用いたモデルがプロビット回帰(プロビットモデル)である。
プロビットモデルは潜在変数モデルとして解釈できる。観測できない潜在変数 Y^* が正規分布に従い、ある閾値を超えると Y = 1 になると考える。毒性学では「一定量を超えて毒物を摂取すると死に至る」という解釈ができる。
練習問題
p = 0.2 の場合:
p = 0.8 の場合:
考察:
2つの値は符号が逆で絶対値が等しい。これはロジット変換が p = 0.5 を中心に対称であることを示している。一般に \text{logit}(p) = -\text{logit}(1-p) が成り立つ。
つまり、ロジット値が 1.5 のとき、対応する確率は約 82% である。
ロジスティック回帰モデルを変形すると
x が1単位増加すると、オッズは e^{\beta} 倍になる。
つまり、x が1単位増加すると、オッズは約 1.65 倍になる。
まとめ
| 項目 | ロジット変換 | プロビット変換 |
|---|---|---|
| 定義 | \log \dfrac{p}{1-p} | \Phi^{-1}(p) |
| 逆変換 | \dfrac{e^x}{1+e^x} | \Phi(x) |
| 入力 | p \in (0, 1) | p \in (0, 1) |
| 出力 | (-\infty, +\infty) | (-\infty, +\infty) |
| 係数の解釈 | 対数オッズ比 | 限界効果 |
| 主な用途 | 医学・疫学 | 毒性学・計量経済学 |
Pythonで実装する
SciPyには両方の変換が用意されている。
import numpy as np
from scipy import stats
from scipy.special import logit, expit # expit = ロジスティック関数
# ロジット変換
p = 0.7
logit_val = logit(p) # または np.log(p / (1-p))
print(f"logit({p}) = {logit_val:.4f}")
# ロジスティック関数(逆変換)
x = 1.5
sigmoid = expit(x) # または 1 / (1 + np.exp(-x))
print(f"sigmoid({x}) = {sigmoid:.4f}")
# プロビット変換
probit_val = stats.norm.ppf(p)
print(f"probit({p}) = {probit_val:.4f}")
# プロビットの逆変換
prob = stats.norm.cdf(1.0)
print(f"Φ(1.0) = {prob:.4f}")
ロジスティック回帰の実装
from sklearn.linear_model import LogisticRegression
import numpy as np
# サンプルデータ
X = np.array([[1], [2], [3], [4], [5], [6], [7], [8], [9], [10]])
y = np.array([0, 0, 0, 0, 1, 0, 1, 1, 1, 1])
# ロジスティック回帰
model = LogisticRegression()
model.fit(X, y)
print(f"切片: {model.intercept_[0]:.4f}")
print(f"係数: {model.coef_[0][0]:.4f}")
print(f"オッズ比: {np.exp(model.coef_[0][0]):.4f}")
# 予測確率
X_new = np.array([[5.5]])
prob = model.predict_proba(X_new)[0][1]
print(f"X=5.5での予測確率: {prob:.4f}")