制約条件の記号
記号 | 記述例 | 意味 |
---|---|---|
== | 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
制約に沿った値がでている。