2012年10月4日木曜日

共分散構造分析[R編]ってないの?[第3章7]その1

「共分散構造分析[Amos編]-構造方程式モデリング-」の64頁、図3.21の確認的因子分析です。
test1.mdl <- specifyModel()
  文系学力 -> 国語, p1, NA
  文系学力 -> 地理, p2, NA
  文系学力 -> 英語, p3, NA
  理系学力 -> 数学, p4, NA
  理系学力 -> 化学, p5, NA
  理系学力 -> 物理, p6, NA
  文系学力 <-> 文系学力, NA, 1
  理系学力 <-> 理系学力, NA, 1
  文系学力 <-> 理系学力, c1, NA
  国語 <-> 国語, e1, NA
  地理 <-> 地理, e2, NA
  英語 <-> 英語, e3, NA
  数学 <-> 数学, e4, NA
  化学 <-> 化学, e5, NA
  物理 <-> 物理, e6, NA

summary(test1.sem <- sem(test1.mdl, S=cor(test), N=nrow(test)))
pathDiagram(test1.sem,ignore.double=FALSE, rank.dir="TB",
      same.rank="文系学力,理系学力",
             standardized = TRUE, 
      node.font=c("IPAGothic",12), edge.labels="values")

今回はsem()関数には相関行列を使いました。
パス図も描いてみました。edge.labels="names"のdotファイルを示します。
digraph "test1.sem" {
  rankdir=TB;
  size="8,8";
  node [fontname="IPAGothic" fontsize=12 shape=box];
  edge [fontname="Helvetica" fontsize=10];
  center=1;
  {rank=same "文系学力" "理系学力"}
  "文系学力" [shape=ellipse]
  "理系学力" [shape=ellipse]
  "文系学力" -> "国語" [label="p1"];
  "文系学力" -> "地理" [label="p2"];
  "文系学力" -> "英語" [label="p3"];
  "理系学力" -> "数学" [label="p4"];
  "理系学力" -> "化学" [label="p5"];
  "理系学力" -> "物理" [label="p6"];
  "文系学力" -> "文系学力" [label="" dir=both];
  "理系学力" -> "理系学力" [label="" dir=both];
  "文系学力" -> "理系学力" [label="c1" dir=both];
  "国語" -> "国語" [label="e1" dir=both];
  "地理" -> "地理" [label="e2" dir=both];
  "英語" -> "英語" [label="e3" dir=both];
  "数学" -> "数学" [label="e4" dir=both];
  "化学" -> "化学" [label="e5" dir=both];
  "物理" -> "物理" [label="e6" dir=both];
}

共分散構造分析[R編]ってないの?[第3章6]その3 PLSモデル

図3.19は端折って、「共分散構造分析[Amos編]-構造方程式モデリング-」の63頁にあるPLSモデル図3.20を計算してみます。
以下のようにモデルを書いたファイルをsemi.3.20.txtとして保存しました。
テキスト -> 講師の質, p1, NA
プレゼン -> 講師の質, p2, NA
ペース   -> 講師の質, p3, NA
講師対処 -> 講師の質, p4, NA
充実感   -> 満足度,   p5, NA
充実感   -> 理解度,   p6, NA
充実感   -> 目的一致, NA, 1          #1に制約
講師の質 -> 充実感,   NA, 1          #1に制約
テキスト <-> テキスト, v1, NA
プレゼン <-> プレゼン, v2, NA
ペース   <-> ペース,   v3, NA
講師対処 <-> 講師対処, v4, NA
満足度 <-> 満足度,     e1, NA
理解度 <-> 理解度,     e2, NA
目的一致 <-> 目的一致, e3, NA
充実感 <-> 充実感,     v5, NA
講師の質 <-> 講師の質, NA, 0           #0に制約
テキスト <-> プレゼン, c1, NA
テキスト <-> ペース,   c2, NA
テキスト <-> 講師対処, c3, NA
プレゼン <-> ペース,   c4, NA
プレゼン <-> 講師対処, c5, NA
ペース <-> 講師対処,   c6, NA
</-></-></-></-></-></-></-></-></-></-></-></-></-></-></->

実行します。
semi.mdl <- specifyModel("semi.3.20.txt")
(semi.sem <- sem(semi.mdl, data=semi.data, debug=TRUE))
summary(semi.sem)
stdCoef(semi.sem)
round(1-diag(semi.sem$P[-8,-8] / semi.sem$S),2)
round(cov2cor(semi.sem$P),2)

講師の質の分散を1に制約すると、充実感の分散が負になってしまいます。
淡々とやりましたが、少し気になることがあります。名城大学人間学部人間学科神谷研究室ホームページの共分散構造分析でも、「原因をさぐる統計学」(講談社ブルーバックス)に記載されているデータを基にRでPLSモデルを計算しておられます。ここでは、「洋食傾向」という指標化された変数があって、その分散の制約は1になっています。上で書いたこととは違うじゃん。実際、制約を1にすると本に記載されている係数が求められます。「洋食傾向」の制約を0にすると識別できません。
ついでに試してみると、制約を1にした場合でも、相関係数ではなく元データをそのものをデータフレームでsem()関数に与えると識別できません。 どういうことなんだ!わけわかんない。(@o@)そう、僕は嘘つきというより、ばかなんですよね。