「プライドの高さ」「英語力」のような直接観測することができない便宜上の概念を構成概念(construct)という。
構成概念を分析するためのモデルの一つが因子分析モデル(測定方程式モデル)で、例えば次のように表される
v1=α11f1+e1v2=α21f1+e2v3=α31f1+e3 ここでvは観測値の偏差v=x−E[x]、αは因子負荷量(factor loading)、fは構成概念を表す変数で因子スコア(factor score)あるいは因子と呼ばれる。
fは構造的な潜在変数である。
また、モデルの仮定として
潜在変数は原則 E[fi]=0,V[fi]=1
誤差は平均ゼロ、均一分散 E[ei]=0,V[ei]=σei2
誤差と因子スコアは無相関 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となることを利用している。
v2とv3の分散も同様なので、分散は最終的に
σ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σ31σ22σ32σ32⎦⎤=⎣⎡α112+σe12α21α11α31α11α212+σe22α31α21α312+σe32⎦⎤ と書き直すことができる。このように共分散を母数の関数で表現することを「構造化」という。上記の式のように共分散を方程式モデルの母数で表現したものを「共分散構造」とよぶ。
モデルのα,f,eを推定していく。
共分散構造を用いて、
σ21=α21α11σ31=α31α11σ32=α31α21 をα11について解くと
σ32σ21σ31=α31α21α21α11×α31α11=α112→α11=±σ32σ21σ31 で、これを利用して
α21=α11σ21α31=α11σ31 となる。
誤差分散は
σ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)
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=α11∗f1+β1e1∗z2=α21∗f1+β2e2∗z3=α31∗f1+β3e3∗ βは誤差の係数(αは区別のため係数に∗をつけている)
z,f,eの分散は1になるから、その係数は合計が1になる:1=α11∗2+β12
共分散(相関)もσr21=α21∗α11∗のようになる
共分散行列は
Σ=⎣⎡σ12σr21σr31σ22σr32σ32⎦⎤=⎣⎡α11∗2+β12α21∗α11∗α31∗α11∗α21∗2+β22α31∗α21∗α31∗2+β32⎦⎤ と構造化される
測定方程式の行列表記¶
測定方程式を次のように表記する
v=Af+e また仮定については
Undefined control sequence: \b at position 3: E[\̲b̲{f}] = \b{o}\\
…
E[\b{f}] = \b{o}\\
E[\b{e}] = \b{o}\\
E[\b{fe}^T] = \b{O}となる。
共分散構造は
Undefined control sequence: \b at position 15: \begin{align}
\̲b̲{\Sigma}
&…
\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}