第6回(11月26日) Task Check and Weekly Assignment

構造方程式モデリングによるパス解析

To Do

□ パス解析をやってみる。ただし構造方程式モデリングでね □ 潜在変数を含んだパス解析をやってみる

う・ん・ち・く

□ 構造方程式モデリング,Structural Equatation Modelingとは,あらゆる統計モデルを統合した21世紀の多変量解析モデルなのだ!

Using Package; lavaan

Assignment

■ 投手のデータ(base_pitch.csv)をつかって潜在変数を含んだパス解析をやってみてください

まずはデータセットを読み込んでください。これはプロ野球選手のデータで, 2013年の成績,年俸などが含まれているデータセットです。出典はこちら。>>http://baseball-data.com/ ついでに標準化しておきましょうね。

batter <- read.csv("base_bat.csv", na.strings = "NA")
summary(batter)
##      money            year            age           hight    
##  Min.   : 8600   Min.   : 1.00   Min.   :24.0   Min.   :169  
##  1st Qu.:11375   1st Qu.: 7.75   1st Qu.:30.0   1st Qu.:177  
##  Median :16000   Median :12.00   Median :32.5   Median :180  
##  Mean   :17488   Mean   :11.12   Mean   :33.4   Mean   :181  
##  3rd Qu.:20000   3rd Qu.:15.25   3rd Qu.:37.0   3rd Qu.:184  
##  Max.   :57000   Max.   :25.00   Max.   :42.0   Max.   :196  
##  NA's   :5       NA's   :5       NA's   :5      NA's   :5    
##      weight          daritu          shiai         daseki        dasuu    
##  Min.   : 67.0   Min.   :0.185   Min.   :  9   Min.   : 10   Min.   : 10  
##  1st Qu.: 80.8   1st Qu.:0.230   1st Qu.: 69   1st Qu.:238   1st Qu.:212  
##  Median : 87.5   Median :0.266   Median :108   Median :424   Median :374  
##  Mean   : 88.4   Mean   :0.262   Mean   :102   Mean   :395   Mean   :347  
##  3rd Qu.: 94.0   3rd Qu.:0.290   3rd Qu.:141   3rd Qu.:581   3rd Qu.:508  
##  Max.   :130.0   Max.   :0.333   Max.   :144   Max.   :658   Max.   :590  
##  NA's   :5                                                                
##       anda           HR         datgen          steal      
##  Min.   :  2   Min.   : 0   Min.   :  1.0   Min.   : 0.00  
##  1st Qu.: 50   1st Qu.: 2   1st Qu.: 17.0   1st Qu.: 0.00  
##  Median : 88   Median : 6   Median : 40.0   Median : 1.00  
##  Mean   : 95   Mean   :10   Mean   : 45.7   Mean   : 5.65  
##  3rd Qu.:147   3rd Qu.:16   3rd Qu.: 67.0   3rd Qu.: 6.00  
##  Max.   :180   Max.   :41   Max.   :136.0   Max.   :47.00  
##                                                            
##       four            dead             K              gida      
##  Min.   :  0.0   Min.   : 0.00   Min.   :  3.0   Min.   : 0.00  
##  1st Qu.: 16.0   1st Qu.: 1.00   1st Qu.: 38.0   1st Qu.: 0.00  
##  Median : 33.0   Median : 2.00   Median : 54.0   Median : 1.00  
##  Mean   : 38.8   Mean   : 3.63   Mean   : 62.6   Mean   : 3.19  
##  3rd Qu.: 54.0   3rd Qu.: 5.00   3rd Qu.: 81.0   3rd Qu.: 5.00  
##  Max.   :105.0   Max.   :15.00   Max.   :164.0   Max.   :19.00  
## 
batter.z <- as.data.frame(scale(batter))

つぎに必要なパッケージ,lavaanを装着します(持ってない人はインストールしてください)

# install.packages('lavaan')
library(lavaan)
## This is lavaan 0.5-15
## lavaan is BETA software! Please report any bugs.

前回は重回帰分析を繰り返してパス解析をしましたが,lavaanパッケージはパスモデルを一気に分析してしまいます。 今回分析するモデルは,前回の書き方で言うと次のようなモデルです。

