11月ころにコメントで質問をいただいていたようで、その解説です。これだけ間が空くと、質問者は既に解決済みかもしれませんが・・・。
TIMSSで教員データを使うとサンプルサイズが増える?!
TIMSSで教員データを使わない場合と使う場合では、データのサンプルサイズが変わる(ように見える)。以前の記事を参考に、教員データを使わない場合(jpn)と使う場合(jpn2)のサンプルサイズを比較してみよう。
library(foreign) library(plyr) library(intsvy) # 教員データを使わない場合 jpfile <- c("ASGJPNM6.sav", "ASHJPNM6.sav", "ACGJPNM6.sav") dat <- lapply(jpfile, function(x) { read.spss(x, to.data.frame = TRUE, use.value.labels = FALSE) }) jpn <- join_all(dat); rm(dat) # 教員データを使う場合 jpfile2 <- c(jpfile, "ASTJPNM6.sav", "ATGJPNM6.sav") dat2 <- lapply(jpfile2, function(x) { read.spss(x, to.data.frame = TRUE, use.value.labels = FALSE) }) jpn2 <- join_all(dat2); rm(dat2) # サンプルサイズを比べる nrow(jpn) # 4383 nrow(jpn2) # 8596
前者は4383/後者は8596であり、およそ倍になっている。これはどうしたことか。
これは、TIMSSの設計に関係がある。TIMSSは(ほとんどの国で)まず学校を抽出し、続いて学級を抽出する二段階抽出を採用している。そして教員データについては、「対象となった児童生徒を教えている教員」が調査対象になっている。つまり、一人の児童生徒に対して、複数の教員が調査対象になっている可能性があるということだ。
そのため、教員データを利用した分析では、「複数の教員に同一の児童生徒を結びつける必要がある(児童aを、教員Aと教員Bが教えている場合、児童aのデータは教員Aにも教員Bにも結びつけないといけない)」ことになる。
先のデータ(jpnとjpn2)で、このことを確認してみよう。学校番号148に属する児童のIDを表示してみる。
table(jpn$IDSTUD[jpn$IDSCHOOL == 148]) table(jpn2$IDSTUD[jpn2$IDSCHOOL == 148])
ここでわかるのは、jpnでは1人ずつだった児童のIDが、jpn2では3人になっているということである。恐らくこの学校では、3人の教員が児童に算数を教えていたのだろう。
以上が、教員データを利用するとサンプルサイズが増加するように見える理由である。
分析時の注意点
では、分析時にどのようなことに注意すればよいのだろうか。重要なことは、教員データを使うとデータセット内に同一の児童生徒のデータが複数存在することになるから、そのまま分析すると推定を間違えるという点だろう。たとえば、intsvy library中のtimss.mean.pv関数を使ってみよう。
timss.mean.pv(pvlabel = "ASSSCI", data = jpn) timss.mean.pv(pvlabel = "ASSSCI", data = jpn2)
2つの推定は結果が異なっているはずである(正しいのはjpnの方)。
上記の問題に対処するために、教員データを利用するときは、それ専用のweight(TCHWGT、MATWGT、SCIWGT)を使わなければならない(それぞれ教員、数学、理科のweightのようである。詳しいことはTechnical Reportに書いてあると思うが、時間がなくて読めていない。とりあえず以下の計算は、いずれを使っても同じ値になる)。
intsvy libraryを利用する場合は、intsvy.mean.pv関数を使えばよい。ちなみに、timss.mean.pvやpisa.mean.pvは、intsvy.mean.pv関数のconfigをtimss用/pisa用にあらかじめ設定した関数である(このことは、Rで、たんにtimss.mean.pvとだけ打てばわかる)。そのため、TOTWGTではなく、TCHWGT等を使うようにconfigを設定すれば、正しい推定値が計算できるようになる。
timss4_conf$variables$weight <- "SCIWGT" # configの設定。初期値は"TOTWGT"なので"SCIWGT"で上書きする。 intsvy.mean.pv(pvnames = paste0("ASSSCI0", 1:5), data = jpn2, config = timss4_conf)