PLANプロシジャとMEANSプロシジャ・CLASSDATAステートメントのコラボで欠損水準を0で補完した集計を行う

最初に、今回のプログラムにあえてproc planを使用する必然性はありません。ただ、他の目的を持ったプロシジャも視点を変えると思ってもみない用途に使えるということを示す例、まぁ詰まる所はお遊びなんですが。

さて、PLANプロシジャは本来、実験計画・割付に使用するプロシジャですが今回は、MEANS(SUMMARRY)プロシジャのCLASSDATA=オプションで指定する水準データセットをproc planで作ってみます。

いま、

data Q_1;
 LEVEL_1=1;LEVEL_2='B';FLAG=1;output;
 LEVEL_1=1;LEVEL_2='B';FLAG=1;output;
 LEVEL_1=2;LEVEL_2='C';FLAG=1;output;
 LEVEL_1=3;LEVEL_2='A';FLAG=1;output;
run;


こういうデータセットがあって、LEVEL_1はとりうる値が1-3、LEVEL_2はA-Cだという前提条件があって、以下のように、出現していない水準の組み合わせを0で集計したい場合があるとします。



さて、まずはproc planで、水準の情報を与えて、とりうる組み合わせのフルセットがはいった
データセットを作成します。

proc plan;
 factors LEVEL_1=3 LEVEL_2=3 ordered /noprint;
 output out=CLDS
  LEVEL_2 cvals=('A' 'B' 'C');
run;
quit;

randomステートメントなしのproc planはなんだか斬新というか違和感ありありですが、
上記の結果、生成されるデータセット「CLDS」は


こうなります。3水準×3水準なので9水準がフルセットですね。

そこで後は普通にmeansプロシジャのclassdata=で上記のCLDSを指定すれば

proc means data=Q_1
            classdata=CLDS
            noprint nway exclusive;
            class LEVEL_1 LEVEL_2;
            var FLAG;
            output out=A_1(drop=_TYPE_ _FREQ_) N=COUNT;
run;



となって完成です。

なおmeans プロシジャのclassdata=についてはまた、いつか改めて説明しますが
classdata=で指定のデータセットとdata=のデータセットのclassステートメントで指定された変数の
長さ、ラベル、フォーマット、インフォーマットが同一でないとエラーになるので
集計したいデータセットにメタデータが定義されている場合は

proc datasets nolist;
 modify Q_1;
  attrib _all_ informat= format= label='';
quit;

定義情報をリセットしておくことをお勧めします。


ちなみに、、あえてPLANプロシジャつかわなくて
data CLDS;
 do LEVEL_1=1 to 3;
  do LEVEL_2='A','B','C';
   output;
  end;
 end;
run;

で、いいので、こっちの方がよいかもしれません。

ただ、現実での実践例が思いつきませんが、ランダムに決定される水準セットによって
集計するような処理を書く場合(どんな場合だ??)、ploc planならスムーズかもしれませんね
(その場合でもデーステップで rand関数で、classデータ作成してやりゃいいんですけどね)



0 件のコメント:

コメントを投稿