Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

ポリシリアル相関係数

ポリシリアル相関係数(polyserial correlation) は順序尺度の変数と連続変数の間の相関係数。

理論

モデルの仮定

順序尺度の変数YYは連続潜在変数Y∗Y^*をある閾値で分割したものであると仮定する

Y=yj if  τj−1<Y∗≤τj,j=1,2,…,JY= y_j \quad \text { if } ~ \tau_{j-1}<Y^* \leq \tau_j , \quad j = 1, 2, \dots, J

ここで

  • Y∗Y^* :連続潜在変数。標準正規分布に従う:E⁡[Y]=0,Var⁡[Y]=1\operatorname{E}[Y] = 0, \operatorname{Var}[Y] = 1

  • XX :連続観測変数。E⁡[X]=μX,Var⁡[X]=σX\operatorname{E}[X] = \mu_X, \operatorname{Var}[X] = \sigma_X

  • (X,Y∗)(X, Y^*) は 2変量正規分布に従うと仮定:

[XY∗]∼N([μX0],[σX2ρρ1])\left[\begin{array}{c} X \\ Y^* \end{array}\right] \sim \mathcal{N}\left(\left[\begin{array}{l} \mu_X \\ 0 \end{array}\right],\left[\begin{array}{ll} \sigma_X^2 & \rho \\ \rho & 1 \end{array}\right]\right)

尤度関数

nn個のサンプル(xi,yi)(x_i, y_i)の尤度関数LLは、正規分布をもちいて

L=∏i=1nfXY(xi,yi)=∏i=1nfX(xi)P(Y=yi∣X=xi)L = \prod_{i=1}^n f_{XY}(x_i, y_i) = \prod_{i=1}^n f_{X}(x_i) P(Y=y_i \mid X=x_i)

と、同時確率密度 fXYf_{XY} を周辺密度fXf_{X}と条件付き確率密度fY∣X(Y∣X)=P(Y=yi∣X=xi)f_{Y\mid X}(Y\mid X) = P(Y=y_i \mid X=x_i)の積の形に変形できる。そしてρ\rhoが関わるのは条件付き確率密度のほうになる。

YYのX=xiX=x_iによる条件つき分布P(Y=yi∣X=xi)P(Y=y_i \mid X=x_i)は、xix_iを標準化したzi=(xi−μX)/σXz_i =(x_i - \mu_X) / \sigma_Xを考えると 平均ρzi\rho z_i、分散(1−ρ)(1- \rho)の正規分布に従うため

P(Y=yj∣X=xi)=Φ(τj∗)−Φ(τj−1∗),j=1,2,…,JP(Y = y_j \mid X = x_i) = \Phi(\tau_j^*) - \Phi(\tau_{j-1}^*), \quad j = 1, 2, \dots, J

ここでτj∗\tau_j^*は正規化した閾値(標準正規空間での閾値)

τj∗=τj−ρzi1−ρ2\tau_j^* = \frac{\tau_j-\rho z_i}{\sqrt{1-\rho^2}}

である。

こうして対数尤度関数

log⁡L(ρ)=∑i=1nlog⁡[Φ(τyi−ρzi1−ρ2)−Φ(τyi−1−ρzi1−ρ2)]\log L(\rho)=\sum_{i=1}^n \log \left[\Phi\left(\frac{\tau_{y_i}-\rho z_i}{\sqrt{1-\rho^2}}\right)-\Phi\left(\frac{\tau_{y_i-1}-\rho z_i}{\sqrt{1-\rho^2}}\right)\right]

を構築できる。

条件付き分布について

2変量正規分布:

[XY]∼N([μXμY],[σX2ρσXσYρσXσYσY2])\left[\begin{array}{c} X \\ Y \end{array}\right] \sim \mathcal{N}\left(\left[\begin{array}{l} \mu_X \\ \mu_Y \end{array}\right],\left[\begin{array}{cc} \sigma_X^2 & \rho \sigma_X \sigma_Y \\ \rho \sigma_X \sigma_Y & \sigma_Y^2 \end{array}\right]\right)

があるとき,X=xX=x という条件のもとでの YY の条件付き分布は fY∣X(y∣x)=fX,Y(x,y)fX(x)f_{Y\mid X}(y|x) = \frac{f_{X,Y}(x,y)}{f_X(x)} より、

fY∣X(y∣x)=12π(1−ρ2)σY2×exp⁡[−12(1−ρ2)σY2{y−μY−ρσYσX(x−μX)}2]f_{Y \mid X}(y \mid x)=\frac{1}{\sqrt{2 \pi (1-\rho^2) \sigma_Y^2}} \times \exp \left[-\frac{1}{2\left(1-\rho^2\right) \sigma_Y^2}\left\{y-\mu_Y-\rho \frac{\sigma_Y}{\sigma_X}\left(x-\mu_X\right)\right\}^2\right]