reg1 <- lm(anda ~ age + hight + weight, data = batter.z)
reg2 <- lm(HR ~ age + hight + weight, data = batter.z)
reg3 <- lm(K ~ age + hight + weight, data = batter.z)
reg4 <- lm(money ~ anda + HR + K, data = batter.z)
summary(reg1)
## 
## Call:
## lm(formula = anda ~ age + hight + weight, data = batter.z)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1.9049 -0.6389  0.0909  0.6809  1.4471 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)  0.10863    0.12637    0.86   0.3943   
## age         -0.36391    0.13209   -2.76   0.0083 **
## hight        0.08947    0.18449    0.48   0.6299   
## weight       0.00374    0.18155    0.02   0.9837   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.911 on 48 degrees of freedom
##   (5 observations deleted due to missingness)
## Multiple R-squared:  0.163,  Adjusted R-squared:  0.111 
## F-statistic: 3.12 on 3 and 48 DF,  p-value: 0.0344
summary(reg2)
## 
## Call:
## lm(formula = HR ~ age + hight + weight, data = batter.z)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -2.291 -0.565 -0.141  0.475  2.515 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)   0.0463     0.1265    0.37    0.716  
## age          -0.1557     0.1323   -1.18    0.245  
## hight         0.1575     0.1847    0.85    0.398  
## weight        0.3561     0.1818    1.96    0.056 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.912 on 48 degrees of freedom
##   (5 observations deleted due to missingness)
## Multiple R-squared:  0.25,   Adjusted R-squared:  0.204 
## F-statistic: 5.34 on 3 and 48 DF,  p-value: 0.00294
summary(reg3)
## 
## Call:
## lm(formula = K ~ age + hight + weight, data = batter.z)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -1.827 -0.657 -0.136  0.594  2.733 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)   0.0782     0.1257    0.62     0.54  
## age          -0.2642     0.1314   -2.01     0.05 *
## hight         0.2873     0.1835    1.57     0.12  
## weight        0.0490     0.1806    0.27     0.79  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.906 on 48 degrees of freedom
##   (5 observations deleted due to missingness)
## Multiple R-squared:  0.207,  Adjusted R-squared:  0.157 
## F-statistic: 4.16 on 3 and 48 DF,  p-value: 0.0106
summary(reg4)
## 
## Call:
## lm(formula = money ~ anda + HR + K, data = batter.z)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -1.502 -0.575 -0.168  0.506  3.205 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.00404    0.12676    0.03  0.97468    
## anda        -0.04617    0.19620   -0.24  0.81496    
## HR           0.63670    0.18083    3.52  0.00095 ***
## K           -0.36428    0.19284   -1.89  0.06493 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.907 on 48 degrees of freedom
##   (5 observations deleted due to missingness)
## Multiple R-squared:  0.225,  Adjusted R-squared:  0.177 
## F-statistic: 4.65 on 3 and 48 DF,  p-value: 0.00622

この四つの回帰分析を(自分でノートに書き取る等して)パス図に作り上げていったのでした。

これを一気にやってしまうのがlavaanパッケージの面白いところ。次のように書きます。

model.1 <- "
anda ~age+hight+weight
HR   ~age+hight+weight
K    ~age+hight+weight
money~anda+HR+K"

result.1 <- sem(model.1, data = batter.z)
summary(result.1)
## lavaan (0.5-15) converged normally after  14 iterations
## 
##                                                   Used       Total
##   Number of observations                            52          57
## 
##   Estimator                                         ML
##   Minimum Function Test Statistic               74.669
##   Degrees of freedom                                 6
##   P-value (Chi-square)                           0.000
## 
## Parameter estimates:
## 
##   Information                                 Expected
##   Standard Errors                             Standard
## 
##                    Estimate  Std.err  Z-value  P(>|z|)
## Regressions:
##   anda ~
##     age              -0.364    0.127   -2.867    0.004
##     hight             0.089    0.177    0.505    0.614
##     weight            0.004    0.174    0.021    0.983
##   HR ~
##     age              -0.156    0.127   -1.226    0.220
##     hight             0.157    0.177    0.887    0.375
##     weight            0.356    0.175    2.039    0.041
##   K ~
##     age              -0.264    0.126   -2.094    0.036
##     hight             0.287    0.176    1.630    0.103
##     weight            0.049    0.173    0.283    0.777
##   money ~
##     anda             -0.046    0.128   -0.360    0.719
##     HR                0.637    0.122    5.216    0.000
##     K                -0.364    0.127   -2.862    0.004
## 
## Variances:
##     anda              0.767    0.150
##     HR                0.769    0.151
##     K                 0.758    0.149
##     money             0.760    0.149

