お配りしている野球のデータを見てみましょう。
baseball <- read.csv("baseball2016.csv",head=T)
summary(baseball)
## name team pay position
## T−岡田 : 1 ソフトバンク:17 Min. : 4500 外野手:29
## エリアン : 1 日本ハム :15 1st Qu.: 7200 投手 :62
## エルドレッド: 1 巨人 :14 Median :10800 内野手:44
## エルナンデス: 1 西武 :13 Mean :14780 捕手 : 8
## ギャレット : 1 オリックス :12 3rd Qu.:20000
## クルーズ : 1 ヤクルト :12 Max. :60000
## (Other) :137 (Other) :60
## year age height weight
## Min. : 1.00 Min. :20.00 Min. :167 Min. : 66.00
## 1st Qu.: 4.00 1st Qu.:28.00 1st Qu.:177 1st Qu.: 80.00
## Median : 8.00 Median :31.00 Median :180 Median : 87.00
## Mean : 8.28 Mean :30.64 Mean :182 Mean : 87.76
## 3rd Qu.:12.00 3rd Qu.:33.50 3rd Qu.:185 3rd Qu.: 95.00
## Max. :21.00 Max. :41.00 Max. :203 Max. :122.00
##
## games Hit HR
## Min. : 13.00 Min. : 25.0 Min. : 0.00
## 1st Qu.: 27.50 1st Qu.: 60.0 1st Qu.: 3.00
## Median : 70.00 Median :104.0 Median : 8.00
## Mean : 77.93 Mean :102.3 Mean :10.19
## 3rd Qu.:121.00 3rd Qu.:140.0 3rd Qu.:14.00
## Max. :143.00 Max. :195.0 Max. :44.00
##
table(baseball$team)
##
## DeNA オリックス ソフトバンク ヤクルト ロッテ
## 9 12 17 12 11
## 楽天 巨人 広島 阪神 西武
## 9 14 11 10 13
## 中日 日本ハム
## 10 15
table(baseball$position)
##
## 外野手 投手 内野手 捕手
## 29 62 44 8
ご覧の通り,チームが12球団,ポジションが色々あります。数では投手が一番多いですね。チームは大きく分けるとセントラル・リーグとパシフィック・リーグの二つになります。また,投手にとってのHR,Hitはホームランやヒットを「打たれた」ことですし,それ以外の選手にとっては打ったことになりますので,意味がちょっと違います。なので,これを区別する変数を新たに作ることにします。
# セ・リーグかパ・リーグか
c.league <- c("DeNA","ヤクルト","巨人","広島","阪神","中日")
baseball$CP <- ifelse(is.element(baseball$team,c.league),1,2)
baseball$CP <- factor(baseball$CP,labels=c("C","P"))
# 投手かどうか
baseball$Pos2 <- ifelse(baseball$position=="投手",1,2)
baseball$Pos2 <- factor(baseball$Pos2,labels=c("投手","野手"))
summary(baseball)
## name team pay position
## T−岡田 : 1 ソフトバンク:17 Min. : 4500 外野手:29
## エリアン : 1 日本ハム :15 1st Qu.: 7200 投手 :62
## エルドレッド: 1 巨人 :14 Median :10800 内野手:44
## エルナンデス: 1 西武 :13 Mean :14780 捕手 : 8
## ギャレット : 1 オリックス :12 3rd Qu.:20000
## クルーズ : 1 ヤクルト :12 Max. :60000
## (Other) :137 (Other) :60
## year age height weight
## Min. : 1.00 Min. :20.00 Min. :167 Min. : 66.00
## 1st Qu.: 4.00 1st Qu.:28.00 1st Qu.:177 1st Qu.: 80.00
## Median : 8.00 Median :31.00 Median :180 Median : 87.00
## Mean : 8.28 Mean :30.64 Mean :182 Mean : 87.76
## 3rd Qu.:12.00 3rd Qu.:33.50 3rd Qu.:185 3rd Qu.: 95.00
## Max. :21.00 Max. :41.00 Max. :203 Max. :122.00
##
## games Hit HR CP Pos2
## Min. : 13.00 Min. : 25.0 Min. : 0.00 C:66 投手:62
## 1st Qu.: 27.50 1st Qu.: 60.0 1st Qu.: 3.00 P:77 野手:81
## Median : 70.00 Median :104.0 Median : 8.00
## Mean : 77.93 Mean :102.3 Mean :10.19
## 3rd Qu.:121.00 3rd Qu.:140.0 3rd Qu.:14.00
## Max. :143.00 Max. :195.0 Max. :44.00
##
また,この後のエラー回避の為にちょっとだけ細工を。
baseball$pay <- baseball$pay/1000
さて,今日は「野手」に限ってモデルを作ります。 勘弁のために,野手用のデータセットを作っておきましょう。
model.data <- subset(baseball,baseball$Pos2=="野手")
前回「因子分析」の回で,目に見えないものが見えるようになりました。 例えば,年齢と身長と体重を足し合わせることで,「選手力」と呼ぶことができるのです。 そして,「選手力」が年収に影響しているかもしれない,ということを考えるのは自然なことですよね。
この因子分析と回帰分析を足し合わせたような方法として,SEM(構造方程式モデリング,Structural Equation Modeling)を使うことが可能です。
SEMはlavaanパッケージを使います。これを使って,選手力が年俸に影響しているかどうか,調べてみましょう。
library(lavaan)
## This is lavaan 0.5-22
## lavaan is BETA software! Please report any bugs.
model1 <- '
body =~ age + weight + height
pay ~ body
'
result.fit <- sem(model1,data=model.data)
summary(result.fit,fit.measures=T,standardized=T)
## lavaan (0.5-22) converged normally after 43 iterations
##
## Number of observations 81
##
## Estimator ML
## Minimum Function Test Statistic 3.893
## Degrees of freedom 2
## P-value (Chi-square) 0.143
##
## Model test baseline model:
##
## Minimum Function Test Statistic 85.274
## Degrees of freedom 6
## P-value 0.000
##
## User model versus baseline model:
##
## Comparative Fit Index (CFI) 0.976
## Tucker-Lewis Index (TLI) 0.928
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -1039.911
## Loglikelihood unrestricted model (H1) -1037.964
##
## Number of free parameters 8
## Akaike (AIC) 2095.821
## Bayesian (BIC) 2114.977
## Sample-size adjusted Bayesian (BIC) 2089.748
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.108
## 90 Percent Confidence Interval 0.000 0.269
## P-value RMSEA <= 0.05 0.199
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.061
##
## Parameter Estimates:
##
## Information Expected
## Standard Errors Standard
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## body =~
## age 1.000 0.822 0.200
## weight 12.724 7.485 1.700 0.089 10.461 0.973
## height 4.909 2.779 1.766 0.077 4.036 0.763
##
## Regressions:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## pay ~
## body 4.452 2.740 1.625 0.104 3.660 0.401
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .age 16.186 2.551 6.344 0.000 16.186 0.960
## .weight 6.154 22.107 0.278 0.781 6.154 0.053
## .height 11.715 3.769 3.108 0.002 11.715 0.418
## .pay 69.926 11.334 6.170 0.000 69.926 0.839
## body 0.676 0.770 0.878 0.380 1.000 1.000
library(semPlot)
semPaths(result.fit,what="stand",style="lisrel")
このように,潜在変数を作るときには「=~」で項を結びます。複数の潜在変数を置いてモデルを組んだり,潜在変数同士の関係を回帰的に表現したりすることだって可能です!
model2 <- '
body =~ age + weight + height
performance =~ HR + pay
performance ~ body
'
result.fit2 <- sem(model2,data=model.data)
summary(result.fit2,fit.measures=T,standardized=T)
## lavaan (0.5-22) converged normally after 162 iterations
##
## Number of observations 81
##
## Estimator ML
## Minimum Function Test Statistic 25.674
## Degrees of freedom 4
## P-value (Chi-square) 0.000
##
## Model test baseline model:
##
## Minimum Function Test Statistic 146.393
## Degrees of freedom 10
## P-value 0.000
##
## User model versus baseline model:
##
## Comparative Fit Index (CFI) 0.841
## Tucker-Lewis Index (TLI) 0.603
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -1327.494
## Loglikelihood unrestricted model (H1) -1314.657
##
## Number of free parameters 11
## Akaike (AIC) 2676.988
## Bayesian (BIC) 2703.327
## Sample-size adjusted Bayesian (BIC) 2668.637
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.259
## 90 Percent Confidence Interval 0.169 0.358
## P-value RMSEA <= 0.05 0.000
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.095
##
## Parameter Estimates:
##
## Information Expected
## Standard Errors Standard
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## body =~
## age 1.000 0.764 0.186
## weight 13.755 8.397 1.638 0.101 10.505 0.977
## height 5.274 3.203 1.646 0.100 4.027 0.761
## performance =~
## HR 1.000 8.575 0.798
## pay 0.572 0.152 3.757 0.000 4.906 0.537
##
## Regressions:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## performance ~
## body 8.340 5.164 1.615 0.106 0.743 0.743
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .age 16.279 2.563 6.352 0.000 16.279 0.965
## .weight 5.231 13.545 0.386 0.699 5.231 0.045
## .height 11.783 2.718 4.335 0.000 11.783 0.421
## .HR 41.897 17.823 2.351 0.019 41.897 0.363
## .pay 59.254 10.774 5.500 0.000 59.254 0.711
## body 0.583 0.708 0.824 0.410 1.000 1.000
## .performance 32.958 17.892 1.842 0.065 0.448 0.448
library(semPlot)
semPaths(result.fit2,what="stand",style="lisrel")
ここでlavaanの式の書き方をまとめておきましょう。
言いたいこと | 書き方 |
---|---|
回帰(因果) | ~ |
因子(潜在変数) | =~ |
相関がある | ~~ |
切片 | ~1 |
直交 | ~0 |
モデルが自由に組めるようになったわけですが,どうも適合度がうまく上がらない・・・ そんな時は,修正指数を参考にしてみましょう。
modificationindices(result.fit2)
## lhs op rhs mi epc sepc.lv sepc.all sepc.nox
## 16 performance =~ age 5.889 -0.277 -2.373 -0.578 -0.578
## 17 performance =~ weight 0.016 -0.138 -1.185 -0.110 -0.110
## 18 performance =~ height 2.352 0.541 4.639 0.877 0.877
## 19 age ~~ weight 2.352 5.576 5.576 0.126 0.126
## 20 age ~~ height 0.016 -0.209 -0.209 -0.010 -0.010
## 21 age ~~ HR 18.158 -16.226 -16.226 -0.368 -0.368
## 22 age ~~ pay 9.042 10.928 10.928 0.292 0.292
## 23 weight ~~ height 5.889 -79.328 -79.328 -1.394 -1.394
## 24 weight ~~ HR 0.012 1.564 1.564 0.014 0.014
## 25 weight ~~ pay 0.029 -1.469 -1.469 -0.015 -0.015
## 26 height ~~ HR 1.093 5.684 5.684 0.100 0.100
## 27 height ~~ pay 0.125 -1.183 -1.183 -0.024 -0.024
これはどこにどのようなパスを仮定すれば,適合度が改善されるかを「機械的に」算出したものです。 機械的にというのを強調したのは,理論的にそこのパスはありえないよ,というものでも出してくるからです。 闇雲に機械のいうことを採用するのではなく,実際的に意味のある提案を採用するようにしましょう。
ところで,この一覧はわかりにくいので,修正指標の大きい順に並べ替えておきましょうか。
mi <- modificationindices(result.fit2)
mi[order(mi$mi,decreasing = T),]
## lhs op rhs mi epc sepc.lv sepc.all sepc.nox
## 21 age ~~ HR 18.158 -16.226 -16.226 -0.368 -0.368
## 22 age ~~ pay 9.042 10.928 10.928 0.292 0.292
## 16 performance =~ age 5.889 -0.277 -2.373 -0.578 -0.578
## 23 weight ~~ height 5.889 -79.328 -79.328 -1.394 -1.394
## 19 age ~~ weight 2.352 5.576 5.576 0.126 0.126
## 18 performance =~ height 2.352 0.541 4.639 0.877 0.877
## 26 height ~~ HR 1.093 5.684 5.684 0.100 0.100
## 27 height ~~ pay 0.125 -1.183 -1.183 -0.024 -0.024
## 25 weight ~~ pay 0.029 -1.469 -1.469 -0.015 -0.015
## 20 age ~~ height 0.016 -0.209 -0.209 -0.010 -0.010
## 17 performance =~ weight 0.016 -0.138 -1.185 -0.110 -0.110
## 24 weight ~~ HR 0.012 1.564 1.564 0.014 0.014
これを参考に書き直したのが次のモデルです。
model3 <- '
body =~ age + weight + height
performance =~ HR + pay
performance ~ body
age ~~ HR
age ~~ pay
'
result.fit3 <- sem(model3,data=model.data)
summary(result.fit3,fit.measures=T,standardized=T)
## lavaan (0.5-22) converged normally after 147 iterations
##
## Number of observations 81
##
## Estimator ML
## Minimum Function Test Statistic 0.224
## Degrees of freedom 2
## P-value (Chi-square) 0.894
##
## Model test baseline model:
##
## Minimum Function Test Statistic 146.393
## Degrees of freedom 10
## P-value 0.000
##
## User model versus baseline model:
##
## Comparative Fit Index (CFI) 1.000
## Tucker-Lewis Index (TLI) 1.065
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -1314.769
## Loglikelihood unrestricted model (H1) -1314.657
##
## Number of free parameters 13
## Akaike (AIC) 2655.538
## Bayesian (BIC) 2686.666
## Sample-size adjusted Bayesian (BIC) 2645.669
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.000
## 90 Percent Confidence Interval 0.000 0.099
## P-value RMSEA <= 0.05 0.912
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.008
##
## Parameter Estimates:
##
## Information Expected
## Standard Errors Standard
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## body =~
## age 1.000 0.808 0.197
## weight 12.715 7.425 1.713 0.087 10.280 0.956
## height 5.084 2.965 1.714 0.086 4.110 0.777
## performance =~
## HR 1.000 8.639 0.804
## pay 0.564 0.151 3.739 0.000 4.869 0.533
##
## Regressions:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## performance ~
## body 8.078 5.269 1.533 0.125 0.756 0.756
##
## Covariances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .age ~~
## .HR -14.115 4.219 -3.346 0.001 -14.115 -0.549
## .pay 7.214 3.869 1.864 0.062 7.214 0.232
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .age 16.208 2.556 6.342 0.000 16.208 0.961
## .weight 9.902 11.176 0.886 0.376 9.902 0.086
## .height 11.111 2.486 4.470 0.000 11.111 0.397
## .HR 40.791 17.988 2.268 0.023 40.791 0.353
## .pay 59.610 10.782 5.529 0.000 59.610 0.715
## body 0.654 0.761 0.859 0.390 1.000 1.000
## .performance 31.977 17.883 1.788 0.074 0.428 0.428
semPaths(result.fit3,what="stand",style="lisrel")
年齢とホームラン,年齢と年収が「相関している」というのはちょっと意味がわからないですね。年齢が年収に別の影響を与えているということでしょうか。
model3 <- '
body =~ weight + height
performance =~ HR + pay
performance ~ body
pay ~ age
'
result.fit3 <- sem(model3,data=model.data)
summary(result.fit3,fit.measures=T,standardized=T)
## lavaan (0.5-22) converged normally after 77 iterations
##
## Number of observations 81
##
## Estimator ML
## Minimum Function Test Statistic 16.524
## Degrees of freedom 4
## P-value (Chi-square) 0.002
##
## Model test baseline model:
##
## Minimum Function Test Statistic 146.393
## Degrees of freedom 10
## P-value 0.000
##
## User model versus baseline model:
##
## Comparative Fit Index (CFI) 0.908
## Tucker-Lewis Index (TLI) 0.770
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -1322.919
## Loglikelihood unrestricted model (H1) -1314.657
##
## Number of free parameters 10
## Akaike (AIC) 2665.838
## Bayesian (BIC) 2689.783
## Sample-size adjusted Bayesian (BIC) 2658.246
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.197
## 90 Percent Confidence Interval 0.105 0.299
## P-value RMSEA <= 0.05 0.007
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.089
##
## Parameter Estimates:
##
## Information Expected
## Standard Errors Standard
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## body =~
## weight 1.000 10.163 0.945
## height 0.409 0.064 6.428 0.000 4.157 0.786
## performance =~
## HR 1.000 10.300 0.959
## pay 0.463 0.134 3.467 0.001 4.771 0.507
##
## Regressions:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## performance ~
## body 0.648 0.122 5.305 0.000 0.640 0.640
## pay ~
## age 0.801 0.204 3.927 0.000 0.801 0.349
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .weight 12.293 13.202 0.931 0.352 12.293 0.106
## .height 10.720 2.759 3.885 0.000 10.720 0.383
## .HR 9.328 24.898 0.375 0.708 9.328 0.081
## .pay 55.052 10.162 5.417 0.000 55.052 0.621
## body 103.286 22.286 4.635 0.000 1.000 1.000
## .performance 62.694 27.205 2.304 0.021 0.591 0.591
semPaths(result.fit3,what="stand",style="lisrel")
ちょっとはましになったかな?
ちなみに,この最後のモデルは,<選手力>が<パフォーマンス>に影響し,年齢とともにそれが収入に影響を与える,という経路を説明しています。このようなステップを踏む回帰モデルのことをパス解析と言います。
今回はこうして結果が得られましたが,実際のデータを使うと結構エラーがでて困ることがあります。少しエラーの解説をします。
lavaan WARNING: model has NOT converged! という警告は「モデルは収束しませんでした」という意味です。モデルが収束する,というのは「計算結果が出る」ということで,この警告が出たらそもそも答えが出ていない,出ていたとしても間違えた数字になっている,ということです。
理由はいくつか考えられます。
lavaan WARNING: some estimated ov variances are negative これは「いくつかの分散(の推定値)が負の数になったよ」という意味です。分散は理論的に正の数字にしかならない(二乗和だから)のに,あなたのモデルで計算するとどうしてもいくつかが負の数にならないと理屈が合わない,という警告です。答えは一応示されることがありますが,信用してはいけません。
lavaan WARNING: some observed variances are (at least) a factor 1000 times larger than others; use varTable(fit) to investigate これは訳すと「いくつかの観測変数が(少なくとも)他のものより1000倍の単位を持っているよ」という意味です。桁が違いすぎるので大丈夫かおい,ってことです。
今回は年収のデータがそれに当たっていました。ゲームに出る回数はせいぜい3桁なのに,年収は何千万,とかだったりするので,警告が出たのです。心理系の一般的なデータの場合はこういう問題があまり生じないから心配ないんですけど。
この他,SEMをやっていると警告やエラーが出ます。問題の根本的な解決のためには,SEMの数学的側面や理論的側面を学ばねばなりません。授業の範囲を超えますので,それらについてはこの本(http://amzn.to/2g61tlJ)などが参考になろうかと思います。
潜在変数を仮定するモデルで因子を想定することができましたが,前回の因子分析とどこが違うのでしょうか?
前回の因子分析では,因子数がいくつなのか,どの項目がどの因子に関係するのかがわからないまま手探りで分析を始めました。そのやり方を探索的因子分析;Exploratory Factor Analysis,EFA と言います。
SEMで因子を想定してモデルを書くときは,どの項目がどの因子に関係するのか,仮説的なモデルを当てはめるのですから,このやり方を検証的因子分析;Conformatory Factor Analysis:CFAと言います。
先行研究などで因子の構造がすでにわかっている場合は,CFAをすると良いでしょう。 先行研究がないとか,先行研究と違う項目が入っている,対象が随分変わっているなどの理由でゼロベースで考え直したい時はEFAをやりましょう。 あるいは,CFAでどうにもモデルの適合度が悪い場合は,EFAで本当に仮説モデルが再現できそうなのか,チェックしてみてもいいでしょう。
SEMを使ってモデルを書くことができる利点の一つは,同じモデルを複数のデータに当てはめることができるという点です。 これはモデルの妥当性を検証する場合に適しています。 同じモデルを当てはめる時に,様々な制約・統制をかけたりすることで,群間の違いがどこにあるかを検証することもできます。
この分析方法を多母集団同時分析と言います。
今回のモデルを,セリーグとパリーグで比較してみましょう。
result.fit4 <- sem(model3,data=baseball,group = "CP")
## Warning in lav_object_post_check(lavobject): lavaan WARNING: some estimated
## ov variances are negative
summary(result.fit4,fit.measures=T,standardized=T)
## lavaan (0.5-22) converged normally after 376 iterations
##
## Number of observations per group
## P 77
## C 66
##
## Estimator ML
## Minimum Function Test Statistic 16.661
## Degrees of freedom 8
## P-value (Chi-square) 0.034
##
## Chi-square for each group:
##
## P 3.172
## C 13.489
##
## Model test baseline model:
##
## Minimum Function Test Statistic 188.696
## Degrees of freedom 20
## P-value 0.000
##
## User model versus baseline model:
##
## Comparative Fit Index (CFI) 0.949
## Tucker-Lewis Index (TLI) 0.872
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -2378.357
## Loglikelihood unrestricted model (H1) -2370.026
##
## Number of free parameters 28
## Akaike (AIC) 4812.714
## Bayesian (BIC) 4895.673
## Sample-size adjusted Bayesian (BIC) 4807.077
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.123
## 90 Percent Confidence Interval 0.033 0.207
## P-value RMSEA <= 0.05 0.077
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.062
##
## Parameter Estimates:
##
## Information Expected
## Standard Errors Standard
##
##
## Group 1 [P]:
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## body =~
## weight 1.000 9.857 0.966
## height 0.472 0.101 4.656 0.000 4.654 0.714
## performance =~
## HR 1.000 8.027 0.967
## pay 0.555 0.222 2.503 0.012 4.454 0.428
##
## Regressions:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## performance ~
## body 0.454 0.115 3.954 0.000 0.558 0.558
## pay ~
## age 1.092 0.241 4.530 0.000 1.092 0.418
##
## Intercepts:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .weight 86.143 1.163 74.092 0.000 86.143 8.444
## .height 181.364 0.743 244.062 0.000 181.364 27.813
## .HR 8.974 0.946 9.483 0.000 8.974 1.081
## .pay -18.077 7.270 -2.486 0.013 -18.077 -1.735
## body 0.000 0.000 0.000
## .performance 0.000 0.000 0.000
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .weight 6.924 17.843 0.388 0.698 6.924 0.067
## .height 20.858 5.202 4.009 0.000 20.858 0.491
## .HR 4.531 21.977 0.206 0.837 4.531 0.066
## .pay 69.759 13.121 5.317 0.000 69.759 0.643
## body 97.160 24.439 3.976 0.000 1.000 1.000
## .performance 44.377 23.369 1.899 0.058 0.689 0.689
##
##
## Group 2 [C]:
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## body =~
## weight 1.000 6.127 0.558
## height 1.272 1.048 1.213 0.225 7.792 1.264
## performance =~
## HR 1.000 1.080 0.117
## pay 27.166 319.951 0.085 0.932 29.334 2.714
##
## Regressions:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## performance ~
## body 0.011 0.137 0.084 0.933 0.065 0.065
## pay ~
## age 0.964 0.253 3.805 0.000 0.964 0.389
##
## Intercepts:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .weight 89.652 1.351 66.380 0.000 89.652 8.171
## .height 182.697 0.759 240.799 0.000 182.697 29.640
## .HR 11.606 1.134 10.235 0.000 11.606 1.260
## .pay -15.345 8.101 -1.894 0.058 -15.345 -1.420
## body 0.000 0.000 0.000
## .performance 0.000 0.000 0.000
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .weight 82.842 33.307 2.487 0.013 82.842 0.688
## .height -22.721 48.710 -0.466 0.641 -22.721 -0.598
## .HR 83.702 19.953 4.195 0.000 83.702 0.986
## .pay -761.344 10060.586 -0.076 0.940 -761.344 -6.515
## body 37.545 33.654 1.116 0.265 1.000 1.000
## .performance 1.161 13.730 0.085 0.933 0.996 0.996
それぞれのグループでの影響力の違いなどを見ることができます。
「M-plusとRによる構造方程式モデリング入門」のサンプルデータを配布します。これは,友人や周囲の人から情緒的なサポートを受け取っていることと,友人や周囲の人に情緒的なサポートを提供していることが,関係満足感や主観的幸福感に影響を与えるという心理学的な仮説を検証するためのデータです。
データファイルには,ID,relation,V1-V14,statis,swbという変数が入っていますが,ここでIDは個人番号,relationは関係の違い(友人関係か恋愛関係か),v1-v7はサポートを受け取ったかどうか,v8-v10はサポートを提供しているかどうかについての項目群,statisは関係満足スコア,swbは主観的幸福感スコアです。
これらを使って,次のことを確かめてください。
ちょっと高度ですが,頑張ってね。 それともう一つ。
以上です。