から、条件付き分布は

Y∣X=x∼N(μY+ρσYσX(x−μX),(1−ρ2)σY2)Y \mid X = x \sim \mathcal{N}\left( \mu_Y + \rho \frac{\sigma_Y}{\sigma_X} (x-\mu_X), (1-\rho^2) \sigma_Y^2 \right)

となる。μY=0,σY=1\mu_Y=0, \sigma_Y=1の

[XY∗]∼N([μX0],[σX2ρσXρσX1])\left[\begin{array}{c} X \\ Y^* \end{array}\right] \sim \mathcal{N}\left(\left[\begin{array}{l} \mu_X \\ 0 \end{array}\right],\left[\begin{array}{cc} \sigma_X^2 & \rho \sigma_X \\ \rho \sigma_X & 1 \end{array}\right]\right)

という分布であれば

Y∗∣X=x∼N(ρ1σX(x−μX),1−ρ2)Y^* \mid X = x \sim \mathcal{N}\left( \rho \frac{1}{\sigma_X} (x-\mu_X), 1-\rho^2 \right)

となる。XXを標準化して zi=(xi−μX)/σXz_i = (x_i - \mu_X) / \sigma_X とおけば

Y∗∣Z=zi∼N(ρzi,1−ρ2)Y^* \mid Z = z_i \sim \mathcal{N}\left(\rho z_i, 1-\rho^2\right)

参考:

関連文献
  • Drasgow, F. (1986). Polychoric and polyserial correlations In: Kotz S, Johnson N, editors. The Encyclopedia of Statistics.

/tmp/ipykernel_1190577/413508437.py:69: UserWarning: FigureCanvasAgg is non-interactive, and thus cannot be shown
  fig.show()
np.float64(0.7481134651912188)
<Figure size 400x300 with 1 Axes>

実装の高速化メモ

forループよりベクトル化、高レベルAPIより低レベル

scipy.special.ndtr は標準正規分布の累積確率の低レベル関数で、norm.cdf よりも高速

162 ms ± 2.73 ms per loop (mean ± std. dev. of 3 runs, 1 loop each)
130 μs ± 1.23 μs per loop (mean ± std. dev. of 3 runs, 10,000 loops each)
59.5 μs ± 2.31 μs per loop (mean ± std. dev. of 3 runs, 10,000 loops each)

polyserialの高速化

polyserial のモデル

yy は潜在的な連続変数 y∗y^* を閾値 τ\tau で切ったものと仮定する。xx を標準化した zz を使うと、観測 ii の尤度への寄与は

pi=Φ ⁣(τyi+1−ρzi1−ρ2)−Φ ⁣(τyi−ρzi1−ρ2)p_i = \Phi\!\left(\frac{\tau_{y_i+1} - \rho z_i}{\sqrt{1-\rho^2}}\right) - \Phi\!\left(\frac{\tau_{y_i} - \rho z_i}{\sqrt{1-\rho^2}}\right)

で、−∑ilog⁡pi-\sum_i \log p_i を ρ\rho について最小化する(2段階最尤法: τ\tau は周辺分布から先に推定)。

改善前の実装

観測 ii ごとに Python ループを回し、1件ずつ norm.cdf を呼ぶ実装だと、最適化ソルバーは尤度関数を数十回評価するので、コストは「反復回数 × n × norm.cdf のオーバーヘッド」になる。

x: [2 1 2 0 4 3 4 4 3 0] ...
y: [2 1 3 1 2 3 4 3 3 2] ...
z: [-0.04 -0.61  0.28 -1.6   1.24  0.52  2.12  1.45  0.63 -0.88] ...
189 ms ± 3.74 ms per loop (mean ± std. dev. of 3 runs, 1 loop each)

改善後: fancy indexing で一括計算

鍵は fancy indexing です。tau[y] と書くと、各観測 ii に対応する閾値 τyi\tau_{y_i} を並べた長さ n の配列が一発で得られます。

tau[y]   = [-100.     0.3   -0.8   -0.8 -100. ]
tau[y+1] = [ -0.8 100.    0.3   0.3  -0.8]
94.1 μs ± 502 ns per loop (mean ± std. dev. of 3 runs, 10,000 loops each)
loop: 7413.73487638945
vec:  7413.734876389446

高速化バージョン

1.75 s ± 13.5 ms per loop (mean ± std. dev. of 3 runs, 1 loop each)
1.23 ms ± 3.26 μs per loop (mean ± std. dev. of 3 runs, 1,000 loops each)