Triad sou.

class statement の reference group

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 とかを使って掃き出してしまえば良いと思います。