2017年3月21日火曜日

欠損値の分類も集計に含めるMISSINGオプションと落とし穴



多くの集計用プロシジャでは、分類変数が欠損値のオブザベーションを集計から除きます。



サンプルデータ

data DT1;
input A B C;
cards;
1 1 10
. 1 10
2 1 10
. 1 10
;


変数Aには欠損値が含まれてます。



分類に欠損値が含まれている場合の集計結果

proc freq での例

proc freq data=DT1;
   tables A * B;
run;









変数Aの欠損値2オブザベーションが集計から除かれています。
欠損値も含め集計したい場合、missingオプションをつけます。

proc freq data=DT1;
   tables A * B / missing;
run;



同様に proc means や proc summary でもclass変数が欠損値のオブザベーションは集計から除かれます。
missingオプションをつけるとclass変数が欠損値のものも含め集計されます。

proc means data=DT1;
   class A / missing;
   var C;
run;


proc tabulateも同様。

proc tabulate data=DT1;
   class A / missing;
   table A;
run;




落とし穴①

まずは、proc freq の「なんじゃそりゃ」という落とし穴(proc means や proc tabulateでは問題なさそう)
以下の例をご覧ください。

proc format;
   value A_
      . , 1 = "Missing and One"
      2 = "Two"
   ;
run;

proc freq data=DT1;
   tables A * B;
   format A A_.;
run;



変数Aに欠損値と1をまとめた "Missing and One" というフォーマットを設定して集計しています。
missingオプションを設定していないので、欠損値は集計から除かれますが、なんと、、A=1も欠損値の扱いになって集計から除かれています。

フォーマットで欠損値と非欠損値を1つのカテゴリにまとめた場合、
実データに欠損値が存在すると、同じカテゴリの非欠損値のデータも巻き込んで、欠損値の扱いにしてしまうようです。



落とし穴②

既にSASYAMAさんが記事にされているので、そちらをご覧ください。
means summaryプロシジャのclassステートメント指定変数の欠損値には気を付けてって話

classステートメントに変数を複数指定する場合は注意という話です。
class変数のいずれかに欠損値が含まれている場合、missingオプションがないとそのオブザベーションが全ての集計から除かれてしまいます。



落とし穴③

これも上のSASYAMAさんの記事で注意喚起されていますが、
proc means や proc summary の outputステートメントで集計結果をデータセットに出力すると、

proc means data=DT1;
   class A B / missing;
   var C;
   output out=OUT1 n= mean= / autoname;
run;

集計結果:結果ビューア

集計結果:出力データセットOUT1

出力データセットの方は、結果ビューアにない組み合わせも出力されています。
例えば、出力データセットの1行目は変数AとBの分類全体に対する集計結果です(ただしmissingオプションがない場合、変数AかBが欠損値のオブザベーションは除いたうえで集計される)

特にmissingオプションを設定していると、どの組み合わせに対する集計なのか、分かりづらいです(例:1行目と3行目)


変数_TYPE_で上記の違いを区別することが出来るものの、「紛らわしいので要らない!」というケースがほとんどなので、、

proc means data=DT1 nway;
   class A B / missing;
   var C;
   output out=OUT1 n= mean= / autoname;
run;

nwayオプションで結果ビューアと同じ組み合わせの数に減らせます。


0 件のコメント:

コメントを投稿