井出草平の研究ノート

lavaanの制約の構文[R]

制約条件の記号

記号 記述例 意味
== a == b aはbと同値である
< a< b aはb以下の値となる
> a>b aはb以上の値となる
:= a:=b aをbと定義する

準備

Holzinger and SwinefordのCFAモデルを簡略化して作成。

library(lavaan)
model0 <- ' visual =~ x1 + x2 + x3'
fit0 <- cfa(model0, data = HolzingerSwineford1939, orthogonal = TRUE)
summary(fit0)

結果。

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)
  visual =~                                           
    x1                1.000                           
    x2                0.778    0.141    5.532    0.000
    x3                1.107    0.214    5.173    0.000

固定母数

visual =~ 1*x1 # 因子の分散を1に固定
visual =~ 0*x1 # 因子間の相関を0に固定
visual =~ NA*x1 # 自由母数に 

デフォルトでは最初の観測変数の因子負荷が1ら固定されるが、2つ目に固定母数、1つ目は自由母数にする場合は下記のように書く。

model1 <- ' visual =~ NA*x1 + 1*x2 + x3'
fit1 <- cfa(model1, data = HolzingerSwineford1939, orthogonal = TRUE)
summary(fit1)

相対的なものだが、下記のように推定値が変化する。

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)
  visual =~                                           
    x1                1.286    0.232    5.532    0.000
    x2                1.000                           
    x3                1.424    0.275    5.167    0.000

自由母数を意味するNAを入れておかないと下記のようになる。

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)
  visual =~                                           
    x1                1.000                           
    x2                1.000                           
    x3                1.265    0.215    5.890    0.000

ラベル

ラベルは記号a-zA-Zで始まり、数字は利用できるが、単語の頭に置いてはいけない。
lavaanのチュートリアルでは下記の例が挙げられている。
同じラベルを貼ることで、簡単に等値制約を課すことができる。

model2 <- 'visual =~ x1 + v2*x2 + v2*x3'
fit2 <- cfa(model2, data = HolzingerSwineford1939, orthogonal = TRUE)
summary(fit2)

結果には意味はないが下記のようになる。

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)
  visual =~                                           
    x1                1.000                           
    x2        (v2)    0.910    0.142    6.397    0.000
    x3        (v2)    0.910    0.142    6.397    0.000

非線形の等式・不等式制約

同じくlavaanのチュートリアルでは非線形の等式・不等式制約の方法が紹介されている。

set.seed(1234)
Data <- data.frame(y = rnorm(100),
                   x1 = rnorm(100),
                   x2 = rnorm(100),
                   x3 = rnorm(100))
model3 <- ' y ~ b1*x1 + b2*x2 + b3*x3 '
fit3 <- sem(model3, data=Data)
coef(fit3)

結果は下記のようになる。

    b1     b2     b3   y~~y 
-0.052  0.084  0.139  0.970 

この回帰式に下記の2つの制約を課す。

  • b1 = (b2+b3)2
  • b1 > exp(b2+b3)
model4 <- ' # model with labeled parameters
              y ~ b1*x1 + b2*x2 + b3*x3
            # constraints
             b1 == (b2 + b3)^2
             b1 > exp(b2 + b3) '
fit4 <- sem(model4, data=Data)
coef(fit4)

結果。

    b1     b2     b3   y~~y 
 0.495 -0.405 -0.299  1.610 

制約に沿った値がでている。