今回も因子分析ですが,前回と違って 確証的因子分析(Confirmatory Factor Analysis,CFA) ,というものをやってみましょう。

前回はEFA

前回の因子分析は,探索的因子分析(Exploratory Factor Analysis,EFA) と言われます。これは,事前に因子の数や因子構造がわかっていなかったため,手探りで=探索的に,因子分析をやってみた,ということです。EFAでは,

1.因子数を探して自分で決めて, 2.どの項目がまとまるのかを調べて(その時に分かりにくかったら回転をかけるなどして見やすくして), 3.まとまりを見つけては「これだ」と名前をつける,

という手順が必要でした。

今回はCFA

今回は,事前に因子の数や構造に仮定があります。この仮定は,理論的に導かれるものであったり,先行研究から考えられるものであったりします。

いずれにせよ,この項目はこれを測定している,あの項目はこれを測定している,という事前の モデル がある場合です。

例えばBIG 5の場合はしっかりした因子構造の仮定に基づき,尺度化されています。

library(psych)
data(bfi)
help(bfi)

今回はこのモデルに沿った因子分析をしてみよう,というのです。

lavaanパッケージを使う

実践にあたってはlavaanパッケージを使用します。持っていない人はインストールしておいてください。

lavaanとはLAtent VAriable ANalysis,つまり「潜在変数分析」という意味です。

library(lavaan)
## This is lavaan 0.5-16
## lavaan is BETA software! Please report any bugs.

このパッケージの使い方は,複数行からなるモデルとデータを与えて,分析させるという方法をとります。 やってみましょう。

model <- '
A =~ A1 + A2 + A3 + A4 + A5
E =~ E1 + E2 + E3 + E4 + E5
O =~ O1 + O2 + O3 + O4 + O5
N =~ N1 + N2 + N3 + N4 + N5
C =~ C1 + C2 + C3 + C4 + C5
'

result.fit <- cfa(model,data=bfi)
summary(result.fit,standardized=T)
## lavaan (0.5-16) converged normally after  55 iterations
## 
##                                                   Used       Total
##   Number of observations                          2436        2800
## 
##   Estimator                                         ML
##   Minimum Function Test Statistic             4165.467
##   Degrees of freedom                               265
##   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:
##   A =~
##     A1                1.000                               0.484    0.344
##     A2               -1.579    0.108  -14.650    0.000   -0.764   -0.648
##     A3               -2.030    0.134  -15.093    0.000   -0.983   -0.749
##     A4               -1.564    0.115  -13.616    0.000   -0.757   -0.510
##     A5               -1.804    0.121  -14.852    0.000   -0.873   -0.687
##   E =~
##     E1                1.000                               0.920    0.564
##     E2                1.226    0.051   23.899    0.000    1.128    0.699
##     E3               -0.921    0.041  -22.431    0.000   -0.847   -0.627
##     E4               -1.121    0.047  -23.977    0.000   -1.031   -0.703
##     E5               -0.808    0.039  -20.648    0.000   -0.743   -0.553
##   O =~
##     O1                1.000                               0.635    0.564
##     O2               -1.020    0.068  -14.962    0.000   -0.648   -0.418
##     O3                1.373    0.072   18.942    0.000    0.872    0.724
##     O4                0.437    0.048    9.160    0.000    0.277    0.233
##     O5               -0.960    0.060  -16.056    0.000   -0.610   -0.461
##   N =~
##     N1                1.000                               1.300    0.825
##     N2                0.947    0.024   39.899    0.000    1.230    0.803
##     N3                0.884    0.025   35.919    0.000    1.149    0.721
##     N4                0.692    0.025   27.753    0.000    0.899    0.573
##     N5                0.628    0.026   24.027    0.000    0.816    0.503
##   C =~
##     C1                1.000                               0.680    0.551
##     C2                1.148    0.057   20.152    0.000    0.781    0.592
##     C3                1.036    0.054   19.172    0.000    0.705    0.546
##     C4               -1.421    0.065  -21.924    0.000   -0.967   -0.702
##     C5               -1.489    0.072  -20.694    0.000   -1.012   -0.620
## 
## Covariances:
##   A ~~
##     E                 0.304    0.025   12.293    0.000    0.683    0.683
##     O                -0.093    0.011   -8.446    0.000   -0.303   -0.303
##     N                 0.141    0.018    7.712    0.000    0.223    0.223
##     C                -0.110    0.012   -9.254    0.000   -0.334   -0.334
##   E ~~
##     O                -0.265    0.021  -12.347    0.000   -0.453   -0.453
##     N                 0.292    0.032    9.131    0.000    0.244    0.244
##     C                -0.224    0.020  -11.121    0.000   -0.357   -0.357
##   O ~~
##     N                -0.093    0.022   -4.138    0.000   -0.112   -0.112
##     C                 0.130    0.014    9.190    0.000    0.301    0.301
##   N ~~
##     C                -0.250    0.025  -10.117    0.000   -0.283   -0.283
## 
## Variances:
##     A1                1.745    0.052                      1.745    0.882
##     A2                0.807    0.028                      0.807    0.580
##     A3                0.754    0.032                      0.754    0.438
##     A4                1.632    0.051                      1.632    0.740
##     A5                0.852    0.032                      0.852    0.528
##     E1                1.814    0.058                      1.814    0.682
##     E2                1.332    0.049                      1.332    0.512
##     E3                1.108    0.038                      1.108    0.607
##     E4                1.088    0.041                      1.088    0.506
##     E5                1.251    0.040                      1.251    0.694
##     O1                0.865    0.032                      0.865    0.682
##     O2                1.990    0.063                      1.990    0.826
##     O3                0.691    0.039                      0.691    0.476
##     O4                1.346    0.040                      1.346    0.946
##     O5                1.380    0.045                      1.380    0.788
##     N1                0.793    0.037                      0.793    0.320
##     N2                0.836    0.036                      0.836    0.356
##     N3                1.222    0.043                      1.222    0.481
##     N4                1.654    0.052                      1.654    0.672
##     N5                1.969    0.060                      1.969    0.747
##     C1                1.063    0.035                      1.063    0.697
##     C2                1.130    0.039                      1.130    0.650
##     C3                1.170    0.039                      1.170    0.702
##     C4                0.960    0.040                      0.960    0.507
##     C5                1.640    0.059                      1.640    0.615
##     A                 0.234    0.030                      1.000    1.000
##     E                 0.846    0.062                      1.000    1.000
##     O                 0.404    0.033                      1.000    1.000
##     N                 1.689    0.073                      1.000    1.000
##     C                 0.463    0.036                      1.000    1.000

