1-6. SASのログ

SASプログラムが正しく実行されなかった時

サブミットしたSASプログラムが正しく実行されなかった時はまずログウィンドウを確認してください。ログページにはサブミットしたプログラムを順に実行していった過程が記録されています。正しく実行されなかった場合はサブミットしたプログラムのログのうち最初に現れる“Error”の箇所およびその前後をチェックしてください。ほとんどの場合そこにプログラムのミスがあります。


Sample 1-1のCORRプロシジャのVARステートメントにある変数リストの区切りに、半角ではなく全角のスペースを入れてみるとどうなるでしょうか。見た目には半角のスペースが入っている場合とほぼ区別がつきません。

  var heightweight1 father ;
         /* ↑全角のスペース(実際には表示されない) */

プログラムをサブミットすると下図のようにエラーメッセージが表示されて処理が中止します。前述のように全角のスペースはデリミタとして認識されないため、heightweight1 が一つの変数名として解釈されてしまいます。変数名に全角のスペースは使えませんので、結局「無効な名前です」と言われてしまいます。

図1-7
図1-7. エラーメッセージ

また、一見正常に実行されたように見えても実は正常に実行されていない場合もありますので、プログラムをサブミットした後は必ずログをチェックするようにしてください。ただしこのような場合、必ずしも“Error”が表示されるとは限りませんので注意が必要です。


Sample 1-1のDATAステップのinputステートメントの最後に余分な変数 x を加えてみるとどうなるでしょうか。

  input id name $ sex grade $
        height weight1 weight2 father x ;

としてSample 1-1 を実行してみます。プログラムをサブミットすると、すべて実行されて結果ページにフォーカスが移り、PRINTプロシジャやCORRプロシジャの結果が表示されています。ログにもエラーや警告は出ておらず、一見問題なく完了したように見えます。しかしPRINTプロシジャで出力されたデータセットの内容をよく見ると、もともと20件あったはずのデータが、データセットには10件しかないことがわかります。

何が起こったかというと、INPUTステートメントで指定された読み込むべき変数の数が、実際にデータ行にあるデータの数よりも多くなってしまっているため、データ1行から全ての変数にデータを読み込むことができなくなってしまったのです。そこでSASは x という変数のデータを次の行から読み込みます。ログをもう一度よく見ると「INPUTステートメントが行の終端に達したので、次の行を読み込みます」というメッセージが出ていますが、このメッセージがそのことを示しています。

ここで、指定された変数の読み込みは1ケース分が終了しますので、SASは次のケースについて id という変数から読み込みを開始しますが、この時、そのデータ行にデータが残っているかどうかに関わらず、SASは次の行の先頭から読み込みを開始するのです。このため、x という変数に最初のデータを読み込んだ行の残りのデータは捨てられる(利用されない)ことになります。

こうして、1ケースのデータを読むためにデータの2行を使うことになって、結果、データセットに含まれるデータ数が元の半分になってしまったのです。

図1-8
図1-8. 注意すべきメッセージ

DATAステップでSASデータセットを作成したら、作成されたデータセットの件数(オブザベーション数)と変数の数が元のデータと合っているかを、必ずログのメッセージで確認するようにしてください。

この例はレアな事例ではなく、これまで見てきた学生でも決して少なくない人数がこのエラーを経験しています。しかもエラーメッセージが出ないため気付きにくく、いろいろと分析を進めた後になってようやく、何かおかしいということで相談に来ることもあります。件数が数百、数千になると、半分になっていてもある程度分析ができてしまうので、案外と気付かないようです。当然、それまでの分析はすべてやり直しになります。