PLS(Partial Least Squares)モデルについて。日本語にすると部分的最小二乗回帰である。
PLSモデルは,複数の観測変数によって純粋に指標化された新たな変数が,別の複数の観測変数の背後に仮定される構成概念へ及ぼす影響の強さについて検討するモデルであると捉えることができます。(豊田秀樹『共分散構造分析[R編]』p.55)
前回と同じくlavaanパッケージに同梱されているPoliticalDemocracyのデータを使用してPLSモデルをlavaanパッケージで推定してみたい。
モデル
末尾のsemPlotパッケージで作成したパス図を先に示す。

1) x1-x3から回帰分析を行いf1を作成する。
- x1 1960年の一人当たり国民総生産(GNP)
- x2 1960年の一人当たりの無生物エネルギー消費量
- x3 1960年の産業界における労働力の割合
2) y1-y4からf1という潜在変数を作成する。
3) f1からf2への影響を見る。
コード
パッケージの読み込み
library(lavaan)
モデルの構築
model <- '
# measurement model
f1 ~ x1 + x2 + x3 # regression
f2 =~ y1 + y2 + y3 + y4 # measurement model
f1 =~ f2
f1 ~~ 0*f1
f2 ~~ f2'
f1~~0*f1は、の分散を0に固定することを表している。特定の値をとるようにあらかじめ指定された母数を固定母数(fixed paramteter)という。固定母数は
*の前に固定したい値を示すことで特定される。ここでは、因子の分散を0に固定することで、当該因子に誤差を仮定しないことを表現している。
fit <- sem(model=model, data=PoliticalDemocracy, estimator="ML") summary(fit, standardized=TRUE) # 標準化
結果。
lavaan 0.6-5 ended normally after 34 iterations
Estimator ML
Optimization method NLMINB
Number of free parameters 11
Number of observations 75
Model Test User Model:
Test statistic 22.240
Degrees of freedom 11
P-value (Chi-square) 0.023
Parameter Estimates:
Information Expected
Information saturated (h1) model Structured
Standard errors Standard
Latent Variables:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
f2 =~
y1 1.000 2.108 0.809
y2 1.400 0.200 6.994 0.000 2.951 0.753
y3 1.093 0.169 6.471 0.000 2.305 0.707
y4 1.413 0.168 8.405 0.000 2.978 0.895
f1 =~
f2 1.000 0.471 0.471
Regressions:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
f1 ~
x1 1.097 0.725 1.513 0.130 1.104 0.804
x2 0.237 0.399 0.595 0.552 0.239 0.359
x3 -0.120 0.319 -0.376 0.707 -0.121 -0.168
Variances:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
.f1 0.000 0.000 0.000
.f2 3.458 0.864 4.001 0.000 0.778 0.778
.y1 2.343 0.509 4.600 0.000 2.343 0.345
.y2 6.665 1.303 5.116 0.000 6.665 0.434
.y3 5.309 0.989 5.366 0.000 5.309 0.500
.y4 2.198 0.719 3.058 0.002 2.198 0.199
パス図は下記のコードで出力した。rotationというオプションで90度回転ができるようだ。edge.label.cexというオプションで推定値の文字の大きさも調整できるようだ。いろいろ調整すればsemPlotパッケージでの作図も悪くないのかもしれない。
library(semPlot)
semPaths(fit, layout = "tree", shapeLat="ellipse", whatLabels = "stand",
nDigits=3, shapeMan="square", sizeMan =8,
sizeLat =8, sizeLat2 =8, style = "lisrel",
residScale=12, curve=2, optimizeLatRes=T,edge.color="black",
rotation = 2, edge.label.cex=1)