elsur.jpn.org >

« 覚え書き:cross-classifiedなマルチレベルモデル | メイン | 読了: Pearl (2019) わがdo(x)オペレータの正しい解釈 »

2019年1月20日 (日)

 構造方程式モデリング界の帝王、泣く子も黙るMplus様には分厚いマニュアルがついていて、膨大な数のモデル例が紹介されている。そのなかには私には到底理解できないものもあれば、いっけん易しそうだがよく考えてみるとわけがわからないものもある。
 後者のひとつがExample 9.26「Cross-classifiedデータのランダム二値項目IRTモデル」で、よんどころない都合により、本日はずっとこの事例についてあれこれ思い悩んでいた。そりゃあ出世しないわ...!
 
 というわけで、この事例について考えたことをメモしておく。文字通り、私の・私による・私のためのメモであって、いちいちブログに書くんじゃないよ、情けないな、という気もする。

 Example 9.26とはこういうモデルである。Mplus 7.2から追加された TYPE=CROSSCLASSIFIEDを使っている。

VARIABLE: NAMES = u subject item; 
CATEGORICAL = u;
CLUSTER = item subject;
ANALYSIS: TYPE = CROSSCLASSIFIED RANDOM;
ESTIMATOR = BAYES;
PROCESSORS = 2;
MODEL: %WITHIN%
%BETWEEN subject%
s | f BY u;
f@1;
u@0;
%BETWEEN item%
u; [u$1];
s; [s];

 Mplusのサイトで公開されているデータを確認したところ、クラスタ変数 item は50水準, subjectは100水準。で、subject * item ごとに1行を持つ5000行のデータである。

 このモデルを数式で表現してみよう。
 
 コードに登場する変数は、u, item, subjectの3つ。そのうちitem と subject はCLUSTER=に指定されている。以下、subject を$i$, item を$j$とする。データの構造をコードから知るのは難しいが、上で確認したように、u は subject * item ごとにひとつ得られている二値の測定値である。これを$u_{ij}$と書く。

 VARIABLEセクションの注目点は2つ。

 MODELセクションに移ろう。

 Mplusでは、カテゴリカル従属変数の背後には連続潜在変数が想定される。これを$u^*_{ij}$と書く。デフォルトではプロビット・リンクになる。つまり、標準正規分布関数を$\Phi$として
 $Prob(u_{ij}=1 | u^*_{ij}) = \Phi(u^*_{ij} - \tau)$
である。%BETWEEN item%に [u$1] と指定されているから、ついつい$\tau$が item ごとに動くのかと考えてしまったのだが、そうではない。(ここも私が混乱した点のひとつであった。考えてみれば、通常のTWOLEVELモデルで%BETWEEN%に [u$1]と指定したら、それは動かないよね。落ち着け俺)
 
 なお、Mplusのアウトプット上では、[u$1]は item レベルのパラメータとして扱われる。%BETWEEN item%に[u$1]と書こうが書くまいが結果は変わらない。%BETWEEN subject%に[u$1]と書くとエラーになり、ふたつあるBETWEENのどっちかで固定しろといわれる。そこで

MODEL:    %WITHIN% 
%BETWEEN subject%
s | f BY u;
f@1;
u@0; [u$1];
%BETWEEN item%
u; [u$1@0];
s; [s];
と書くと、推定は走るけど、パラメータu$1は0に固定され、結果として自由パラメータがひとつ減る。想像するに、MODEL=CROSSCLASSIFIEDにおいてカテゴリカル従属変数の閾値を推定する際は、レベル2B(つまり、CLUSTER=で1つめに指定したクラスタ変数のレベル)でしか指定できない、というルールがあるのかもしれない。

 ここからは$u^*_{ij}$のモデル。

 まずは、説明変数は無視して残差項にだけ注目しよう。uは%WITHIN%には登場せず、%BETWEEN subject%では u@0, %BETWEEN item%では u となっている。つまり、残差はsubject間では動かず、item間で動く。itemを「テスト項目」と捉えるなら、残差という言い方はなんだか変だな。むしろ切片というべきであろう。これを$a_j$と書き、その分散を$\sigma_a^2$と書こう。

 いよいよ説明変数について考える。はい深呼吸!
 %BETWEEN subject%に s | f BY u と指定されている。つまり、われらが $u^*_{ij}$は謎の潜在変数 f の指標なのだ。この潜在変数を $F$と書こう。[f]という記載がどこにもないので平均は0, f@1とあるので分散は1である。

 sは因子負荷である。おさらいしよう。Mplusでは、縦棒を使って傾きや因子負荷に名前を付けると、それはただの傾き・因子負荷ではなく、BETWEENレベルで変動するランダム傾き・ランダム因子負荷になる。通常の階層モデル(TYPE=TWOLEVEL RANDOM)では、%WITHIN%において s | y ON x; とかs | f BY y; と指定するのが常道である。このとき、WITHINレベルでは(つまりクラスタの中では) s は変動しない。ただし、ランダム傾きに限り、アスタリスクをつけて s* | y ON x; と書けば、sはクラスタ内でも変動する。
 しかし TYPE = CROSSCLASSIFIED RANDOMでは勝手が違う。まず、ランダム傾きだろうがランダム因子負荷だろうがアスタリスクは使えない。つまり、そのレベルでは変動しない。さらに、%WITHIN%だけでなく%BETWEEN%でも指定できてしまう。%BETWEEN%で指定した場合、そのレベルでは変動しないけど、隣のレベルでは変動しうるのだ。びっくり!
 ここでは、sは%BETWEEN subject%で定義され、%BETWEEN item%で s; [s]; とある。ってことは、このモデルでは、因子負荷 s は subject によっては動かないが、itemによって動くのだ。sを $s_j$と書き、その平均を$\mu_s$, 分散を$\sigma_s^2$と書こう。

 というわけで、この事例を数式で書き下ろすと、こういうモデルだと思う。
 $Prob(u_{ij}=1 | u^*_{ij}) = \Phi(u^*_{ij} - \tau)$
 $u^*_{ij} = a_j + s_j F_i $
 $E(F) = 0, \ \ Var(F) = 1$
 $a_j \sim N(0, \sigma_a^2), s_j \sim N(\mu_s, \sigma_s^2)$
推定するパラメータは、$\tau, \mu_s, \sigma_s^2, \sigma_a^2$の4つである。

 つまりこのモデルは、50指標1因子のカテゴリカル因子分析モデル、ないしIRTモデルといってよいと思う。ちがいは、因子負荷$s_1, \ldots, s_{50}$, 項目切片$a_1, \ldots, a_{50}$をモデルのパラメータとみるのではなく、確率変数の実現値として捉えているという点である。

雑記:データ解析 - 覚え書き: Cross-classifiedデータのランダム二値項目IRTモデルをMplusで表現する