このように,結果が一度に表現されるので,多少見やすくなりました。 がそれ以外にも優れた機能があります。

まず,適合度と呼ばれるモデル全体の評価をすることができます。

fitMeasures(result.1)
##              fmin             chisq                df            pvalue 
##             0.718            74.669             6.000             0.000 
##    baseline.chisq       baseline.df   baseline.pvalue               cfi 
##           124.220            18.000             0.000             0.354 
##               tli              nnfi               rfi               nfi 
##            -0.939            -0.939             1.000             0.399 
##              pnfi               ifi               rni              logl 
##             0.133             0.419             0.354          -467.710 
## unrestricted.logl              npar               aic               bic 
##          -430.375            16.000           967.420           998.640 
##            ntotal              bic2             rmsea    rmsea.ci.lower 
##            52.000           948.395             0.469             0.377 
##    rmsea.ci.upper      rmsea.pvalue               rmr        rmr_nomean 
##             0.567             0.000             0.189             0.189 
##              srmr       srmr_nomean             cn_05             cn_01 
##             0.196             0.196             9.769            12.708 
##               gfi              agfi              pgfi               mfi 
##             0.715            -0.331             0.153             0.517 
##              ecvi 
##             2.051

数値はたくさん出ていますが、いずれもモデルの評価をする数値です。ポイントは,重回帰分析を反復した時はモデル評価がそれぞれの回帰式に対して算出されたのに対し,SEMを使ったパス解析では,モデル全体に対してひとつの評価がされているところです。

評価算出法が複数提案されていますので,モデル評価が増えたように思えますが、実は一元化できているのでとてもシンプルになったのです。

特に覚えておく必要があるのは次の適合度です。

今回のモデルはどの指標を見ても良くない(モデルがデータに当てはまっていない)という結果になってしまいました。 そんなとき嬉しいのが,この適合度指標に基づいた修正指数をだしてくれるところ。 ここをこのように変えれば適合度があがりますよ,というヒントがもらえるのですね。

