[R] {lavaan}におけるモデル式の記述方法

{lavaan}を使いこなすにはモデル式を自由自在に記述できることが重要である。

モデル式は通常、回帰式の定義、潜在変数の定義、分散と共分散(共変関係)の定義、切片の定義からなる。

モデル式の記述に使用するオペレータ

以下のモデル式の記述例では変数名に命名規則を与え、xを観測変数(説明変数)、yを観測変数(目的変数)、fを潜在変数(因子)とする。

記号意味記述例
~構造方程式y1 ~ x1 + x2
~1構造方程式(切片)y1 ~1

f1 ~ 1

# 観測変数と潜在変数の切片は、構造方程式の記法において、説明変数と切片のみとする

=~測定方程式f1 =~ x1 + x2 + x3

潜在変数 =~ 指標1 + 指標2 +指標3

~~分散(残差分散)# 両辺が同一変数の時 ~~は分散を意味する

x1~~x1

~~共分散(残差共分散)# 左辺と右辺が異なる変数の時、~~は共分散を意味する

# 変数が外生変数である時~~は共分散を、内生変数である時~~は残差共分散を意味する。

y1~~y2

f1 ~~ f2

 

母数の制約の記述

理論的な必要性から、あるいは推定解を安定させる算術上の都合から、母数の制約条件を記述することがある。

実際に指定する制約としては、母数の固定化/自由化、母数にラベルをつける、等値制約、不等式制約などがある。

定数をかける、関数をかける、ラベルをつける、ラベル間の関係を記述する。

記号意味記述例
==a==baとbは等しい
>a < baはbより小さい
<a > baはbより大きい
:=a:=baをbと定義する

「変数間の関係の記述」は共分散構造分析において常に必要である。「母数の制約の記述」は必要な場合に「変数間の関係の記述」に追加することになる。

 実例と解説

因子の分散を1に固定する

f1~~1*f1

因子間の相関を0に固定する

f1~~0*f2

観測変数間に残差共分散を設定する

x1 ~~ x2

x1,x2が同一の潜在変数f1から因子負荷を受けている場合、上記の式は2つの観測変数の残差分散が共通する潜在変数によって説明できない何か別の因子の影響を受けている事を想定する。

第1の因子負荷を自由母数に、第2の因子負荷を1に固定する

f1=~NA*x1 + 1*x2 + x3

デフォルトでは第1の因子負荷が1に自動設定されるため、これを変えたい場合に使用する

パラメータに初期値を与える

f1 ~= x1+ start(0.8)*x2

特殊な関数start()を使用すると初期値を与えることができる。

パラメータに名前(ラベル)を与える

f1 =~ x1 + myLable*x2

任意の名前(但し記号a-zA-Zで始まる)のラベルをパラメータにつけることができる。上きれいではmyLabelという名前をつけている。つけたパラメータは別途、パラメータの制約条件の記述に使用することができる。

左辺の各要素に右辺の各要素を繰り返して適用する

x1 + x2 + x3 ~ 0.5*1

つまり上記は以下の記述と同じ意味である。

x1 ~ 0.5*1
x2 ~ 0.5*1
x3 ~ 0.5*1

単回帰分析を実行する

model <- "
y ~ x
y ~~ y
"

# [参考] lm()でのモデル式の記述例
# lm()と比較すると{lavaan}では明示的に誤差分散の指定(y~~y)が追加で必要であることに注意
model <- "
y ~ x
"

重回帰分析を実行する

model <- "
y ~ x1 + x2
y ~~ y
"

# [参考] lm()でのモデル式の記述例
# lm()と比較すると{lavaan}では明示的に誤差分散の指定(y~~y)が追加で必要であることに注意
# {lavaan}での単回帰モデルの記述例とも比較せよ
model <- "
y ~ x1 + x2
"

パス解析を実行する

# パス解析モデルでは構造方程式が2つ以上現れる
model <- "
y ~ x1 + x2 # 構造方程式1
x1 ~ x2     # 構造方程式2
y ~~ y
x1 ~~ x1
"

モデルに制約を追加する

パラメータに等式制約を課す(1) 同一ラベルを使用する方法

