メッセージレベルをiにしてMergeのミスを防ぐ

通常、SASのログに現れるメッセージと言えば「ERROR」「WARNING」「NOTE」の3種類ですが、
options msglevel=i;という風にmsglevelオプションでiを指定するとログに「INFO」というメッセージがでるようになります。

このINFOというカテゴリで表示されるようになるメッセージには、結構役に立つものが多いのですが今回はMergeステートメントによって変数が上書きされた時にでるINFOメッセージについて紹介したいと思います。

たとえば臨床試験のデータで
サイクル2,3,4の検査値データが入ったデータセットとサイクル1のデータセットがあり
この2つのデータセットから、サイクル1の検査値より低い値をとったサイクルを特定するプログラムを考えてみます。

【LB】






【LB_1】




proc sort data=LB;
 by USUBJID;
run;

proc sort data=LB_1;
 by USUBJID;
run;

data OUTPUT;
 merge LB(in=ina)
          LB_1(rename=(AVAL=BASE));
      by USUBJID;
      if ina;
      if AVAL<BASE;
run;

とつらつら書いて実行すると、もれなく大悪手です




一見正解風ですが、抽出されたデータのVISITが「サイクル1」です。
あれ?サイクル1より値の低いサイクルを特定したいのに出てきたのが「サイクル1」とはこれいかにです。

もうお気づきかと思いますが、LB_1でLBのVISITを上書いてしまっているので、
本来だしたい「サイクル2」が「サイクル1」になっちゃったわけです。
LB_1のVISITをdropすれば解決です。

初歩的なミスではありますが、結構やってしまいがちで見つけにくい類のエラーです。
特にデータマネージメントにおける論理チェック(エディットチェック・コンピューターチェック)の
プログラムを書くときは、似た様なマージ文を山ほど書くので疲れてくると僕はよくやってしまいます。

そこで以下のオプションを先頭に打ってから、同じプログラムを実行してみます。
options msglevel=i;









このように
INFO: 変数VISIT(データセット WORK.LB)はデータセット WORK.LB_1によって上書きされます。
というメッセージが出て、変数の上書きが起きたことがわかります。


さて、変数の上書き以外にINFOが役に立つのは、ソートプロシジャの実行アルゴリズムを教えてくれることです。ODBCでoracle等のRDBにLibnameをかけて、そのライブラリ内でソートを使うと
そのRDBのソートアルゴリズムでソートされるのですが、欠損値の取り扱いなどが通常のSASソートと違う場合があり、返された結果の意味がわからないことがありますが、そういった場合にINFOが通常のSASソートではない方法でソートされたことがわかるので解釈と対処がしやすくなります。


0 件のコメント:

コメントを投稿