modificationindices(result.1)
##       lhs op    rhs     mi    epc sepc.lv sepc.all sepc.nox
## 1    anda ~~   anda  0.000  0.000   0.000    0.000    0.000
## 2    anda ~~     HR 25.880  0.541   0.541    0.559    0.559
## 3    anda ~~      K 22.297  0.499   0.499    0.534    0.534
## 4    anda ~~  money  2.977  0.493   0.493    0.468    0.468
## 5    anda ~~    age     NA     NA      NA       NA       NA
## 6    anda ~~  hight     NA     NA      NA       NA       NA
## 7    anda ~~ weight     NA     NA      NA       NA       NA
## 8      HR ~~     HR  0.000  0.000   0.000    0.000    0.000
## 9      HR ~~      K 19.808  0.471   0.471    0.476    0.476
## 10     HR ~~  money  0.007 -0.019  -0.019   -0.017   -0.017
## 11     HR ~~    age     NA     NA      NA       NA       NA
## 12     HR ~~  hight     NA     NA      NA       NA       NA
## 13     HR ~~ weight     NA     NA      NA       NA       NA
## 14      K ~~      K  0.000  0.000   0.000    0.000    0.000
## 15      K ~~  money  1.595  0.333   0.333    0.309    0.309
## 16      K ~~    age     NA     NA      NA       NA       NA
## 17      K ~~  hight     NA     NA      NA       NA       NA
## 18      K ~~ weight     NA     NA      NA       NA       NA
## 19  money ~~  money  0.000  0.000   0.000    0.000    0.000
## 20  money ~~    age  1.645  0.164   0.164    0.150    0.164
## 21  money ~~  hight  1.038 -0.086  -0.086   -0.079   -0.086
## 22  money ~~ weight  1.866  0.119   0.119    0.109    0.119
## 23    age ~~    age  0.000  0.000   0.000    0.000    0.000
## 24    age ~~  hight  0.000  0.000   0.000    0.000    0.000
## 25    age ~~ weight  0.000  0.000   0.000    0.000    0.000
## 26  hight ~~  hight  0.000  0.000   0.000    0.000    0.000
## 27  hight ~~ weight  0.000  0.000   0.000    0.000    0.000
## 28 weight ~~ weight  0.000  0.000   0.000    0.000    0.000
## 29   anda  ~     HR 25.880  0.705   0.705    0.745    0.745
## 30   anda  ~      K 22.297  0.658   0.658    0.672    0.672
## 31   anda  ~  money  6.982  0.447   0.447    0.514    0.514
## 32   anda  ~    age  0.000  0.000   0.000    0.000    0.000
## 33   anda  ~  hight  0.000  0.000   0.000    0.000    0.000
## 34   anda  ~ weight  0.000  0.000   0.000    0.000    0.000
## 35     HR  ~   anda 25.880  0.706   0.706    0.668    0.668
## 36     HR  ~      K 19.808  0.621   0.621    0.600    0.600
## 37     HR  ~  money 10.223 -0.753  -0.753   -0.819   -0.819
## 38     HR  ~    age  0.000  0.000   0.000    0.000    0.000
## 39     HR  ~  hight  0.000  0.000   0.000    0.000    0.000
## 40     HR  ~ weight  0.000  0.000   0.000    0.000    0.000
## 41      K  ~   anda 22.297  0.651   0.651    0.638    0.638
## 42      K  ~     HR 19.808  0.613   0.613    0.635    0.635
## 43      K  ~  money 17.193  0.759   0.759    0.856    0.856
## 44      K  ~    age  0.000  0.000   0.000    0.000    0.000
## 45      K  ~  hight  0.000  0.000   0.000    0.000    0.000
## 46      K  ~ weight  0.000  0.000   0.000    0.000    0.000
## 47  money  ~   anda  0.000  0.000   0.000    0.000    0.000
## 48  money  ~     HR  0.000  0.000   0.000    0.000    0.000
## 49  money  ~      K  0.000  0.000   0.000    0.000    0.000
## 50  money  ~    age  2.837  0.234   0.234    0.211    0.213
## 51  money  ~  hight  0.157 -0.057  -0.057   -0.051   -0.052
## 52  money  ~ weight  1.037  0.142   0.142    0.128    0.129
## 53    age  ~   anda  0.000  0.000   0.000    0.000    0.000
## 54    age  ~     HR  0.000  0.000   0.000    0.000    0.000
## 55    age  ~      K  0.000  0.000   0.000    0.000    0.000
## 56    age  ~  money  1.544  0.202   0.202    0.225    0.225
## 57    age  ~  hight  0.000  0.000   0.000    0.000    0.000
## 58    age  ~ weight  0.000  0.000   0.000    0.000    0.000
## 59  hight  ~   anda  0.000  0.000   0.000    0.000    0.000
## 60  hight  ~     HR  0.000  0.000   0.000    0.000    0.000
## 61  hight  ~      K  0.000  0.000   0.000    0.000    0.000
## 62  hight  ~  money  0.983 -0.108  -0.108   -0.120   -0.120
## 63  hight  ~    age  0.000  0.000   0.000    0.000    0.000
## 64  hight  ~ weight  0.000  0.000   0.000    0.000    0.000
## 65 weight  ~   anda  0.000  0.000   0.000    0.000    0.000
## 66 weight  ~     HR  0.000  0.000   0.000    0.000    0.000
## 67 weight  ~      K  0.000  0.000   0.000    0.000    0.000
## 68 weight  ~  money  1.718  0.144   0.144    0.160    0.160
## 69 weight  ~    age  0.000  0.000   0.000    0.000    0.000
## 70 weight  ~  hight  0.000  0.000   0.000    0.000    0.000

ちょっと大量に出てしまいましたが,これのmi列をみると,そこにパスを引くことでどの程度の改良が見られるか、ということをおしえてくれている。 この修正指数に従ってモデルを書き換えていっても良いが,機械のいいなりになって変なモデルを書いてしまわないこと。 パスを引いてもいいけど,その意味が解釈できるものでないと「適合度は高いけど意味のないモデル」になってしまう。

ところで,構造方程式モデリングの利点は他にもあって,多重共線性の問題に真正面から取り組めることがそのひとつ。 重回帰分析の場合、独立変数間に相関があっては行けないということだったが,SEMの場合その相関を仮定したモデルを作ることができる。 次のように。

model.2 <- " 
anda ~age+hight+weight
HR   ~age+hight+weight
K    ~age+hight+weight
money~anda+HR+K
age ~~ hight
age ~~ weight
hight ~~ weight
anda ~~ HR
anda ~~ K
K ~~ HR
"

