共分散行列を利用2

lavaanパッケージ gawk graphviz

(参考)blue backs「原因をさぐる統計学」

OSはlinux(zorinOS)
windowsではlavaan:::sem使用時に変数名が日本語だとエラーになりました。

(準備)「因子分析&確証的因子分析」にあるmakeawk関数を読み込んでおく。

「原因をさぐる統計学」p.204 p.243図表 補-8

産業化と民主化の因果モデル

母数に等価の制約を置く

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
library(lavaan)
#Sample Size は 75
#本では「標準化された母数の値が等しい」という制約だが、
#ここでは「標準化される前の母数の値が等しい」という制約で行う。
#この方が一般的とのこと(p.206)
mat<-'
0.54
0.99 2.28
0.82 1.81 1.98
0.73 1.27 0.91 6.89
0.62 1.49 1.17 6.25 15.58
0.79 1.55 1.04 5.84 5.84 10.76
1.08 2.06 1.58 5.06 5.60 4.94 6.83
0.85 1.81 1.57 5.75 9.39 4.73 4.987 11.38
0.94 2.00 1.63 5.81 7.54 7.01 5.82 6.75 10.80
'
wheaton.cov <- getCov(mat,names=c("x1","x2","x3","x4","x5","x6","x7","x8","x9"))
model<-'
F1=~x1+x2+x3
F2=~x4+a*x5+b*x6
F3=~x7+a*x8+b*x9
F2~F1
F3~F1+F2
x4~~c*x4
x7~~c*x7
x4~~x7
x5~~d*x5
x8~~d*x8
x5~~x8
x6~~e*x6
x9~~e*x9
x6~~x9
'
fit <- lavaan:::sem(model, sample.cov=wheaton.cov, sample.nobs=75)
summary(fit, standardized=TRUE)
latent<-c("F1","F2","F3")
makeawk(latent)
pars <- parameterEstimates(fit) #, standardized = TRUE
g<-data.frame(pars$lhs,pars$op,pars$rhs," [label=",signif(pars$est,digits=3),"];")
#非標準化推定値。値は共分散
write.table(g,"out",sep=" ",col.names=FALSE,row.names=FALSE,quote=FALSE, na="")
system( 'gawk -f "lavaan_dot.awk" "out">out.dot')

かなり手を入れないと(絶対位置指定を指定する。ラベルをつける。等々)きれいな図にはなりません。

1
system('neato -Tpng out.dot -o cov01.png')

cov01.dot