f1 =~ x1 + a * x2 + a * x3

同じラベルを持つパラメータは全て同じ値を持つよう制約される。上記例ではラベルa。

パラメータに等式制約を課す(2) equal()関数を使用する方法

f1 =~ x1 + x2 + equal("f1=~x2") * x3

f1に対するx2のパラメータと同じパラメータをx3に課すの意味。

パラメータに非線形の等式・不等式制約を課す

y1 =~ b1*x1 + b2*x2 + b3*x3
# 制約
b1 == (b2+b3)^2
b1 > exp(b2+b3)

平均共分散構造分析を行う

平均(構造)を導入する

f1 =~ x1 + x2 + x3
x1 ~ 1
x2 ~ 1
x3 ~ 1

切片式は 変数 ~ 1で記述する。

平均を導入しつつ、上記の煩雑な記載を避けるにはsem()、cfa()ではmeanstructure=TRUEという引数を指定できる。但しこの方法では平均値の固定はできない。デフォルトではsem()とcfa()は潜在変数の切片を0に設定する。

平均構造を導入するとモデルの当てはめ結果にIntercepts:という出力が追加される。

平均(構造)を導入し平均値を固定する

f1 =~ x1 + x2 + x3
f2 =~ x4 + x5 + x6
# 切片に固定値を設定する
x1 + x2 + x3 + x4 ~ 0.5*1

切片の式では、左辺の各要素に右辺を繰り返して適用している。

多母集団分析を行う

多母集団分析を行うためのモデル式は、通常の共分散構造分析のモデル式と同じものでよい。{lavaan}で多母集団分析を行うためには、cfa()、sem()の呼び出しにおいて、データセット内のグループ変数の名前を引数groupに与えればよい。

cfa(モデル式、データフレーム、group="グループ変数名")

パラメータを固定したり、初期値を与える場合、前方乗算方式を使用する。但し1つの数の引数ではなく、各母集団に対応するベクトルで与える。ベクトルではなく1つの数で与えると、その数がベクトルとして暗黙の内に拡張され、全ての母集団に適用されるので注意が必要である。(これはラベルにはあてはまらない、ラベルの場合、等式制約をするには明示的にそう書く必要がある)

以下は2母集団データセットに対するモデル式の例である。

visual =~ x1 + 0.5*x2 + c(0.6,0.8)*x3
textual =~ x4 + start(c(1,2,0.6))*x5 + a*x6
speed ~= c(a1,a1)*x7 + x8 * x9

x2の因子負荷量は2母集団共通で0.5に固定している。

x3の因子負荷量は母集団1に対して0.6、母集団2に対して0.8に固定している。

x5の因子負荷量の推定初期値として母集団1に対して1.2、母集団2に対して0.6を与えている。

x6の母集団1のパラメータに対してのみラベルaを与えている(母集団2には何も与えていない)

x7の母集団1,2に共通してラベルa1を与え等式制約を課している。

グループ等号制約を与える

パラメータの集合全体(例えば全ての因子負荷量や全ての切片など)が等しいという制約を課すにはラベルを1つ1つ指定してもよいが、cfa()またはsem()のgroup.equal引数を使用することでより簡便に指定することができる。

cfa(モデル式、データフレーム、group="グループ変数名", group.equal=c("等号制約を与えるグループ名"))

グループ等号制約を課すことのできるキーワード

“loadings” : 因子負荷量

“intercepts”: 観測変数の切片

“means” : 潜在変数の切片/平均

“residuals” : 観測変数の残差分析

“residuals.covariances” : 観測変数の残差共分散

“lv.variances” : 潜在変数の(残差)分散

“lv.covariances” : 潜在変数の(残差)共分散

“regressions” : モデルの全ての回帰係数

cfa()またはsem()のgroup.equal引数に加えてgroup.partial引数をを使用することで、母集団全体で等号制約をかけながら一部のみ自由パラメータとして除外することができる。

cfa(モデル式、data=データフレーム, group=”グループ変数”, group.equal=c(“loadings”,”intercepts”), group.partial=c(“visual=~x2″,”x2~x1”)

コメント