ラベル ODS TRACE の投稿を表示しています。 すべての投稿を表示
ラベル ODS TRACE の投稿を表示しています。 すべての投稿を表示

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で得られる出力オブジェクトの名前が変わるので注意!


2015年7月18日土曜日

集計結果をデータセットに出力する「ODS TRACE」と「ODS OUTPUT」




「まとめといて!」 という依頼があったので、簡単にまとめたいと思います。

サンプルデータ
data DT1;
input A;
cards;
10
20
30
;


サンプルに対してMEANSプロシジャで要約統計量を求めて、その結果をデータセットに吐き出したいとします。


①まずは「ODS TRACE」で出力オブジェクトの名前を調べる

ods trace on;
proc means data=DT1;
   var A;
run;
ods trace off;

ログ

集計プロシジャを「ods trace on;」と「ods trace off;」で囲って実行すると、ログに上のような表示が現れます。
ログに出てきた「名前」のところにあるキーワードを覚えておきましょう。上の例では「Summary」というキーワードになってますね。


②「ODS OUTPUT」で集計結果をデータセットに出力する

ods output Summary=OUT1;
proc means data=DT1;
   var A;
run;
ods output close;

結果データセットOUT1




今度は集計プロシジャを「ods output 名前 = 出力データセット名;」と「ods output close;」で囲い直します。
名前のところに先ほどのキーワード「Summary」を当てはめます。

実行すると上の通り、見事集計結果のデータセットが出来上がりです。


ここで注意!
  • プロシジャ側でNOPRINTオプション等で結果ビューアへの出力を抑制すると、ODS OUTPUTが使えない(データセットに出力されない)ので注意
  • 同じプロシジャでもSASのバージョンによって出力オブジェクトの名前や出力データの構造が変わってるかもしれません。別のバージョンで実行する場合、その点よく確認した方がいいです。
  • また日本語版や英語版などの違いによって、出力データセット中の格納値もその国の言語になっている場合があるので注意が必要です。

あと、たまに見かけるミスを以下記事で紹介しているので、あわせてご参照ください。