カテゴリ変数に対してダミー変数を作成する方法

[OS] ALL
[リリース] ALL
[キーワード] STAT, CATEGORY, DUMMY VARIABLE

[質問]

たとえば比例ハザードモデルを扱っている場合、PHREGプロシジャではCLASSステートメントがないため、カテゴリ変数を何らかの方法でダミー変数に展開する必要があります。
現在はDATAステップで上記の処理をしていますが、何か他に良い方法はありますか?

[回答]

カテゴリ変数が少なく、また水準数も少ない場合には、DATAステップを利用するのが一番簡単ですが、モデルが複雑なケースでは煩雑になってしまいます。そのようなときには、下記のSAS/STATのプロシジャを用いると、比較的容易にダミー変数を作成することが可能です。

■ GLMMODプロシジャ
GLMプロシジャと同じ展開方法でダミー変数を作成します。展開されたカテゴリ変数をデータセットへ出力するためには、OUTDESIGN=オプションを指定する、またはODS OUTPUTステートメントを使用します。なお、MODELステートメントに存在するもののCLASSステートメントでは指定されていない変数は、そのままデータセットへ出力されます。
/*OUTDESIGN=オプションを用いて、データセットout1に出力*/
proc glmmod data=a outdesign=out1 noprint;
  class drug disease; 
  model y=drug disease drug*disease;
run;

proc print data=out1;
run;

ods listing close;
/*ODS OUTPUTステートメントを用いて、データセットout2へ出力*/
ods output DesignPoints=out2;
proc glmmod data=a;
  class drug disease;
  model y=drug disease drug*disease;
run;
ods listing;

proc print data=out2;
run;

■ TRANSREGプロシジャ
変数に対してさまざまな変換を施してから回帰を行なうTRANSREGプロシジャでも、DESIGNオプションを指定してダミー変数を作成し、またOUTPUTステートメントを併せて用いてデータセットへ出力することができます。GLMMODプロシジャと比べると、やや難解なプログラムとなりますが、従属変数を必ずしも指定しなくても良いこと、また複数の展開方法がサポートされているなどのメリットもあります。
proc transreg data=a design;
  model class(drug|disease);
  output out=out3;
run;

proc print data=out3;
run;

proc transreg data=a design;
  model class(drug|disease / effect);
  /*EFFECTコーディング*/
  output out=out4;
run;

proc print data=out4;
run;
■ GLMMODプロシジャとTRANSREGプロシジャの比較
  TRANSREGプロシジャ GLMMODプロシジャ
変数数 変数と値の組合せ OUTDESIGN=を使用すると
COL1,COL2,...,COLn
ダミー変数への展開方法 オプションの指定によってカスタマイズが可能 GLMプロシジャと同じ
従属変数 不要 従属変数の指定が必要
欠損値 欠損値として出力される 欠損値を含むオブザベーションごと除外される
処理速度 GLMMODプロシジャの方が速い傾向にある
(TRANSREGプロシジャは、入力データの値から変数を作成する)
その他の機能 マクロ変数に出力変数名が格納される OUTPARM= オプションで変数名の情報を出力できる

なお、SAS/IMLにもダミー変数に展開する関数が用意されています。また、次期バージョンSAS System 9 以降では、LOGISTICプロシジャなどにも同様の機能が加わる予定です。