井出草平の研究ノート

構造方程式モデリングによる構成概念の因果関係[R]

今回扱うのは構造方程式によって作成した概念の因果を検証するモデルである。

f:id:iDES:20200721004606p:plain

データ

lavaanに同梱されているPoliticalDemocracyを使用する。詳細はこちらのエントリ

y1 1960年の報道の自由に関する専門家の評価
y2 1960年の政治的反対運動の自由
y3 1960年の選挙の公平性
y4 1960年の選出立法府の有効性
y5 1965年の報道の自由に関する専門家の評価
y6 1965年の政治的反対運動の自由
y7 1965年の選挙の公平性について
Y8 1965年の選出立法府の有効性
x1 1960年の一人当たり国民総生産(GNP)
x2 1960年の一人当たりの無生物エネルギー消費量
x3 1960年の産業界における労働力の割合む

経済発展が民主化を促進するというモデルの検討を行う。

モデル

library(lavaan)
model <- ' f1 =~ x1+x2+x3
           f2 =~ y1+a*y2+b*y3+c*y4
           f3 =~ y5+a*y6+b*y7+c*y8
           f2 ~  f1
           f3 ~  f1+f2
           y1 ~~  d*y1 + y5
           y2 ~~  e*y2 + y6
           y3 ~~  f*y3 + y7
           y4 ~~  g*y4 + y8
           y5 ~~  d*y5
           y6 ~~  e*y6
           y7 ~~  h*y7
           y8 ~~  i*y8 '

y1-y4とy5-y8はそれぞれ同じ項目である。1960年に計測したものと、1965年に計測したもので計測時点に違いがある。 同じ項目であるy1がy5は、時点が変わっても大きく変わらないと推測できるため、ここではそれぞれ同じ影響指標で推定される「等値制約」で推定している。

f2 =~ y1+a*y2+b*y3+c*y4
f3 =~ y5+a*y6+b*y7+c*y8

y2とy6は同じ項目なためa*という記号を付け、同じようにbとcをつける。

モデルの実行

fit <- sem(model, data=PoliticalDemocracy)
summary(fit,fit.measures=T,standardized=T)

時点間の相関

等値制約を課した民主化の程度の4項目の誤差の相関は次のようになっている。

Covariances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
 .y1 ~~                                                                 
   .y5                0.869    0.364    2.386    0.017    0.869    0.364
 .y2 ~~                                                                 
   .y6                1.937    0.785    2.468    0.014    1.937    0.356
 .y3 ~~                                                                 
   .y7                1.129    0.627    1.801    0.072    1.129    0.252
 .y4 ~~                                                                 
   .y8                0.161    0.471    0.343    0.732    0.161    0.063

y1 ~~ y5: 報道の自由に関する専門家の評価
y2 ~~ y6: 政治的反対運動の自由
y3 ~~ y7: 選挙の公平性
y4 ~~ y8: 選出立法府の有効性

'y4 ~~ y8'は0.063と低く、他の3項目は0.2-0.4の間にあり、y1 ~~ y5の報道の自由民主化の程度の予測として使用できることがわかる。
ちなみに、パス図に出力されている値は右から2列目の標準化されていない共変量である。
どうでもよいことだが、semPlotの中のコードをwhatLabels="stand"にすると相関係数を出力できる。

結果

lavaan 0.6-6 ended normally after 57 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of free parameters                         29
  Number of equality constraints                     5
                                                      
  Number of observations                            75
                                                      
Model Test User Model:
                                                      
  Test statistic                                57.739
  Degrees of freedom                                42
  P-value (Chi-square)                           0.054

Model Test Baseline Model:

  Test statistic                               730.654
  Degrees of freedom                                55
  P-value                                        0.000

User Model versus Baseline Model:

  Comparative Fit Index (CFI)                    0.977
  Tucker-Lewis Index (TLI)                       0.969

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)              -1557.598
  Loglikelihood unrestricted model (H1)      -1528.728
                                                      
  Akaike (AIC)                                3163.196
  Bayesian (BIC)                              3218.815
  Sample-size adjusted Bayesian (BIC)         3143.174

Root Mean Square Error of Approximation:

  RMSEA                                          0.071
  90 Percent confidence interval - lower         0.000
  90 Percent confidence interval - upper         0.112
  P-value RMSEA <= 0.05                          0.222

Standardized Root Mean Square Residual:

  SRMR                                           0.067

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
  f1 =~                                                                 
    x1                1.000                               0.670    0.920
    x2                2.179    0.138   15.743    0.000    1.460    0.973
    x3                1.818    0.152   11.973    0.000    1.218    0.872
  f2 =~                                                                 
    y1                1.000                               2.127    0.809
    y2         (a)    1.345    0.151    8.926    0.000    2.862    0.775
    y3         (b)    1.205    0.133    9.066    0.000    2.563    0.739
    y4         (c)    1.367    0.128   10.700    0.000    2.908    0.881
  f3 =~                                                                 
    y5                1.000                               2.056    0.799
    y6         (a)    1.345    0.151    8.926    0.000    2.766    0.765
    y7         (b)    1.205    0.133    9.066    0.000    2.477    0.791
    y8         (c)    1.367    0.128   10.700    0.000    2.810    0.864

Regressions:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  f2 ~                                                                  
    f1                1.420    0.379    3.752    0.000    0.447    0.447
  f3 ~                                                                  
    f1                0.563    0.210    2.676    0.007    0.184    0.184
    f2                0.835    0.069   12.060    0.000    0.864    0.864

Covariances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
 .y1 ~~                                                                 
   .y5                0.869    0.364    2.386    0.017    0.869    0.364
 .y2 ~~                                                                 
   .y6                1.937    0.785    2.468    0.014    1.937    0.356
 .y3 ~~                                                                 
   .y7                1.129    0.627    1.801    0.072    1.129    0.252
 .y4 ~~                                                                 
   .y8                0.161    0.471    0.343    0.732    0.161    0.063

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .y1         (d)    2.389    0.368    6.488    0.000    2.389    0.346
   .y2         (e)    5.436    0.791    6.869    0.000    5.436    0.399
   .y3         (f)    5.457    1.012    5.394    0.000    5.457    0.454
   .y4         (g)    2.448    0.637    3.845    0.000    2.448    0.225
   .y5         (d)    2.389    0.368    6.488    0.000    2.389    0.361
   .y6         (e)    5.436    0.791    6.869    0.000    5.436    0.415
   .y7         (h)    3.666    0.708    5.180    0.000    3.666    0.374
   .y8         (i)    2.680    0.629    4.258    0.000    2.680    0.253
   .x1                0.081    0.019    4.173    0.000    0.081    0.153
   .x2                0.121    0.070    1.730    0.084    0.121    0.054
   .x3                0.467    0.090    5.175    0.000    0.467    0.239
    f1                0.449    0.087    5.175    0.000    1.000    1.000
   .f2                3.619    0.840    4.310    0.000    0.800    0.800
   .f3                0.332    0.189    1.758    0.079    0.079    0.079

プロット

パス図の出力のコードは以下。

library(semPlot)
semPaths(fit,layout="tree",whatLabels="est", 
style="lisrel",sizeMan=7,sizeLat=10,sizeLat2=8,
edge.color="black",curve=1,curvePivot=F,edge.label.cex=1.2)