semパッケージでのモデルの記述方法は複数あります。今回は因子分析なので確認的因子分析に便利なcfa()関数を使った記述方法を使ってみたいと思います。
まずは、データを読み込んで、"学年"という変数をファクターに変換し、その次にモデルを記述します。
c04fact$学年 <- factor(c04fact$学年, labels = c("小学6年生","中学1年生")) #ファクターに変換
c04fact.mdlA <- cfa()
数的処理 : 記号操作, 図形, 計算, 文章問題
#
(c04fact.mdlA) #モデル記述を表示
c04fact.mdlA <- cfa()
数的処理 : 記号操作, 図形, 計算, 文章問題
#
(c04fact.mdlA) #モデル記述を表示
これは楽ちんですね。"記号操作 -> 数的処理"のパスにはちゃんと制約がついていて、誤差分散もきっちり入っています。このc04fact.mdlAをつかって、集団ごとの分析と配置不変の検討に進みたいと思います。
次の計算では、sem()の中で共分散を計算する変数を指定するformulaオプションを書いています。デフォルトでは formula = ~. ということです。これまでの例では指定する必要がなかったのですが、このモデルで指定しないと「res_u %*% w_adf : 適切な引数ではありません」と叱られてしまいました。
opt <- options(fit.indices = c("GFI","AGFI","RMSEA","CFI","AIC"))
c04fact.mgmdl0 <- multigroupModel(c04fact.mdlA, groups=levels(c04fact$学年))
summary(c04fact.gmsem0 <-
sem(c04fact.mgmdl0, data = c04fact, group = "学年",
formula = ~ 記号操作 + 計算 + 文章問題 + 図形))
c04fact.mgmdl0 <- multigroupModel(c04fact.mdlA, groups=levels(c04fact$学年))
summary(c04fact.gmsem0 <-
sem(c04fact.mgmdl0, data = c04fact, group = "学年",
formula = ~ 記号操作 + 計算 + 文章問題 + 図形))
適合度について、集団ごとの評価は記載のとおりとなりました。配置不変性を検討すると、GFIとCFIは記載どおり記載どおりの値です。RMSEAは記載よりも大きく、習慣的基準よりもすこし大きくなりました(習慣的基準とは0.05以下と理解していますが)。パス解析でもそうでしたが、semパッケージで多母集団分析でモデルから推定されるRMSEAはAmosのそれより大きくなる傾向があるのかもしれません。インチキな私は推計方法を理解していないので、詳しくはわかりません。
4.7の測定不変モデルを推計してみます。
ここで、cfa()でモデルを記述したことの失敗が判明しました。どうやら、semパッケージが自動で付与してくれたパラメータの名称は変更できないようなのです。削除して追加しなおすのもわかりにくいので、やむなく矢印式で書きなおし、update()を使って修正したモデルをもうひとつ記述することにします。
##測定不変モデル
c04fact.mdlA <- specifyModel()
数的処理 -> 記号操作, NA,1
数的処理 -> 図形, path1, NA
数的処理 -> 計算, path2, NA
数的処理 -> 文章問題, Path3, NA
数的処理 <-> 数的処理, V1, NA
記号操作 <-> 記号操作, V2, NA
図形 <-> 図形, V3, NA
計算 <-> 計算, V4, NA
文章問題 <-> 文章問題 ,V5, NA
#
c04fact.mdlB <- update(c04fact.mdlA)
replace, V1, V1B
replace, V2, V2B
replace, V3, V3B
replace, V4, V4B
replace, V5, V5B
#
c04fact.mdlA <- specifyModel()
数的処理 -> 記号操作, NA,1
数的処理 -> 図形, path1, NA
数的処理 -> 計算, path2, NA
数的処理 -> 文章問題, Path3, NA
数的処理 <-> 数的処理, V1, NA
記号操作 <-> 記号操作, V2, NA
図形 <-> 図形, V3, NA
計算 <-> 計算, V4, NA
文章問題 <-> 文章問題 ,V5, NA
#
c04fact.mdlB <- update(c04fact.mdlA)
replace, V1, V1B
replace, V2, V2B
replace, V3, V3B
replace, V4, V4B
replace, V5, V5B
#
c04fact.mgmdl1 <- multigroupModel(c04fact.mdlA, c04fact.mdlB, groups = levels(c04fact$学年))
summary(c04fact.gmsem1 <- sem(c04fact.mgmdl1, data = c04fact, group = "学年",
formula = ~ 記号操作 + 計算 + 文章問題 + 図形))
summary(c04fact.gmsem1 <- sem(c04fact.mgmdl1, data = c04fact, group = "学年",
formula = ~ 記号操作 + 計算 + 文章問題 + 図形))
測定不変モデルは配置不変モデルと比べると、RMSEAとAICが小さくなっています。
本と比較するとAICは記載どおりの値ですが、RMSEAはやや大きく習慣的基準値を若干上回り、信頼区間はかなり広くなっています。パス係数はほぼ一致しています。本ではパス係数を制約して分散を計算させているのでsem()の出力とそのまま比較できますが、少し大きいようです。
ここまでの多母集団分析でパス係数やGFI、AICはAmosとほぼ一致するのですが、RMSEAは大きくなりました。もしsemパッケージでは必ずそうなるのならば、RMSEAはモデルの採用時にはほとんど常に参照される適合度指標になっているように思うので、少し厄介だなと感じます。