result.2 <- sem(model.2, data = batter.z, fixed.x = FALSE)
summary(result.2, fit.measures = TRUE, modindices = TRUE)
## lavaan (0.5-15) converged normally after  35 iterations
## 
##                                                   Used       Total
##   Number of observations                            52          57
## 
##   Estimator                                         ML
##   Minimum Function Test Statistic                5.185
##   Degrees of freedom                                 3
##   P-value (Chi-square)                           0.159
## 
## Model test baseline model:
## 
##   Minimum Function Test Statistic              162.566
##   Degrees of freedom                                21
##   P-value                                        0.000
## 
## User model versus baseline model:
## 
##   Comparative Fit Index (CFI)                    0.985
##   Tucker-Lewis Index (TLI)                       0.892
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)               -432.968
##   Loglikelihood unrestricted model (H1)       -430.375
## 
##   Number of free parameters                         25
##   Akaike (AIC)                                 915.935
##   Bayesian (BIC)                               964.716
##   Sample-size adjusted Bayesian (BIC)          886.208
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.118
##   90 Percent Confidence Interval          0.000  0.285
##   P-value RMSEA <= 0.05                          0.205
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.041
## 
## Parameter estimates:
## 
##   Information                                 Expected
##   Standard Errors                             Standard
## 
##                    Estimate  Std.err  Z-value  P(>|z|)
## Regressions:
##   anda ~
##     age              -0.364    0.127   -2.867    0.004
##     hight             0.089    0.177    0.505    0.614
##     weight            0.004    0.174    0.021    0.983
##   HR ~
##     age              -0.156    0.127   -1.225    0.220
##     hight             0.157    0.177    0.887    0.375
##     weight            0.356    0.175    2.039    0.041
##   K ~
##     age              -0.264    0.126   -2.094    0.036
##     hight             0.287    0.176    1.630    0.103
##     weight            0.049    0.173    0.283    0.777
##   money ~
##     anda             -0.046    0.189   -0.245    0.807
##     HR                0.637    0.174    3.665    0.000
##     K                -0.364    0.185   -1.966    0.049
## 
## Covariances:
##   age ~~
##     hight            -0.175    0.138   -1.264    0.206
##     weight            0.010    0.136    0.072    0.942
##   hight ~~
##     weight            0.685    0.166    4.128    0.000
##   anda ~~
##     HR                0.541    0.130    4.157    0.000
##     K                 0.499    0.126    3.950    0.000
##   HR ~~
##     K                 0.471    0.124    3.787    0.000
## 
## Variances:
##     anda              0.767    0.150
##     HR                0.769    0.151
##     K                 0.758    0.149
##     money             0.760    0.149
##     age               0.981    0.192
##     hight             0.981    0.192
##     weight            0.981    0.192
## 
## Modification Indices:
## 
##       lhs op    rhs    mi    epc sepc.lv sepc.all sepc.nox
## 1    anda ~~   anda 0.000  0.000   0.000    0.000    0.000
## 2    anda ~~     HR 0.000  0.000   0.000    0.000    0.000
## 3    anda ~~      K 0.000  0.000   0.000    0.000    0.000
## 4    anda ~~  money 2.584  0.243   0.243    0.256    0.256
## 5    anda ~~    age    NA     NA      NA       NA       NA
## 6    anda ~~  hight    NA     NA      NA       NA       NA
## 7    anda ~~ weight    NA     NA      NA       NA       NA
## 8      HR ~~     HR 0.000  0.000   0.000    0.000    0.000
## 9      HR ~~      K 0.000  0.000   0.000    0.000    0.000
## 10     HR ~~  money 2.119 -0.202  -0.202   -0.201   -0.201
## 11     HR ~~    age    NA     NA      NA       NA       NA
## 12     HR ~~  hight    NA     NA      NA       NA       NA
## 13     HR ~~ weight    NA     NA      NA       NA       NA
## 14      K ~~      K 0.000  0.000   0.000    0.000    0.000
## 15      K ~~  money 1.581  0.366   0.366    0.379    0.379
## 16      K ~~    age    NA     NA      NA       NA       NA
## 17      K ~~  hight    NA     NA      NA       NA       NA
## 18      K ~~ weight    NA     NA      NA       NA       NA
## 19  money ~~  money 0.000  0.000   0.000    0.000    0.000
## 20  money ~~    age 1.593  0.159   0.159    0.162    0.162
## 21  money ~~  hight 1.044 -0.087  -0.087   -0.089   -0.089
## 22  money ~~ weight 1.979  0.126   0.126    0.128    0.128
## 23    age ~~    age 0.000  0.000   0.000    0.000    0.000
## 24    age ~~  hight 0.000  0.000   0.000    0.000    0.000
## 25    age ~~ weight 0.000  0.000   0.000    0.000    0.000
## 26  hight ~~  hight 0.000  0.000   0.000    0.000    0.000
## 27  hight ~~ weight 0.000  0.000   0.000    0.000    0.000
## 28 weight ~~ weight 0.000  0.000   0.000    0.000    0.000
## 29   anda  ~     HR    NA     NA      NA       NA       NA
## 30   anda  ~      K    NA     NA      NA       NA       NA
## 31   anda  ~  money 2.584  0.319   0.319    0.330    0.330
## 32   anda  ~    age 0.000  0.000   0.000    0.000    0.000
## 33   anda  ~  hight 0.000  0.000   0.000    0.000    0.000
## 34   anda  ~ weight 0.000  0.000   0.000    0.000    0.000
## 35     HR  ~   anda    NA     NA      NA       NA       NA
## 36     HR  ~      K    NA     NA      NA       NA       NA
## 37     HR  ~  money 2.119 -0.265  -0.265   -0.259   -0.259
## 38     HR  ~    age 0.000  0.000   0.000    0.000    0.000
## 39     HR  ~  hight 0.000  0.000   0.000    0.000    0.000
## 40     HR  ~ weight 0.000  0.000   0.000    0.000    0.000
## 41      K  ~   anda    NA     NA      NA       NA       NA
## 42      K  ~     HR    NA     NA      NA       NA       NA
## 43      K  ~  money 1.581  0.482   0.482    0.489    0.489
## 44      K  ~    age 0.000  0.000   0.000    0.000    0.000
## 45      K  ~  hight 0.000  0.000   0.000    0.000    0.000
## 46      K  ~ weight 0.000  0.000   0.000    0.000    0.000
## 47  money  ~   anda 0.000  0.000   0.000    0.000    0.000
## 48  money  ~     HR 0.000  0.000   0.000    0.000    0.000
## 49  money  ~      K 0.000  0.000   0.000    0.000    0.000
## 50  money  ~    age 2.669  0.221   0.221    0.221    0.221
## 51  money  ~  hight 0.152 -0.055  -0.055   -0.055   -0.055
## 52  money  ~ weight 1.158  0.159   0.159    0.159    0.159
## 53    age  ~   anda    NA     NA      NA       NA       NA
## 54    age  ~     HR    NA     NA      NA       NA       NA
## 55    age  ~      K    NA     NA      NA       NA       NA
## 56    age  ~  money 1.593  0.209   0.209    0.209    0.209
## 57    age  ~  hight    NA     NA      NA       NA       NA
## 58    age  ~ weight    NA     NA      NA       NA       NA
## 59  hight  ~   anda    NA     NA      NA       NA       NA
## 60  hight  ~     HR    NA     NA      NA       NA       NA
## 61  hight  ~      K    NA     NA      NA       NA       NA
## 62  hight  ~  money 1.044 -0.114  -0.114   -0.114   -0.114
## 63  hight  ~    age    NA     NA      NA       NA       NA
## 64  hight  ~ weight    NA     NA      NA       NA       NA
## 65 weight  ~   anda    NA     NA      NA       NA       NA
## 66 weight  ~     HR    NA     NA      NA       NA       NA
## 67 weight  ~      K    NA     NA      NA       NA       NA
## 68 weight  ~  money 1.979  0.165   0.165    0.165    0.165
## 69 weight  ~    age    NA     NA      NA       NA       NA
## 70 weight  ~  hight    NA     NA      NA       NA       NA

