因子分析モデル#

「プライドの高さ」「英語力」のような直接観測することができない便宜上の概念を構成概念(construct)という。

構成概念を分析するためのモデルの一つが因子分析モデル測定方程式モデル)で、例えば次のように表される

\[\begin{split} v_1 = \alpha_{11} f_1 + e_1\\ v_2 = \alpha_{21} f_1 + e_2\\ v_3 = \alpha_{31} f_1 + e_3\\ \end{split}\]

ここで\(v\)は観測値の偏差\(v = x - E[x]\)\(\alpha\)因子負荷量(factor loading)、\(f\)は構成概念を表す変数で因子スコア(factor score)あるいは因子と呼ばれる。

\(f\)は構造的な潜在変数である。

また、モデルの仮定として

  1. 潜在変数は原則 \(E[f_i] = 0, V[f_i] = 1\)

  2. 誤差は平均ゼロ、均一分散 \(E[e_i]=0, V[e_i] = \sigma^2_{e_i}\)

  3. 誤差と因子スコアは無相関 \(E[f_i e_i] = 0\)

をおく

歴史#

まず、現在は探索的因子分析(exploratory factor analysis: EFA)と呼ばれる、事前に特定の仮説を置かずにデータの共分散に基づいて(主成分分析のように)因子スコアを推定する方法が提案された

その後、分析者が仮説(モデル構造)を仮定して推定する確認的因子分析(confirmatory factor analysis: CFA)が提案された。

SEMが提案された後はそれらの因子分析がSEMの下位モデルとして内包されるようになった

推定#

\[\begin{split} v_1 = \alpha_{11} f_1 + e_1\\ v_2 = \alpha_{21} f_1 + e_2\\ v_3 = \alpha_{31} f_1 + e_3\\ \end{split}\]

のモデルを例にとる。

共分散の構造化#

観測変数の分散共分散行列を計算していく。

\(v_1\)の分散\(\sigma^2_1\)

\[\begin{split} \begin{align} \sigma^2_1 &= E[v^2_1]\\ &= E[(\alpha_{11} f_1 + e_1)(\alpha_{11} f_1 + e_1)]\\ &= E[\alpha_{11}^2 f_1^2 + 2 \alpha_{11} f_1 e_1 + e^2_1]\\ &= \alpha_{11}^2 E[f_1^2] + 2 \alpha_{11} E[f_1 e_1] + E[e^2_1]\\ &= \alpha_{11}^2 + \sigma^2_{e_1} \end{align} \end{split}\]

となる。最後の行は仮定より\(E[f_1 e_1] = 0\)となること、それから仮定より\(E[e_1]=0\)ゆえに\(E[e^2_1]=V[e_1]=\sigma^2_{e_1}\)であり、同様に\(E[f_1]=0\)から\(E[f_1^2]=V[f_1]=1\)となることを利用している。

\(v_2\)\(v_3\)の分散も同様なので、分散は最終的に

\[\begin{split} \sigma^2_1 = \alpha^2_{11} + \sigma^2_{e_1}\\ \sigma^2_2 = \alpha^2_{21} + \sigma^2_{e_2}\\ \sigma^2_3 = \alpha^2_{31} + \sigma^2_{e_3}\\ \end{split}\]

となる。

つづいて共分散は

\[\begin{split} \begin{align} \sigma_{21} &= E[v_2 v_1]\\ &= E[(\alpha_{21} f_1 + e_2)(\alpha_{11} f_1 + e_1)]\\ &= E[\alpha_{21}\alpha_{11} f_1^2 + \alpha_{21} f_1 e_1 + \alpha_{11} f_1 e_2 + e_1 e_2]\\ &= \alpha_{21} \alpha_{11} \end{align} \end{split}\]

となるため

\[\begin{split} \sigma_{21} = \alpha_{21} \alpha_{11}\\ \sigma_{31} = \alpha_{31} \alpha_{11}\\ \sigma_{32} = \alpha_{31} \alpha_{21}\\ \end{split}\]

となる。

観測変数の共分散行列は

\[\begin{split} \Sigma = \begin{bmatrix} \sigma^2_1 \\ \sigma_{21} & \sigma^2_2\\ \sigma_{31} & \sigma_{32} & \sigma^2_3 \end{bmatrix} = \begin{bmatrix} \alpha^2_{11} + \sigma^2_{e_1}\\ \alpha_{21} \alpha_{11} & \alpha^2_{21} + \sigma^2_{e_2}\\ \alpha_{31} \alpha_{11} & \alpha_{31} \alpha_{21} & \alpha^2_{31} + \sigma^2_{e_3} \end{bmatrix} \end{split}\]

と書き直すことができる。このように共分散を母数の関数で表現することを「構造化」という。上記の式のように共分散を方程式モデルの母数で表現したものを「共分散構造」とよぶ。

推定#

モデルの\(\alpha, f, e\)を推定していく。

共分散構造を用いて、

\[\begin{split} \sigma_{21} = \alpha_{21} \alpha_{11}\\ \sigma_{31} = \alpha_{31} \alpha_{11}\\ \sigma_{32} = \alpha_{31} \alpha_{21}\\ \end{split}\]

\(\alpha_{11}\)について解くと

\[\begin{split} \frac{ \sigma_{21} \sigma_{31} }{ \sigma_{32} } = \frac{ \alpha_{21} \alpha_{11} \times \alpha_{31} \alpha_{11} }{ \alpha_{31} \alpha_{21} } = \alpha_{11}^2 \\ \to \alpha_{11} = \pm \sqrt{ \frac{ \sigma_{21} \sigma_{31} }{ \sigma_{32} } } \end{split}\]

