sem_lavaanパッケージ

lavaanパッケージ gawk graphviz

(参考)
名城大学人間学部神谷研究室
(参考図書) 共分散構造分析[R編] 東京図書

lavaanパッケージでgraphをdotファイルに書き出す。

手順

  1. lavaan:::parameterEstimates関数を用いてグラフ作成に必要な材料を得る。
  2. その材料でdata.frameを作成、作業ディレクトリに保存。
  3. gawkで保存したファイルを加工し、dotファイルとして保存。
    エディタで手直し。
  4. pngファイルに変換。

OSはlinux(zorinOS)

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

(準備) lavaan_graphviz.awkファイルを作業フォルダに置いておく。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
library(lavaan)
#library(semPlot)
#library(qgraph)
#blue backs「原因をさぐる統計学」p.88 データ
data <- read.table("http://wwwhum.meijo-u.ac.jp/labs/hh002/r/rfile/gan.csv", header=TRUE, sep=",", na.strings="NA", dec=".",
strip.white=TRUE)
names(data)<-c("総熱量","肉類","乳製品","酒類","大腸ガン","直腸ガン")
soukan<-cor(data)
#多重指標モデル
cancermodel <- '
#潜在変数の定義
洋食傾向 =~ 総熱量 + 肉類 + 乳製品 + 酒類
消化管ガン =~ 大腸ガン + 直腸ガン
#回帰
消化管ガン ~ 洋食傾向'
fit <- lavaan:::sem(cancermodel, sample.cov=soukan, sample.nobs=nrow(data))
summary(fit, standardized=TRUE)
#semPaths(fit, "std", rotation = 2, edge.label.cex = 1.0, exoVar = FALSE)
#qgraph(fit,edge.labels=T,layout="tree",vsize.man=6,vsize.lat=8,fade=F,gray=F)

lavaan (0.5-17) converged normally after 24 iterations

Number of observations 47

Estimator ML
Minimum Function Test Statistic 47.937
Degrees of freedom 8
P-value (Chi-square) 0.000

Parameter estimates:

Information Expected
Standard Errors Standard

Estimate Std.err Z-value P(>|z|) Std.lv Std.all
Latent variables:
洋食傾向 =~
総熱量 1.000 0.894 0.904
肉類 0.983 0.108 9.122 0.000 0.879 0.889
乳製品 0.797 0.131 6.109 0.000 0.713 0.721
酒類 0.686 0.141 4.873 0.000 0.613 0.620
消化管ガン =~
大腸ガン 1.000 0.886 0.896
直腸ガン 0.937 0.119 7.863 0.000 0.831 0.840

Regressions:
消化管ガン ~
洋食傾向 0.972 0.111 8.790 0.000 0.981 0.981

Variances:
総熱量 0.180 0.054 0.180 0.184
肉類 0.206 0.058 0.206 0.210
乳製品 0.471 0.105 0.471 0.481
酒類 0.603 0.130 0.603 0.616
大腸ガン 0.193 0.065 0.193 0.197
直腸ガン 0.288 0.075 0.288 0.295
洋食傾向 0.799 0.202 1.000 1.000
消化管ガン 0.030 0.057 0.039 0.039

1
2
3
4
pars <- parameterEstimates(fit, standardized = TRUE)
g<-data.frame(pars$lhs,pars$op,pars$rhs," [label=",signif(pars$std.all,digits=2),"];")
write.table(g,"out",sep=" ",col.names=FALSE,row.names=FALSE,quote=FALSE, na="")
system( 'gawk -f "lavaan_graphviz.awk" "out">out.dot')

out.dotをxDotなどのdot viewerでみると

エディタでout.dotを加工します。

center=1; の後に

“洋食傾向” [shape=ellipse]
“消化管ガン” [shape=ellipse]
を書き加える。

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

MIMICモデル
1
2
3
4
5
6
cancermimicmodel <- '
消化管ガン ~ 総熱量 + 肉類 + 乳製品 + 酒類
消化管ガン =~ 大腸ガン + 直腸ガン
'
fit <- sem(cancermimicmodel, sample.cov=soukan, sample.nobs=nrow(data))
summary(fit, standardized=TRUE)

