テトラコリック相関係数 (tetrachoric correlation coefficient, 四分相関係数 とも) は、二値変数同士の相関係数で、2つの二値変数の背後に連続変数が存在すると仮定して、それらの間の相関の強さを推定する。
歴史的経緯 (from Olsson (1979))
Pearson (1901) で標準正規分布の累積分布
からを解くことで求める方法が提案された。
Hamdan (1970) は2x2表からを最尤推定することとtetrachoric correlationが等しいことを示した。
Brown & Benedetti (1977) はtetrachoric correlationが対応する真の相関に対してバイアスがあるが、セルの予想される頻度が5未満でない場合、バイアスは無視できることを示した。
推定方法¶
2つの観測変数があるとし、その背後に正規分布に従う潜在変数
があり、それぞれの潜在変数がある閾値によって二値に変換されている、すなわち
とする。
相関係数 と 2変量の標準正規分布の累積分布関数 による同時確率
を考えて、ここから尤度関数を作って最尤推定を行う。
import numpy as np
from scipy.optimize import minimize_scalar
from scipy.stats import multivariate_normal
def tetrachoric_corr(x: np.ndarray, y: np.ndarray) -> float:
n = len(x)
n00 = np.sum((x == 0) & (y == 0))
n01 = np.sum((x == 0) & (y == 1))
n10 = np.sum((x == 1) & (y == 0))
n11 = np.sum((x == 1) & (y == 1))
px0 = (n00 + n01) / n
py0 = (n00 + n10) / n
tau_x = norm.ppf(px0)
tau_y = norm.ppf(py0)
def neg_log_likelihood(rho):
cov = np.array([[1, rho], [rho, 1]])
p00 = multivariate_normal.cdf([tau_x, tau_y], mean=[0, 0], cov=cov)
p01 = norm.cdf(tau_x) - p00
p10 = norm.cdf(tau_y) - p00
p11 = 1 - norm.cdf(tau_x) - norm.cdf(tau_y) + p00
probs = np.array([p00, p01, p10, p11])
counts = np.array([n00, n01, n10, n11])
assert np.all(probs >= 0)
return -np.sum(counts * np.log(probs))
result = minimize_scalar(neg_log_likelihood, bounds=(-0.999, 0.999), method='bounded')
return result.x# データ生成(潜在相関0.6)
from scipy.stats import norm
np.random.seed(1)
latent_x = np.random.normal(size=100)
latent_y = 0.6 * latent_x + np.random.normal(size=100)
X = (latent_x > 0.3).astype(int)
Y = (latent_y > 0.3).astype(int)
# 推定
rho_hat = tetrachoric_corr(X, Y)
print(f"推定されたテトラコリック相関: {rho_hat:.4f}")推定されたテトラコリック相関: 0.4084
参考文献¶
関連文献
- Pearson, K. (1900). I. Mathematical contributions to the theory of evolution. —VII. On the correlation of characters not quantitatively measurable. Philosophical Transactions of the Royal Society of London. Series A, Containing Papers of a Mathematical or Physical Character, 195(262–273), 1–47. 10.1098/rsta.1900.0022