MIMICモデル & PLSモデル#

多重指標モデル#

複数の観測変数によって測定される構成概念(潜在変数)同士の関係性を回帰分析にかけるようなモデル

../../_images/3d9f72d028758c6c8dc25d331bfdaa89fd95eb4cbba4443918dbfad48e20c277.svg

正準相関分析モデル#

複数の潜在変数同士の相関関係を分析するモデルを 正準相関分析(Canonical Correlation Analysis: CCA) モデルという(豊田 (1991))。

../../_images/753cd1e96405b86c99f1b8486eb3c65f731418d10a657f07461ef191b9bbdd29.svg

MIMICモデル#

MIMIC (Multiple Indicator Multiple Cause) モデルは、観測変数\(x4,x5,x6\)をまとめた合成変数\(f1\)(共通因子)を別の観測変数\(x1,x2,x3\)に回帰するという、因子分析と回帰分析を組み合わせたようなモデル。

../../_images/79c94897ee429fedd5bf678c5b0d0801db1f7bb0aa9b53661c6ed5f28977be42.svg

歴史#

経済学者のArthur Goldbergerが統計学者との共著で1975年に提案

関連文献#

Charles F. Manski, “Arthur S. Goldberger”, Biographical Memoirs of the National Academy of Sciences (2013)

  • ManskiによるGoldbergerの業績についての記述

  • GoldbergerはMIMICモデルだけでなく、”mean independence”の提案やSelection Biasに関する研究など因果推論への貢献も多いとのこと

PLSモデル (Partial Least Square Model)#

MIMICモデルにおける合成変数を別の因子の説明に使ったもの。

観測変数の線形和による合成変数(作成した指標)が別の共通因子にどのくらい影響しているかを測る。

観測変数をまとめた合成変数から、別の複数の観測変数の潜在変数に与える影響の強さを検討するモデル

多重指標モデルでは「潜在変数→観測変数」というパス(観測変数に共通する潜在的な因子)を引いて測定するのみだった。 PLSでは「潜在変数→観測変数」という方向のパスだけでなく「観測変数→潜在変数」の方向のパスも両方含まれる

../../_images/de0bdb99b97dc53bc0e0cc6ca803e418157055566b52353aba07a4574eaddc87.svg

semopyによる実行例#

import numpy as np
import pandas as pd

# データ生成
n = 1000
np.random.seed(0)

r_12 = 0.1  # x1とx2の関連性(f1)
x1 = np.random.normal(size=n)
x2 = r_12 * x1 + np.random.uniform(size=n)

r_f1f2 = 0.5 # f1とf2の関連性
r_34 = 0.5 * r_f1f2
x3 = np.random.normal(size=n)
x4 = r_34 * x3 + np.random.uniform(size=n)

data = pd.DataFrame(dict(x1=x1, x2=x2, x3=x3, x4=x4))

f1の分散は0に固定する(誤差項を想定せず、単なる重み付き和による合成変数ということ)

※このような定数に固定した母数は**固定母数(fixed parameter)**という

import semopy
desc = """
f1 ~ x1 + x2
f2 =~ x3 + x4
f1 =~ f2
f1 ~~ 0*f1

f2 ~~ f2
x1 ~~ x1
x2 ~~ x2
x3 ~~ x3
x4 ~~ x4

x1 ~~ x2
x3 ~~ x4
"""
model = semopy.Model(desc)
model.fit(data)
model.inspect(std_est=True).round(2)
lval op rval Estimate Est. Std Std. Err z-value p-value
0 f1 ~ x1 -0.03 -0.71 0.023718 -1.1484 0.250803
1 f1 ~ x2 -0.06 -0.48 0.057586 -1.001833 0.316424
2 f2 ~ f1 1.00 0.12 - - -
3 x3 ~ f2 1.00 0.33 - - -
4 x4 ~ f2 -0.50 -0.44 0.638508 -0.783489 0.43334
5 f1 ~~ f1 0.00 0.00 - - -
6 f2 ~~ f2 0.10 0.99 468442.904933 0.0 1.0
7 x1 ~~ x1 0.97 1.00 0.043569 22.36068 0.0
8 x1 ~~ x2 0.12 0.38 0.010516 11.231212 0.0
9 x2 ~~ x2 0.10 1.00 0.004436 22.36068 0.0
10 x3 ~~ x3 0.82 0.89 468442.904933 0.000002 0.999999
11 x3 ~~ x4 0.27 0.77 234345.054399 0.000001 0.999999
12 x4 ~~ x4 0.11 0.81 117234.360779 0.000001 0.999999
../../_images/d2ef574e33b705491a4a9f8fe922f98adce54110ef193293940df01e026bb823.svg

PLS RegressionとSEMにおける「PLS Model」は違うもの

PLS, CCAはscikit-learnにも実装があり、一見同様のものに見える

sklearn.cross_decomposition.PLSRegression — scikit-learn 1.3.2 documentation

しかし、これは違うもの。

モデル構造の違い:

  • SEMにおけるPLSモデル:合成変数で別の潜在変数を説明する

  • PLS回帰:合成変数で観測変数を説明する(次元削減してからOLSにかける「主成分回帰」に近い)

アルゴリズムの違い:

  • PLSモデル:SEMなので最尤推定などを使う

  • PLS回帰:非線形反復部分最小二乗法(Nonlinear Iterative Partial Least Squares: NIPALS)

参考:

推定結果も違う:

from sklearn.cross_decomposition import PLSRegression
X = data[["x1", "x2"]]
Y = data[["x3", "x4"]]
pls = PLSRegression(n_components=1)
pls.fit(X, Y)
>>> pls.coef_
array([[-0.02380083, -0.02041537],
       [ 0.01237008,  0.01061055]])

関連文献#

Lohmöller, J. B. (1989). The Basic and the Extended PLS Method. Latent Variable Path Modeling with Partial Least Squares, 27-61.