因子分析モデル#
「プライドの高さ」「英語力」のような直接観測することができない便宜上の概念を構成概念(construct)という。
構成概念を分析するためのモデルの一つが因子分析モデル(測定方程式モデル)で、例えば次のように表される
ここで
また、モデルの仮定として
潜在変数は原則
誤差は平均ゼロ、均一分散
誤差と因子スコアは無相関
をおく
歴史#
まず、現在は探索的因子分析(exploratory factor analysis: EFA)と呼ばれる、事前に特定の仮説を置かずにデータの共分散に基づいて(主成分分析のように)因子スコアを推定する方法が提案された
その後、分析者が仮説(モデル構造)を仮定して推定する確認的因子分析(confirmatory factor analysis: CFA)が提案された。
SEMが提案された後はそれらの因子分析がSEMの下位モデルとして内包されるようになった
推定#
のモデルを例にとる。
共分散の構造化#
観測変数の分散共分散行列を計算していく。
となる。最後の行は仮定より
となる。
つづいて共分散は
となるため
となる。
観測変数の共分散行列は
と書き直すことができる。このように共分散を母数の関数で表現することを「構造化」という。上記の式のように共分散を方程式モデルの母数で表現したものを「共分散構造」とよぶ。
推定#
モデルの
共分散構造を用いて、
を
で、これを利用して
となる。
誤差分散は
となる。
上記の式は母分散を利用しているが、実際には標本分散を用いた推定量とする
# データの生成
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]])
標準化解#
共分散(相関)も
共分散行列は
と構造化される
測定方程式の行列表記#
測定方程式を次のように表記する
また仮定については
となる。
共分散構造は