lavaanパッケージを用いて二次因子分析モデルを推定する[R]
二次因子分析モデル(second order factor analysis)とは「斜交解による通常の因子分析の結果,因子聞に強い相闘が観察されたときには,それらの因子に共通して影響を与える上位の因子を想定することができます。このように,通常の因子分析における複数の因子を,さらに少数の因子で説明するモデル」のことである(豊田秀樹『共分散構造分析[R編]』p.56)。
ここではIQの基本的な概念を作成したThurstone & Thurstone (1941)の例を使ってみたい。
Thurstone, L. L., & Thurstone, T. G. (1941), Factorial studies of intelligence https://psycnet.apa.org/record/1941-03743-001
Thurstone & Thurstone (1941)の知能の構造
| Verbal Comprehension, | Word Fluency | Reasoning |
|---|---|---|
| Sentences | First.Letters | Letter.Series |
| Vocabulary | 4.Letter.Words | Pedigrees |
| Sent.Completion | Suffixes | letter.Group |
二次因子分析モデル
下記のようなモデルである。

因子分析モデルではモデルの識別のため以下の3つの方法があり、どれかの方法を選択しなければならない。
- 各構成概念について複数の観測変数あるいは下位の因子に刺さるパス(因子負荷量)のうち任意の1つを1に固定する
- 当該構成概念が外生変数ならばその分散を1に固定する
- 当該構成概念が内生変数ならばその残差の分散を1に固定する
semコマンドのデフォルトは既定値としてパスを1に固定する方法が選ばれる。
引数としてstd.lv=TRUEを入れると、外生変数である2次因子の分散および,内生変数である1次因子の残差分散を1に固定できる。
いずれの制約の置き方でも標準化解は一致する。
データの入力
library(lavaan) VCM <- ' 1 .828 1 .776 .779 1 .439 .493 .46 1 .432 .464 .425 .674 1 .447 .489 .443 .59 .541 1 .447 .432 .401 .381 .402 .288 1 .541 .537 .534 .35 .367 .32 .555 1 .38 .358 .359 .424 .446 .325 .598 .452 1' Thurstone.cov <- getCov(VCM, names = c( "Sentences", "Vocabulary", "Sent.Completion", "First.Letters", "four.Letter.Words","Suffixes", "Letter.Series","Pedigrees", "Letter.Group"))
モデルの作成
model<- 'verbal.Comprehension=~ Sentences + Vocabulary + Sent.Completion
Word.Fluency =~ First.Letters + four.Letter.Words + Suffixes
Reasoning =~ Letter.Series + Pedigrees + Letter.Group
intelligence =~ verbal.Comprehension + Word.Fluency + Reasoning'
分析
fit <- sem(model,
sample.cov = Thurstone.cov, std.lv=TRUE,
sample.nobs = 213)
summary(fit, standardized = TRUE)
結果
lavaan 0.6-6 ended normally after 36 iterations
Estimator ML
Optimization method NLMINB
Number of free parameters 21
Number of observations 213
Model Test User Model:
Test statistic 38.376
Degrees of freedom 24
P-value (Chi-square) 0.032
Parameter Estimates:
Standard errors Standard
Information Expected
Information saturated (h1) model Structured
Latent Variables:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
verbal.Comprehension =~
Sentences 0.514 0.063 8.206 0.000 0.903 0.905
Vocabulary 0.519 0.063 8.228 0.000 0.912 0.914
Sent.Completin 0.486 0.061 8.034 0.000 0.854 0.856
Word.Fluency =~
First.Letters 0.520 0.061 8.554 0.000 0.834 0.836
four.Lttr.Wrds 0.496 0.059 8.441 0.000 0.795 0.797
Suffixes 0.437 0.056 7.847 0.000 0.701 0.703
Reasoning =~
Letter.Series 0.451 0.066 6.874 0.000 0.779 0.781
Pedigrees 0.416 0.062 6.729 0.000 0.718 0.720
Letter.Group 0.407 0.061 6.664 0.000 0.702 0.703
intelligence =~
verbl.Cmprhnsn 1.444 0.256 5.641 0.000 0.822 0.822
Word.Fluency 1.254 0.211 5.946 0.000 0.782 0.782
Reasoning 1.407 0.268 5.243 0.000 0.815 0.815
Variances:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
.Sentences 0.181 0.028 6.388 0.000 0.181 0.181
.Vocabulary 0.164 0.028 5.953 0.000 0.164 0.165
.Sent.Completin 0.266 0.033 8.026 0.000 0.266 0.267
.First.Letters 0.300 0.051 5.923 0.000 0.300 0.302
.four.Lttr.Wrds 0.363 0.052 6.941 0.000 0.363 0.365
.Suffixes 0.504 0.059 8.513 0.000 0.504 0.506
.Letter.Series 0.388 0.059 6.594 0.000 0.388 0.390
.Pedigrees 0.479 0.062 7.751 0.000 0.479 0.481
.Letter.Group 0.503 0.063 7.995 0.000 0.503 0.505
.verbl.Cmprhnsn 1.000 0.324 0.324
.Word.Fluency 1.000 0.389 0.389
.Reasoning 1.000 0.336 0.336
intelligence 1.000 1.000 1.000
パス図の描画
semPlotパッケージで作図しておこう。
library(semPlot) semPaths(fit,layout="tree",whatLabels="stand", edge.color="black",sizeMan=9, edge.label.cex=0.9, shapeLat="ellipse",sizeLat=15, sizeLat2=8, style="lisrel", optimizeLatRes=T, nCharNodes=0)