ということで,あらためて。

reg3 <- lm(money ~ HR + hight + weight, data = batter.z)
reg3
## 
## Call:
## lm(formula = money ~ HR + hight + weight, data = batter.z)
## 
## Coefficients:
## (Intercept)           HR        hight       weight  
##     -0.0156       0.3360      -0.3139       0.3748
summary(reg3)
## 
## Call:
## lm(formula = money ~ HR + hight + weight, data = batter.z)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -1.601 -0.515 -0.117  0.448  3.595 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)  -0.0156     0.1266   -0.12    0.903  
## HR            0.3360     0.1421    2.36    0.022 *
## hight        -0.3139     0.1808   -1.74    0.089 .
## weight        0.3748     0.1838    2.04    0.047 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.911 on 48 degrees of freedom
##   (5 observations deleted due to missingness)
## Multiple R-squared:  0.218,  Adjusted R-squared:  0.169 
## F-statistic: 4.47 on 3 and 48 DF,  p-value: 0.0076

これで一気に適合度の高いモデル(CFI=0.985!)を作ることができた。 ちなみにこれがどんなモデルか,というのは図示するとわかりやすいが,パッケージを使うと図示することもできる。 まだまだ開発途上,という感じなので,実用化にはもう少しかかるだろうけど。

# install.packages('semPlot')
library(semPlot)
## This is semPlot 0.3.3
## semPlot is BETA software! Please report any bugs.
semPaths(result.2, "std")

