2016年8月26日金曜日

集計結果から必要なものだけ表示する 【ODS SELECT編】



例えば、univariateプロシジャを実行すると色々な統計量が出力されます。
この出力から必要なものだけに絞って出力する方法の紹介です。


①まずは「ODS TRACE」で出力オブジェクトの名前を調べる
ods trace on;
proc univariate data=sashelp.class;
 var age;
run;
ods trace off;


ログ


集計プロシジャを「ods trace on;」 と 「ods trace off;」で囲って実行すると、ログに上のような表示が現れます。
ログに出てきた「名前」のところにあるキーワードを覚えておきましょう。
たとえば今回出力したいのが「モーメント」と「基本統計量」であれば、「Moments」と「BasicsMeasures」という名前を覚えておきます。




②「ODS SELECT」で集計結果を絞る(注意点あり)
ods select Moments  BasicMeasures;
proc univariate data=sashelp.class;
 var age;
run;
ods select all;

結果ビューア



今度は集計プロシジャを「ods select  名前;」 と 「ods select all;」で囲い直します。
名前のところに先ほどのキーワード「Moments」「BasicsMeasures」を当てはめます。

実行すると上の通り、見事欲しい結果だけ出力することが出来ました。


📝 注意点①

2つのunivariateプロシジャに対して「Moments」と「BasicMeasures」のみ出力したい場合、以下の書き方はNG

* NG: ダメな書き方 ;
ods select Moments  BasicMeasures;
proc univariate data=sashelp.class;
 var age;
run;

proc univariate data=sashelp.class;
 var height;
run;
ods select all;

実行してみると分かりますが、
ods selectで設定した「Moments」「BasicMeasures」は、1個目のunivariateプロシジャにしか適用されていません。


以下のようにプロシジャ毎にods selectを書く必要があります。

* OK ;
ods select Moments  BasicMeasures;
proc univariate data=sashelp.class;
 var age;
run;
ods select all;

ods select Moments  BasicMeasures;
proc univariate data=sashelp.class;
 var height;
run;
ods select all;


📝 注意点

以下のプログラムを実行するとWARNINGが出て、うまくいきません。
何故でしょうか?

* NG: ダメな書き方 ;
proc reg data=sashelp.class;
 model height = age;
run;

ods select Moments  BasicMeasures;
proc univariate data=sashelp.class;
 var age;
run;
ods select all;

ログ
 WARNING: 出力'Moments'は作成されていません。出力オブジェクト名、ラベル、
          パスが正しく記述されているかを確認してください。また、
          要求した出力オブジェクトを作成するために、適切なプロシジャオプションが使われ
          ているかも確認してください。たとえば、
          NOPRINTオプションが使われていないことを確認してください。
 WARNING: プロシジャステートメントの終わりを検出したので、
          現在のODS SELECT/EXCLUDE/OUTPUTステートメントをクリアしました。
          対話型プロシジャ(終了するにはquit;をタイプします)が終了していないかもしれません。


これは対話型プロシジャを使う場合に起こる落とし穴です。
(対話型プロシジャについては、「RUNとQUITの違い」をご覧ください。)


今回の例で使用しているregプロシジャは対話型プロシジャです。
「quit;」と書くか、別のdataステップ・procステップが現れるまで、regプロシジャは起動したままになります。
なので、起動したままのregプロシジャに対して、ods selectが適用されてしまい、おかしな結果になってしまったわけです。

この場合「quit;」を入れるだけで解決です。

* OK ;
proc reg data=sashelp.class;
 model height = age;
run;
quit;

ods select Moments  BasicMeasures;
proc univariate data=sashelp.class;
 var age;
run;
ods select all;



📝 注意点

ごくごく一部のプロシジャ(gplotプロシジャ等)は、実行する度にods traceで得られる出力オブジェクトの名前が変わるので注意!


0 件のコメント:

コメントを投稿