ヘロログ
統計学

ロジット変換・プロビット変換

確率 p は 0 から 1 の値しか取らない。一方、回帰分析では説明変数の線形結合 \beta_0 + \beta_1 x-\infty から +\infty まで任意の実数値を取りうる。このギャップを埋めるのがロジット変換プロビット変換である。

これらの変換は、確率を実数全体に写す関数であり、対数変換Box-Cox変換と並ぶ重要なデータ変換手法である。特にロジスティック回帰やプロビット回帰といった2値応答の回帰モデルで中心的な役割を果たす。

ロジット変換

定義

ロジット変換(logit transformation)は、確率 p \in (0, 1) を実数全体 (-\infty, +\infty) に写す変換である。

ロジット変換
\text{logit}(p) = \log \frac{p}{1-p}

ここで \dfrac{p}{1-p}オッズ(odds)と呼ばれる。オッズは「起こる確率 / 起こらない確率」の比であり、ロジット変換はオッズの対数を取る操作と解釈できる。

具体的な値

確率 p オッズ \dfrac{p}{1-p} ロジット
0.010.0101−4.60
0.100.111−2.20
0.250.333−1.10
0.501.0000.00
0.753.000+1.10
0.909.000+2.20
0.9999.0+4.60

p = 0.5 のときロジット値は 0 になり、p = 0.5 を中心に対称な変換である。

逆変換:ロジスティック関数

ロジット変換の逆変換はロジスティック関数(logistic function)またはシグモイド関数(sigmoid function)と呼ばれる。

ロジスティック関数(シグモイド関数)
\sigma(x) = \frac{1}{1 + e^{-x}} = \frac{e^x}{1 + e^x}

この関数は任意の実数 x(0, 1) の範囲に写す。ニューラルネットワークの活性化関数としても広く使われている。

プロビット変換

定義

プロビット変換(probit transformation)は、標準正規分布の累積分布関数 \Phi(x) の逆関数を用いた変換である。

プロビット変換
\text{probit}(p) = \Phi^{-1}(p)

ここで \Phi(x) は標準正規分布の累積分布関数である。

\Phi(x) = \int_{-\infty}^{x} \frac{1}{\sqrt{2\pi}} e^{-t^2/2} dt

直感的には、「確率 p を与える標準正規分布の分位点」がプロビット値である。

具体的な値

確率 p プロビット
0.01−2.33
0.10−1.28
0.25−0.67
0.500.00
0.75+0.67
0.90+1.28
0.99+2.33

ロジット変換と同様に p = 0.5 で 0 になり、p = 0.5 を中心に対称である。

ロジットとプロビットの比較

p y 0 0.25 0.5 0.75 1 4 3 2 1 0 −1 −2 −3 −4 ロジット プロビット (0.5, 0)
図1: ロジット変換とプロビット変換の比較。両者とも p=0.5 で 0 を通る

両者は非常によく似た形をしており、中央付近(p \approx 0.5)ではほぼ一致する。違いが出るのは端付近で、ロジット変換のほうが端での変化が急(より急激に \pm\infty に発散する)。

両者の間には近似的な関係がある。

\text{logit}(p) \approx \frac{\pi}{\sqrt{3}} \cdot \text{probit}(p) \approx 1.81 \cdot \text{probit}(p)

この関係から、ロジスティック回帰とプロビット回帰の係数には約 1.81 倍の比例関係がある。実際の分析では、どちらを使っても結果はほぼ同じになることが多い。

使い分けの目安

ロジット変換:係数がオッズ比として解釈できる。医学・疫学で好まれる。
プロビット変換:潜在変数モデルとして解釈できる。毒性学や計量経済学で好まれる。

回帰モデルへの応用

ロジスティック回帰

応答変数 Y が 0 または 1 の2値変数であるとき、その期待値(= 1になる確率)\pi を説明変数で回帰するモデルがロジスティック回帰である。

ロジスティック回帰モデル
\log \frac{\pi}{1-\pi} = \beta_0 + \beta_1 x_1 + \cdots + \beta_p x_p

係数 \beta_j の解釈は明快である。説明変数 x_j が1単位増加すると、オッズが e^{\beta_j} 倍になる。

プロビット回帰

同様に、プロビット変換を用いたモデルがプロビット回帰(プロビットモデル)である。

プロビットモデル
\pi = \Phi(\beta_0 + \beta_1 x_1 + \cdots + \beta_p x_p)

プロビットモデルは潜在変数モデルとして解釈できる。観測できない潜在変数 Y^* が正規分布に従い、ある閾値を超えると Y = 1 になると考える。毒性学では「一定量を超えて毒物を摂取すると死に至る」という解釈ができる。

練習問題

問1. p = 0.2p = 0.8 に対するロジット値を計算せよ。また、この2つの値の関係について考察せよ。

p = 0.2 の場合:

\text{logit}(0.2) = \log \frac{0.2}{0.8} = \log 0.25 = -1.386

p = 0.8 の場合:

\text{logit}(0.8) = \log \frac{0.8}{0.2} = \log 4 = +1.386

考察:

2つの値は符号が逆で絶対値が等しい。これはロジット変換が p = 0.5 を中心に対称であることを示している。一般に \text{logit}(p) = -\text{logit}(1-p) が成り立つ。

問2. ロジスティック関数 \sigma(x) = \dfrac{1}{1+e^{-x}} について、x = 1.5 のときの値を計算せよ。
\sigma(1.5) = \frac{1}{1 + e^{-1.5}} = \frac{1}{1 + 0.2231} = \frac{1}{1.2231} \approx 0.818

つまり、ロジット値が 1.5 のとき、対応する確率は約 82% である。

問3. ロジスティック回帰で説明変数 x の係数が \beta = 0.5 と推定された。x が1単位増加したとき、オッズは何倍になるか。

ロジスティック回帰モデルを変形すると

\frac{\pi}{1-\pi} = e^{\beta_0 + \beta x}

x が1単位増加すると、オッズは e^{\beta} 倍になる。

e^{0.5} \approx 1.649

つまり、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には両方の変換が用意されている。

logit_probit.py
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}")
logit(0.7) = 0.8473 sigmoid(1.5) = 0.8176 probit(0.7) = 0.5244 Φ(1.0) = 0.8413

ロジスティック回帰の実装

logistic_regression.py
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}")