で、これを利用して

\[\begin{split} \alpha_{21} = \frac{ \sigma_{21} }{ \alpha_{11} }\\ \alpha_{31} = \frac{ \sigma_{31} }{ \alpha_{11} } \end{split}\]

となる。

誤差分散は

\(\sigma^2_i = \alpha^2_{ij} + \sigma^2_{e_i} \implies \sigma^2_{e_i} = \sigma^2_i - \alpha^2_{ij}\)より

\[\begin{split} \sigma^2_{e_1} = \sigma^2_1 - \alpha^2_{11}\\ \sigma^2_{e_2} = \sigma^2_2 - \alpha^2_{21}\\ \sigma^2_{e_3} = \sigma^2_3 - \alpha^2_{31} \end{split}\]

となる。

上記の式は母分散を利用しているが、実際には標本分散を用いた推定量とする

# データの生成
from scipy.stats import multivariate_normal
import numpy as np
mean = np.array([10, 5, 3])
cov = np.array([
    [2, 0.5,  1.2],
    [0.5, 1,  0.7],
    [1.2, 0.7, 1.5],
])
mvn = multivariate_normal(mean=mean, cov=cov, seed=0)

n = 100
# データ行列
X = mvn.rvs(size=n, random_state=0)
# 平均偏差行列
V = X - X.mean(axis=0)
# 分散共分散行列
S = np.cov(V, rowvar=False)
S.round(3)
array([[2.275, 0.578, 1.278],
       [0.578, 0.976, 0.69 ],
       [1.278, 0.69 , 1.42 ]])
# alphaの推定
# pythonは0始まりなのでインデックスが全部1ずれる
a11 = np.sqrt( S[1, 0] * S[2, 0] / S[2, 1] )
a21 = S[1, 0] / a11
a31 = S[2, 0] / a11
# 誤差分散sigma_eの推定
s_e1 = S[0,0] - a11
s_e2 = S[1,1] - a21
s_e3 = S[2,2] - a31
# 再現された分散行列
Sigma = np.array([
    [(a11**2 + s_e1**2), a21 * a11, a31 * a11],
    [a21 * a11, (a21**2 + s_e2**2), a31 * a21],
    [a31 * a11, a31 * a21, (a31**2 + s_e3**2)],
])
Sigma.round(3)
array([[2.609, 0.578, 1.278],
       [0.578, 0.486, 0.69 ],
       [1.278, 0.69 , 1.559]])
# residual
(S - Sigma).round(3)
array([[-0.334,  0.   ,  0.   ],
       [ 0.   ,  0.49 , -0.   ],
       [ 0.   , -0.   , -0.138]])

標準化解#

\(z, f, e\)の分散が1に標準化されたモデル(標準化モデル)

\[\begin{split} z_1 = \alpha_{11}^* f_1 + \beta_1 e_1^*\\ z_2 = \alpha_{21}^* f_1 + \beta_2 e_2^*\\ z_3 = \alpha_{31}^* f_1 + \beta_3 e_3^*\\ \end{split}\]

\(\beta\)は誤差の係数(\(\alpha\)は区別のため係数に\(*\)をつけている)

\(z, f, e\)の分散は1になるから、その係数は合計が1になる:\(1 = \alpha_{11}^{*2} + \beta_1^2\)

共分散(相関)も\(\sigma_{r21} = \alpha_{21}^* \alpha_{11}^*\)のようになる

共分散行列は

\[\begin{split} \Sigma = \begin{bmatrix} \sigma^2_1 \\ \sigma_{r21} & \sigma^2_2\\ \sigma_{r31} & \sigma_{r32} & \sigma^2_3 \end{bmatrix} = \begin{bmatrix} \alpha^{*2}_{11} + \beta^2_1\\ \alpha_{21}^* \alpha_{11}^* & \alpha^{*2}_{21} + \beta^2_2\\ \alpha_{31}^* \alpha_{11}^* & \alpha_{31}^* \alpha_{21}^* & \alpha^{*2}_{31} + \beta^2_3 \end{bmatrix} \end{split}\]

と構造化される

測定方程式の行列表記#

測定方程式を次のように表記する

\[ \newcommand{\b}[1]{\boldsymbol{#1}} \b{v} = \b{A} \b{f} + \b{e} \]

また仮定については

\[\begin{split} E[\b{f}] = \b{o}\\ E[\b{e}] = \b{o}\\ E[\b{fe}^T] = \b{O} \end{split}\]

となる。

共分散構造は

\[\begin{split} \begin{align} \b{\Sigma} &= E[(\b{x} - \b{\mu})(\b{x} - \b{\mu})^T]\\ &= E[\b{vv}^T]\\ &= E[(\b{Af}+\b{e})(\b{Af}+\b{e})^T]\\ &= E[(\b{Af}+\b{e})(\b{f}^T\b{A}^T+\b{e}^T)]\\ &= E[\b{Af} \b{f}^T\b{A}^T] + E[\b{Af} \b{e}^T] + E[\b{e} \b{f}^T\b{A}^T] + E[\b{e e}^T]\\ &= \b{A} E[\b{f} \b{f}^T] \b{A}^T + \b{A} E[\b{f} \b{e}^T] + E[\b{e} \b{f}^T] \b{A}^T + E[\b{e e}^T]\\ &= \b{A} E[\b{f} \b{f}^T] \b{A}^T + E[\b{e e}^T]\\ &= \b{A} \b{\Sigma}_{rf} \b{A}^T + \b{\Sigma}_e \end{align} \end{split}\]