多くの結果が出てきます。読み方に注意しつつ,探索的因子分析の結果との共通点・相違点をよく確認しておきましょう。

モデルの適合度

事前に仮説=モデルをもってデータに当てはめるわけですから,仮説が間違っていたらうまくいきません。 仮説とデータの相性が良かったのかどうか,これを確認するのが 適合度 です。 適合度は数字として出てきます。複数の適合度指標があり,総合的に判断します。

fitMeasures(result.fit)
##                fmin               chisq                  df 
##               0.855            4165.467             265.000 
##              pvalue      baseline.chisq         baseline.df 
##               0.000           18222.116             300.000 
##     baseline.pvalue                 cfi                 tli 
##               0.000               0.782               0.754 
##                nnfi                 rfi                 nfi 
##               0.754               0.741               0.771 
##                pnfi                 ifi                 rni 
##               0.681               0.783               0.782 
##                logl   unrestricted.logl                npar 
##          -99840.238          -97757.504              60.000 
##                 aic                 bic              ntotal 
##          199800.476          200148.363            2436.000 
##                bic2               rmsea      rmsea.ci.lower 
##          199957.729               0.078               0.076 
##      rmsea.ci.upper        rmsea.pvalue                 rmr 
##               0.080               0.000               0.157 
##          rmr_nomean                srmr        srmr_bentler 
##               0.157               0.075               0.075 
## srmr_bentler_nomean         srmr_bollen  srmr_bollen_nomean 
##               0.075               0.075               0.075 
##          srmr_mplus   srmr_mplus_nomean               cn_05 
##               0.075               0.075             178.764 
##               cn_01                 gfi                agfi 
##             189.003               0.862               0.830 
##                pgfi                 mfi                ecvi 
##               0.703               0.449               1.759

有名なのは,GFI.AGFI,RMSEA,CFI,AICなどです。 それぞれを個別に呼び出すこともできます。

fitMeasures(result.fit,"AGFI")
## agfi 
## 0.83
fitMeasures(result.fit,c("GFI","RMSEA"))
##   gfi rmsea 
## 0.862 0.078

あるいは,結果と合わせて出力することもできます。こちらの方が一般的で見やすいですね。

