共分散構造分析は、構成概念を定量化し、因果関係を分析します。主な適用場面として、ブランド力の構造を把握したり、消費者の意識を把握することが挙げられます。
構成概念(潜在変数)とは、現象を単純に理解するために構成した概念で、直接測定することができない変数です。例えば「ブランド力」や「景気」などです。SEMでは、この構成概念(潜在変数)を間接的に測定(測定できる変数から計算する)し、その因果関係を分析します。回帰分析や因子分析の合わせ技といったイメージの分析手法です。
全体の手順は次のようになります。各手順の解説は後述しますので、ここでは全体の流れ(「データの確認」→「モデルの作成」→「分析の実行」→「分析結果の出力」→「パス図の作成」)のコード例を示します。SEMでのキモは「モデル作成」で、検証したい因果関係の仮説を立てるところから始めます。次に潜在変数の指標としてどのような観測変数が良いかを検討します。
SEMを実行するために次のパッケージを使用します。また、サンプルデータとしてRに組み込みのデータセットPoliticalDemocracyを使用します。
# ライブラリの読み込み
library(lavaan) # SEMの実行用パッケージ
library(semTools) # 修正インデックス等のSEMのユーティリティ
library(semPlot) # パス図作成用のパッケージ
# データの確認
head(PoliticalDemocracy)
## y1 y2 y3 y4 y5 y6 y7 y8
## 1 2.50 0.000000 3.333333 0.000000 1.250000 0.000000 3.726360 3.333333
## 2 1.25 0.000000 3.333333 0.000000 6.250000 1.100000 6.666666 0.736999
## 3 7.50 8.800000 9.999998 9.199991 8.750000 8.094061 9.999998 8.211809
## 4 8.90 8.800000 9.999998 9.199991 8.907948 8.127979 9.999998 4.615086
## 5 10.00 3.333333 9.999998 6.666666 7.500000 3.333333 9.999998 6.666666
## 6 7.50 3.333333 6.666666 6.666666 6.250000 1.100000 6.666666 0.368500
## x1 x2 x3
## 1 4.442651 3.637586 2.557615
## 2 5.384495 5.062595 3.568079
## 3 5.961005 6.255750 5.224433
## 4 6.285998 7.567863 6.267495
## 5 5.863631 6.818924 4.573679
## 6 5.533389 5.135798 3.892270
次表に示す4つの式のタイプを利用してモデルを記述することができます。
モデルのタイプ | オペレータ |
---|---|
潜在変数の定義 | 潜在変数 =~ 観測変数 + 観測変数 + 潜在変数 |
回帰 | 目的変数 ~ 説明変数 + 説明変数 |
分散・共分散 | 変数 ~~ 変数 |
平均 | 変数 ~ 1 |
### モデルの作成
model <- '
# 潜在変数の定義
ind60 =~ x1 + x2 + x3
dem60 =~ y1 + y2 + y3 + y4
dem65 =~ y5 + y6 + y7 + y8
# 回帰分析
dem60 ~ ind60
dem65 ~ ind60 + dem60
'
SEMを実行するために、sem()関数を使います。1つ目の引数にモデル、2つ目にデータセットを指定します。
fit <- sem(model, data = PoliticalDemocracy)
分析結果のサマリーを出力するためにsummary()関数を使います。また、標準化した出力結果を出力するためには、引数にstandardized=TRUEを与えます。
summary(fit, standardized=TRUE)
## lavaan (0.5-23.1097) converged normally after 42 iterations
##
## Number of observations 75
##
## Estimator ML
## Minimum Function Test Statistic 72.462
## Degrees of freedom 41
## P-value (Chi-square) 0.002
##
## Parameter Estimates:
##
## Information Expected
## Standard Errors Standard
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## ind60 =~
## x1 1.000 0.669 0.920
## x2 2.182 0.139 15.714 0.000 1.461 0.973
## x3 1.819 0.152 11.956 0.000 1.218 0.872
## dem60 =~
## y1 1.000 2.201 0.845
## y2 1.354 0.175 7.755 0.000 2.980 0.760
## y3 1.044 0.150 6.961 0.000 2.298 0.705
## y4 1.300 0.138 9.412 0.000 2.860 0.860
## dem65 =~
## y5 1.000 2.084 0.803
## y6 1.258 0.164 7.651 0.000 2.623 0.783
## y7 1.282 0.158 8.137 0.000 2.673 0.819
## y8 1.310 0.154 8.529 0.000 2.730 0.847
##
## Regressions:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## dem60 ~
## ind60 1.474 0.392 3.763 0.000 0.448 0.448
## dem65 ~
## ind60 0.453 0.220 2.064 0.039 0.146 0.146
## dem60 0.864 0.113 7.671 0.000 0.913 0.913
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .x1 0.082 0.020 4.180 0.000 0.082 0.154
## .x2 0.118 0.070 1.689 0.091 0.118 0.053
## .x3 0.467 0.090 5.174 0.000 0.467 0.240
## .y1 1.942 0.395 4.910 0.000 1.942 0.286
## .y2 6.490 1.185 5.479 0.000 6.490 0.422
## .y3 5.340 0.943 5.662 0.000 5.340 0.503
## .y4 2.887 0.610 4.731 0.000 2.887 0.261
## .y5 2.390 0.447 5.351 0.000 2.390 0.355
## .y6 4.343 0.796 5.456 0.000 4.343 0.387
## .y7 3.510 0.668 5.252 0.000 3.510 0.329
## .y8 2.940 0.586 5.019 0.000 2.940 0.283
## ind60 0.448 0.087 5.169 0.000 1.000 1.000
## .dem60 3.872 0.893 4.338 0.000 0.799 0.799
## .dem65 0.115 0.200 0.575 0.565 0.026 0.026
推定値、標準誤差、Z値などのパラメーター値を抽出するためにparameterEstimates() 関数を使います。
parameterEstimates(fit)
## lhs op rhs est se z pvalue ci.lower ci.upper
## 1 ind60 =~ x1 1.000 0.000 NA NA 1.000 1.000
## 2 ind60 =~ x2 2.182 0.139 15.714 0.000 1.910 2.454
## 3 ind60 =~ x3 1.819 0.152 11.956 0.000 1.521 2.117
## 4 dem60 =~ y1 1.000 0.000 NA NA 1.000 1.000
## 5 dem60 =~ y2 1.354 0.175 7.755 0.000 1.012 1.696
## 6 dem60 =~ y3 1.044 0.150 6.961 0.000 0.750 1.338
## 7 dem60 =~ y4 1.300 0.138 9.412 0.000 1.029 1.570
## 8 dem65 =~ y5 1.000 0.000 NA NA 1.000 1.000
## 9 dem65 =~ y6 1.258 0.164 7.651 0.000 0.936 1.581
## 10 dem65 =~ y7 1.282 0.158 8.137 0.000 0.974 1.591
## 11 dem65 =~ y8 1.310 0.154 8.529 0.000 1.009 1.611
## 12 dem60 ~ ind60 1.474 0.392 3.763 0.000 0.706 2.241
## 13 dem65 ~ ind60 0.453 0.220 2.064 0.039 0.023 0.884
## 14 dem65 ~ dem60 0.864 0.113 7.671 0.000 0.644 1.085
## 15 x1 ~~ x1 0.082 0.020 4.180 0.000 0.043 0.120
## 16 x2 ~~ x2 0.118 0.070 1.689 0.091 -0.019 0.256
## 17 x3 ~~ x3 0.467 0.090 5.174 0.000 0.290 0.644
## 18 y1 ~~ y1 1.942 0.395 4.910 0.000 1.167 2.717
## 19 y2 ~~ y2 6.490 1.185 5.479 0.000 4.168 8.811
## 20 y3 ~~ y3 5.340 0.943 5.662 0.000 3.491 7.188
## 21 y4 ~~ y4 2.887 0.610 4.731 0.000 1.691 4.083
## 22 y5 ~~ y5 2.390 0.447 5.351 0.000 1.515 3.265
## 23 y6 ~~ y6 4.343 0.796 5.456 0.000 2.783 5.903
## 24 y7 ~~ y7 3.510 0.668 5.252 0.000 2.200 4.819
## 25 y8 ~~ y8 2.940 0.586 5.019 0.000 1.792 4.089
## 26 ind60 ~~ ind60 0.448 0.087 5.169 0.000 0.278 0.618
## 27 dem60 ~~ dem60 3.872 0.893 4.338 0.000 2.122 5.621
## 28 dem65 ~~ dem65 0.115 0.200 0.575 0.565 -0.277 0.507
モデルの適合度指標とその値を抽出するためにfitMeasures()関数を使います。次の例のように適合指標名を指定することで、特定の適合指標を取り出すことができます。また、すべての適合度指標を出力するためには引数にfit.measures = “all”を与えてください。
主な適合度指標
fitMeasures(fit, c("cfi", "rmsea","agfi"))
## cfi rmsea agfi
## 0.953 0.101 0.765
パス図を作成するためにsemPaths()関数を使います。引数whatLabels = “stand”でパス係数に標準化解をラベルするように指定しています。
semPaths(fit, layout = "tree", whatLabels = "stand", rotation = 4)
「データから価値を創造する」一般社団法人データマーケティングラボラトリー
Copyright© DML All Rights Reserved.