SAS を使って一般化線形モデルで解析するときの、class statement の挙動を調べてみました。
genmod, logistic, tphreg とかの class statement の話なので、anova 系の class statment では以下のオプションを指定するとエラーがでるかもしれません。
また、全て param = ref を指定した場合の話になっています。
まずは例として使うフォーマットとデータの準備をします。
フォーマットは例示に使うため 3 種類 (fmta1c, fmta2c, fmta3c) 作成しました。
データは変数 group が群変数で、1, 2, 3 という値をとります。この変数に上の 3 種のフォーマットを与えて、class statement の挙動を検討していきます。
/********************************/ /* format & pseudo random number generation */ proc format; value fmta1c 1 = 'class1' 2 = 'class2' 3 = 'class3'; value fmta2c 1 = 'Z1' 2 = 'A2' 3 = 'M3'; value fmta3c 1 = 'Grape' 2 = 'Banana' 3 = 'Apple'; data Class; do group = 1, 2, 3; do i = 1 to group * 20; y = rand('Normal', group, 1); output; end; end; run;
また、出力例では
------------------- -------------------
で囲んだ部分が、解析したときに用いられる design matrix を表示したものになっています。
その1: order = data
このオプションを入れると、データのソート順に design matrix のラベルを貼り替える。
/* case1: order = data */ proc sort data = Class; by group; proc genmod data = Class; class group / order = data param = ref; model y = group / noint d = n link = id noscale; run; ------------------- Design Value Variables 1 1 0 2 0 1 3 0 0 ------------------- proc sort data = Class; by descending group; proc genmod data = Class; class group / order = data param = ref; model y = group / noint d = n link = id noscale; run; ------------------- Design Value Variables 3 1 0 2 0 1 1 0 0 -------------------
その2: order = freq
このオプションを入れると、データの数でソートして design matrix のラベルを貼り替える(グループ 1, 2, 3 のデータの数はそれぞれ 10, 20, 30)。
/* case2: order = freq */ proc genmod data = Class; class group / order = freq param = ref; model y = group / noint d = n link = id noscale; run; ------------------- Design Value Variables 3 1 0 2 0 1 1 0 0 -------------------
その3: order = internal
このオプションを入れると、群の値でソート (コードでも文字でも普通にソートされる) して design matrix のラベルを貼り替える。
/* case3: order = internal */ proc genmod data = Class; class group / order = internal param = ref; model y = group / noint d = n link = id noscale; run; ------------------- Design Value Variables 1 1 0 2 0 1 3 0 0 -------------------
その4: order = formatted
このオプションを入れると、フォーマットの値でソート (コードでも文字でも普通にソートされる) して design matrix のラベルを貼り替える。
/* case4: order = formatted */ proc genmod data = Class; class group / order = formatted param = ref; model y = group / noint d = n link = id noscale; format group fmta1c.; run; ------------------- Design Value Variables class1 1 0 class2 0 1 class3 0 0 ------------------- proc genmod data = Class; class group / order = formatted param = ref; model y = group / noint d = n link = id noscale; format group fmta2c.; run; ------------------- Design Value Variables A2 1 0 M3 0 1 Z1 0 0 ------------------- proc genmod data = Class; class group / order = formatted param = ref; model y = group / noint d = n link = id noscale; format group fmta3c.; run; ------------------- Design Value Variables Apple 1 0 Banana 0 1 Grape 0 0 -------------------
その5: variable(ref='reference-group')
この記法だと、reference group を直接指定できる。
データやフォーマットや出力形式が固定されている場合はこれが一番使いやすい。
注意点は指定は文字列でしか行えないところ、logistic procedure の y(event='1') と同じような形式ですね。
フォーマットが付いている場合は、フォーマットで定義された文字列を入れないといけない。
design matrix のラベルは変わらずに、「design matrix の値」が書き換えられる。
さらに format statement を追加した場合は、design matrix のラベルも変えることが出来る。
/* case5: variable(ref='reference-group') */ proc genmod data = Class; class group(ref='1') / param = ref; model y = group / noint d = n link = id noscale; run; ------------------- Design Value Variables 1 0 0 2 1 0 3 0 1 ------------------- proc genmod data = Class; class group(ref='2') / param = ref; model y = group / noint d = n link = id noscale; run; ------------------- Design Value Variables 1 1 0 2 0 0 3 0 1 ------------------- proc genmod data = Class; class group(ref='class1') / order = internal param = ref; model y = group / noint d = n link = id noscale; format group fmta1c.; run; ------------------- Design Value Variables class1 0 0 class2 1 0 class3 0 1 ------------------- proc genmod data = Class; class group(ref='class1') / descending order = internal param = ref; model y = group / noint d = n link = id noscale; format group fmta1c.; run; ------------------- Design Value Variables class3 1 0 class2 0 1 class1 0 0 -------------------
その他使えるオプション
descending: design matrixのラベルを逆転させる、sort procedure の descending と違って、変数の前ではなく「/」の後に入れないとだめ。
ref = first | last: reference groupを一番最初か最後にします、順序カテゴリ変数ならこれで充分。
class statement は procedure step 内で複数書けるので、個別にかなり細かい設定が出来る。
推定結果を表にする場合は、この後に ods output ParameterEstimates でデータセットに落として、excel dde とかを使って掃き出してしまえば良いと思います。