summary(result.fit,standardized=T,fit.measures=T)
## lavaan (0.5-16) converged normally after  55 iterations
## 
##                                                   Used       Total
##   Number of observations                          2436        2800
## 
##   Estimator                                         ML
##   Minimum Function Test Statistic             4165.467
##   Degrees of freedom                               265
##   P-value (Chi-square)                           0.000
## 
## Model test baseline model:
## 
##   Minimum Function Test Statistic            18222.116
##   Degrees of freedom                               300
##   P-value                                        0.000
## 
## User model versus baseline model:
## 
##   Comparative Fit Index (CFI)                    0.782
##   Tucker-Lewis Index (TLI)                       0.754
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)             -99840.238
##   Loglikelihood unrestricted model (H1)     -97757.504
## 
##   Number of free parameters                         60
##   Akaike (AIC)                              199800.476
##   Bayesian (BIC)                            200148.363
##   Sample-size adjusted Bayesian (BIC)       199957.729
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.078
##   90 Percent Confidence Interval          0.076  0.080
##   P-value RMSEA <= 0.05                          0.000
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.075
## 
## Parameter estimates:
## 
##   Information                                 Expected
##   Standard Errors                             Standard
## 
##                    Estimate  Std.err  Z-value  P(>|z|)   Std.lv  Std.all
## Latent variables:
##   A =~
##     A1                1.000                               0.484    0.344
##     A2               -1.579    0.108  -14.650    0.000   -0.764   -0.648
##     A3               -2.030    0.134  -15.093    0.000   -0.983   -0.749
##     A4               -1.564    0.115  -13.616    0.000   -0.757   -0.510
##     A5               -1.804    0.121  -14.852    0.000   -0.873   -0.687
##   E =~
##     E1                1.000                               0.920    0.564
##     E2                1.226    0.051   23.899    0.000    1.128    0.699
##     E3               -0.921    0.041  -22.431    0.000   -0.847   -0.627
##     E4               -1.121    0.047  -23.977    0.000   -1.031   -0.703
##     E5               -0.808    0.039  -20.648    0.000   -0.743   -0.553
##   O =~
##     O1                1.000                               0.635    0.564
##     O2               -1.020    0.068  -14.962    0.000   -0.648   -0.418
##     O3                1.373    0.072   18.942    0.000    0.872    0.724
##     O4                0.437    0.048    9.160    0.000    0.277    0.233
##     O5               -0.960    0.060  -16.056    0.000   -0.610   -0.461
##   N =~
##     N1                1.000                               1.300    0.825
##     N2                0.947    0.024   39.899    0.000    1.230    0.803
##     N3                0.884    0.025   35.919    0.000    1.149    0.721
##     N4                0.692    0.025   27.753    0.000    0.899    0.573
##     N5                0.628    0.026   24.027    0.000    0.816    0.503
##   C =~
##     C1                1.000                               0.680    0.551
##     C2                1.148    0.057   20.152    0.000    0.781    0.592
##     C3                1.036    0.054   19.172    0.000    0.705    0.546
##     C4               -1.421    0.065  -21.924    0.000   -0.967   -0.702
##     C5               -1.489    0.072  -20.694    0.000   -1.012   -0.620
## 
## Covariances:
##   A ~~
##     E                 0.304    0.025   12.293    0.000    0.683    0.683
##     O                -0.093    0.011   -8.446    0.000   -0.303   -0.303
##     N                 0.141    0.018    7.712    0.000    0.223    0.223
##     C                -0.110    0.012   -9.254    0.000   -0.334   -0.334
##   E ~~
##     O                -0.265    0.021  -12.347    0.000   -0.453   -0.453
##     N                 0.292    0.032    9.131    0.000    0.244    0.244
##     C                -0.224    0.020  -11.121    0.000   -0.357   -0.357
##   O ~~
##     N                -0.093    0.022   -4.138    0.000   -0.112   -0.112
##     C                 0.130    0.014    9.190    0.000    0.301    0.301
##   N ~~
##     C                -0.250    0.025  -10.117    0.000   -0.283   -0.283
## 
## Variances:
##     A1                1.745    0.052                      1.745    0.882
##     A2                0.807    0.028                      0.807    0.580
##     A3                0.754    0.032                      0.754    0.438
##     A4                1.632    0.051                      1.632    0.740
##     A5                0.852    0.032                      0.852    0.528
##     E1                1.814    0.058                      1.814    0.682
##     E2                1.332    0.049                      1.332    0.512
##     E3                1.108    0.038                      1.108    0.607
##     E4                1.088    0.041                      1.088    0.506
##     E5                1.251    0.040                      1.251    0.694
##     O1                0.865    0.032                      0.865    0.682
##     O2                1.990    0.063                      1.990    0.826
##     O3                0.691    0.039                      0.691    0.476
##     O4                1.346    0.040                      1.346    0.946
##     O5                1.380    0.045                      1.380    0.788
##     N1                0.793    0.037                      0.793    0.320
##     N2                0.836    0.036                      0.836    0.356
##     N3                1.222    0.043                      1.222    0.481
##     N4                1.654    0.052                      1.654    0.672
##     N5                1.969    0.060                      1.969    0.747
##     C1                1.063    0.035                      1.063    0.697
##     C2                1.130    0.039                      1.130    0.650
##     C3                1.170    0.039                      1.170    0.702
##     C4                0.960    0.040                      0.960    0.507
##     C5                1.640    0.059                      1.640    0.615
##     A                 0.234    0.030                      1.000    1.000
##     E                 0.846    0.062                      1.000    1.000
##     O                 0.404    0.033                      1.000    1.000
##     N                 1.689    0.073                      1.000    1.000
##     C                 0.463    0.036                      1.000    1.000