lavaan (0.5-17) converged normally after 23 iterations

Number of observations 47

Estimator ML
Minimum Function Test Statistic 17.719
Degrees of freedom 3
P-value (Chi-square) 0.001

Parameter estimates:

Information Expected
Standard Errors Standard

Estimate Std.err Z-value P(>|z|) Std.lv Std.all
Latent variables:
消化管ガン =~
大腸ガン 1.000 0.900 0.909
直腸ガン 0.910 0.113 8.044 0.000 0.818 0.827

Regressions:
消化管ガン ~
総熱量 0.301 0.133 2.268 0.023 0.335 0.331
肉類 0.588 0.109 5.379 0.000 0.654 0.647
乳製品 -0.122 0.106 -1.143 0.253 -0.135 -0.134
酒類 0.185 0.089 2.076 0.038 0.206 0.204

Variances:
大腸ガン 0.169 0.058 0.169 0.173
直腸ガン 0.309 0.074 0.309 0.316
消化管ガン 0.063 0.048 0.078 0.078

dotファイルの作成手順は上と同じ

center=1; の後に

{rank=min “総熱量” “肉類” “乳製品” “酒類”}
{rank=max “大腸ガン” “直腸ガン”}
“消化管ガン” [shape=ellipse]
を書き加える。

rankdir=TB; をrankdir=LR; に変更

“総熱量” ->”総熱量”[label=”1”,dir=”both”];
“肉類” ->”肉類”[label=”1”,dir=”both”];
“乳製品” ->”乳製品”[label=”1”,dir=”both”];
“酒類” ->”酒類”[label=”1”,dir=”both”];
を表示しない

PLSモデル
1
2
3
4
5
6
7
8
PLS_model<-'
洋食傾向 ~ 総熱量 + 肉類 + 乳製品 + 酒類
消化管ガン =~ 大腸ガン + 直腸ガン
洋食傾向 =~ 消化管ガン
洋食傾向 ~~ 0*洋食傾向
消化管ガン ~~ 消化管ガン'
fit <- sem(PLS_model, sample.cov=soukan, sample.nobs=nrow(data))
summary(fit, standardized=TRUE)

lavaan (0.5-17) converged normally after 23 iterations

Number of observations 47

Estimator ML
Minimum Function Test Statistic 17.719
Degrees of freedom 3
P-value (Chi-square) 0.001

Parameter estimates:

Information Expected
Standard Errors Standard

Estimate Std.err Z-value P(>|z|) Std.lv Std.all
Latent variables:
消化管ガン =~
大腸ガン 1.000 0.900 0.909
直腸ガン 0.910 0.113 8.044 0.000 0.818 0.827
洋食傾向 =~
消化管ガン 1.000 0.960 0.960

Regressions:
洋食傾向 ~
総熱量 0.301 0.133 2.268 0.023 0.349 0.345
肉類 0.588 0.109 5.379 0.000 0.681 0.674
乳製品 -0.122 0.106 -1.143 0.253 -0.141 -0.139
酒類 0.185 0.089 2.076 0.038 0.214 0.212

Variances:
洋食傾向 0.000 0.000 0.000
消化管ガン 0.063 0.048 0.078 0.078
大腸ガン 0.169 0.058 0.169 0.173
直腸ガン 0.309 0.074 0.309 0.316

dotファイルの作成手順は上と同じ

center=1; の後に

{rank=min “総熱量” “肉類” “乳製品” “酒類”}
{rank=max “大腸ガン” “直腸ガン”}
“洋食傾向” [shape=ellipse]
“消化管ガン” [shape=ellipse]
を書き加える。

rankdir=TB; をrankdir=LR; に変更

“総熱量” ->”総熱量”[label=”1”,dir=”both”];
“肉類” ->”肉類”[label=”1”,dir=”both”];
“乳製品” ->”乳製品”[label=”1”,dir=”both”];
“酒類” ->”酒類”[label=”1”,dir=”both”];
“洋食傾向” ->”洋食傾向”[label=”0”,dir=”both”];
を表示しない