plot of chunk plotDemo

潜在変数をおいたモデル

いままでは観測されたデータだけを用いていたが,複数の変数をまとめて目に見えない変数を構成し,より純粋で抽象的な概念同士の関係を抽出する方法を考える。観測されない変数,概念的に想定される変数のことを「潜在変数」といい,次のようにモデル化する。

model.3 <- "
muscle =~ hight + weight
record =~ anda + HR + steal + four + dead
record ~~ muscle
"

result.3 <- sem(model.3, data = batter.z)
summary(result.3, fit.measures = TRUE, standardized = T)
## lavaan (0.5-15) converged normally after  27 iterations
## 
##                                                   Used       Total
##   Number of observations                            52          57
## 
##   Estimator                                         ML
##   Minimum Function Test Statistic               43.346
##   Degrees of freedom                                13
##   P-value (Chi-square)                           0.000
## 
## Model test baseline model:
## 
##   Minimum Function Test Statistic              186.111
##   Degrees of freedom                                21
##   P-value                                        0.000
## 
## User model versus baseline model:
## 
##   Comparative Fit Index (CFI)                    0.816
##   Tucker-Lewis Index (TLI)                       0.703
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)               -442.531
##   Loglikelihood unrestricted model (H1)       -420.858
## 
##   Number of free parameters                         15
##   Akaike (AIC)                                 915.062
##   Bayesian (BIC)                               944.331
##   Sample-size adjusted Bayesian (BIC)          897.226
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.212
##   90 Percent Confidence Interval          0.144  0.283
##   P-value RMSEA <= 0.05                          0.000
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.116
## 
## Parameter estimates:
## 
##   Information                                 Expected
##   Standard Errors                             Standard
## 
##                    Estimate  Std.err  Z-value  P(>|z|)   Std.lv  Std.all
## Latent variables:
##   muscle =~
##     hight             1.000                               0.907    0.916
##     weight            0.833    0.394    2.115    0.034    0.755    0.763
##   record =~
##     anda              1.000                               0.806    0.842
##     HR                1.000    0.158    6.325    0.000    0.806    0.796
##     steal             0.469    0.181    2.588    0.010    0.378    0.370
##     four              0.995    0.151    6.578    0.000    0.802    0.824
##     dead              0.839    0.164    5.102    0.000    0.676    0.671
## 
## Covariances:
##   muscle ~~
##     record            0.218    0.123    1.772    0.076    0.299    0.299
## 
## Variances:
##     hight             0.159    0.377                      0.159    0.162
##     weight            0.410    0.273                      0.410    0.418
##     anda              0.267    0.081                      0.267    0.291
##     HR                0.376    0.098                      0.376    0.367
##     steal             0.901    0.181                      0.901    0.863
##     four              0.304    0.086                      0.304    0.321
##     dead              0.558    0.123                      0.558    0.550
##     muscle            0.822    0.421                      1.000    1.000
##     record            0.649    0.183                      1.000    1.000
semPaths(result.3, "std")

plot of chunk model3

潜在変数をおくことで,複数の観測変数がまとめあげられるという利点があり,モデルを単純化して理解しやすくなる。 また,潜在変数をおくことは,測定すること=目に見えないものを見える化すること,と深い関わりがある(詳しくは心理教育測定法で講義する)。