モデルの改善

適合度をよくするために,モデルを修正することも少なくありません。 一般的に,GFIやCFIは0.9以上が望ましいとされていますから,これを目指してモデルを改善していくことにします。

例えば,係数の小さかったA1やO4を外し,相関が低いところをゼロにしてみます。

model2 <- '
A =~ A2 + A3 + A4 + A5
E =~ E1 + E2 + E3 + E4 + E5
O =~ O1 + O2 + O3 + O5
N =~ N1 + N2 + N3 + N4 + N5
C =~ C1 + C2 + C3 + C4 + C5
A ~~ 0*N
E ~~ 0*N
'

result.fit2 <- cfa(model2,data=bfi)
fitMeasures(result.fit,c("GFI","AGFI","TLI","CFI","AIC","BIC"))
##       gfi      agfi       tli       cfi       aic       bic 
## 8.620e-01 8.300e-01 7.540e-01 7.820e-01 1.998e+05 2.001e+05
fitMeasures(result.fit2,c("GFI","AGFI","TLI","CFI","AIC","BIC"))
##       gfi      agfi       tli       cfi       aic       bic 
## 8.750e-01 8.450e-01 7.730e-01 8.010e-01 1.853e+05 1.856e+05

幾分改良されたようですが,まだまだ改良できるでしょうかね。

どこを改善すればよいかを算出してくれる関数もあります。modindices関数ですが,大量になるので一部だけ表示させます。

md <- modindices(result.fit2)
head(md[order(md$mi,decreasing=T),])
##   lhs op rhs    mi    epc sepc.lv sepc.all sepc.nox
## 1  N1 ~~  N2 388.0  0.849   0.849    0.351    0.351
## 2   E =~  N4 220.6  0.489   0.448    0.285    0.285
## 3  N3 ~~  N4 156.5  0.437   0.437    0.175    0.175
## 4   O =~  E3 128.1  0.638   0.401    0.297    0.297
## 5   O =~  E4 127.9 -0.680  -0.427   -0.291   -0.291
## 6   C =~  E5 126.1  0.504   0.339    0.252    0.252

これに従って,妥当なところは モデルを変更してみましょう。

model3 <- '
A =~ A2 + A3 + A4 + A5
E =~ E1 + E2 + E3 + E4 + E5
O =~ O1 + O2 + O3 + O5
N =~ N1 + N2 + N3 + N4 + N5
C =~ C1 + C2 + C3 + C4 + C5
A ~~ 0*N
E ~~ 0*N
N1 ~~ N2
N3 ~~ N4
'

result.fit3 <- cfa(model3,data=bfi)
fitMeasures(result.fit2,c("GFI","AGFI","TLI","CFI","AIC","BIC"))
##       gfi      agfi       tli       cfi       aic       bic 
## 8.750e-01 8.450e-01 7.730e-01 8.010e-01 1.853e+05 1.856e+05
fitMeasures(result.fit3,c("GFI","AGFI","TLI","CFI","AIC","BIC"))
##       gfi      agfi       tli       cfi       aic       bic 
## 8.880e-01 8.590e-01 7.920e-01 8.200e-01 1.850e+05 1.853e+05

こうして,より良いモデルに近づけていくのです。

CFAのまとめ

本日の課題