第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")
いままでは観測されたデータだけを用いていたが,複数の変数をまとめて目に見えない変数を構成し,より純粋で抽象的な概念同士の関係を抽出する方法を考える。観測されない変数,概念的に想定される変数のことを「潜在変数」といい,次のようにモデル化する。
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")
潜在変数をおくことで,複数の観測変数がまとめあげられるという利点があり,モデルを単純化して理解しやすくなる。 また,潜在変数をおくことは,測定すること=目に見えないものを見える化すること,と深い関わりがある(詳しくは心理教育測定法で講義する)。