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

二次因子分析モデル

下記のようなモデルである。

f:id:iDES:20200612174113p:plain

因子分析モデルではモデルの識別のため以下の3つの方法があり、どれかの方法を選択しなければならない。

  1. 各構成概念について複数の観測変数あるいは下位の因子に刺さるパス(因子負荷量)のうち任意の1つを1に固定する
  2. 当該構成概念が外生変数ならばその分散を1に固定する
  3. 当該構成概念が内生変数ならばその残差の分散を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)