因子分析モデル#

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

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

v1=α11f1+e1v2=α21f1+e2v3=α31f1+e3

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

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

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

  1. 潜在変数は原則 E[fi]=0,V[fi]=1

  2. 誤差は平均ゼロ、均一分散 E[ei]=0,V[ei]=σei2

  3. 誤差と因子スコアは無相関 E[fiei]=0

をおく

歴史#

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

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

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

推定#

v1=α11f1+e1v2=α21f1+e2v3=α31f1+e3

のモデルを例にとる。

共分散の構造化#

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

v1の分散σ12

σ12=E[v12]=E[(α11f1+e1)(α11f1+e1)]=E[α112f12+2α11f1e1+e12]=α112E[f12]+2α11E[f1e1]+E[e12]=α112+σe12

となる。最後の行は仮定よりE[f1e1]=0となること、それから仮定よりE[e1]=0ゆえにE[e12]=V[e1]=σe12であり、同様にE[f1]=0からE[f12]=V[f1]=1となることを利用している。

v2v3の分散も同様なので、分散は最終的に

σ12=α112+σe12σ22=α212+σe22σ32=α312+σe32

となる。

つづいて共分散は

σ21=E[v2v1]=E[(α21f1+e2)(α11f1+e1)]=E[α21α11f12+α21f1e1+α11f1e2+e1e2]=α21α11

となるため

σ21=α21α11σ31=α31α11σ32=α31α21

となる。

観測変数の共分散行列は

Σ=[σ12σ21σ22σ31σ32σ32]=[α112+σe12α21α11α212+σe22α31α11α31α21α312+σe32]

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

推定#

モデルのα,f,eを推定していく。

共分散構造を用いて、

σ21=α21α11σ31=α31α11σ32=α31α21

α11について解くと

σ21σ31σ32=α21α11×α31α11α31α21=α112α11=±σ21σ31σ32

で、これを利用して

α21=σ21α11α31=σ31α11

となる。

誤差分散は

σi2=αij2+σei2σei2=σi2αij2より

σe12=σ12α112σe22=σ22α212σe32=σ32α312

となる。

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

# データの生成
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に標準化されたモデル(標準化モデル)

z1=α11f1+β1e1z2=α21f1+β2e2z3=α31f1+β3e3

βは誤差の係数(αは区別のため係数にをつけている)

z,f,eの分散は1になるから、その係数は合計が1になる:1=α112+β12

共分散(相関)もσr21=α21α11のようになる

共分散行列は

Σ=[σ12σr21σ22σr31σr32σ32]=[α112+β12α21α11α212+β22α31α11α31α21α312+β32]

と構造化される

測定方程式の行列表記#

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

v=Af+e

また仮定については

E[f]=oE[e]=oE[feT]=O

となる。

共分散構造は

Σ=E[(xμ)(xμ)T]=E[vvT]=E[(Af+e)(Af+e)T]=E[(Af+e)(fTAT+eT)]=E[AffTAT]+E[AfeT]+E[efTAT]+E[eeT]=AE[ffT]AT+AE[feT]+E[efT]AT+E[eeT]=AE[ffT]AT+E[eeT]=AΣrfAT+Σe