log メッセージ対処ヒント “xxは無効です。xxx列の値が欠損していない必要があります。”

断片的な情報でいつもすいません。
今回、proc sgplot で生存時間解析のfig(階段プロット)をかいていて、、群毎に1fig/1imageをだしていたら、英語版sasで実行していたのに、日本語でのWARNINGがでてきました。(sas ver 9.4)

proc sgplotの中のどのステートメントが原因かというと、打ち切りの人は”×”なり”+”なりプロットする、scatterステートメントの部分が原因でした。
階段をプロットするのは確かseriesステートメントですが、そこは無関係のようです。

WARNINGの内容↓↓↓↓
xxxは無効です。xxx列の値が欠損していない必要があります。

WARNING原因
proc sgplotがハンドルするデータセット内で、センサーかどうかを見る変数の全てのOBSが欠損の場合にこのメッセージがでたと思われます。
(1obsでも打ち切り症例をscatterステートメントで描画した群の場合、このWARNINGはでませんでした。

どうWARNINGを回避したか。
マクロ変数でscatterステートメントをする・しないを切り分けました。
proc sgplotにいれるデータセットに対し、censorの変数が全て欠損の場合はscatterステートメントをさせないようにしました。
ラフな概要です。

%if &OBS数があるかのmacro_var. = Y %then %do;
scatter ステートメント;
%end;
%else %do;
 /* 何もしません。*/
%end;

ラフにいうと、こんな感じです。。

stat programmerの皆様、日々ヘビーなお仕事お疲れさまです。

お互いがんばりましょう。(特に派遣の方^^)

proc sgpanelで対数グラフ (log scale) :logが”オプションはログ軸に正の値が必要です。”

sgpanelで、y軸のラベルを 10 100 1000 といった表示にしたい場合にややハマった話です。(SAS ver 9.4)
values = (10 100 1000);みたいに書いたら
“オプションはログ軸に正の値が必要です。”というのがでてきて、、この言葉でググっても何らヒットせず。
抽象的な説明になりますが
10 100と表示したいなら
min = 1 max =2
10 100 1000 なら
min = 1 max =3

と書けばokそうでした。
実際にはvaluesステートメントを使っても対数グラフは書けますが、今回私はvaluesステートメントが原因かと思い、min/max系の記述でうまくいきました。
ログにそういわせた原因はvaluesステートメントに対するlogvtypeもしくはlogstyleでの定義ミスによるものと思われます。
サンプル文なくてすいませんが。

sas odsのver 9.4の本がGoogle Bookでは検索可能であり、そこの838ページにビンゴな情報があります。logexponentとかで検索してみてください。
Google Bookでのその本へのLink

ということで、v9.4のproc sgpanelでlogarithmic の図を書くときは3要素によくよく注意されてください。
3要素 = logvtype,logstyle,Values or Min/Max系記述。

sas 数値型変数の桁数把握

数値型変数の桁数をキャッチするコードを掲載してみます。

あまりにも冗長なコードで自分のSASができないっぷりをさらすようですが。
そもそも私以外のsasができる人は、ググる必要がないから、Webにもないのかもしれませんが。。
いろんなレベルのSAS プログラマが業界にはいます!!

数値型変数をvar_num、結果の桁数が入る変数はketa。
0の場合は桁数をゼロと、手打ち!!してます。ここはなんとかしたいですが。
欠損の場合は keta =も欠損。

サンプルデータとしてvar_numに”1.12345”を与えています。

data test;

var_num=1.12345;

if var_num=0 then keta=0;
else if var_num = . then do;end;
else do;
var_num_char =put(var_num ,best.);put var_num_char;
syousuu_char=scan(var_num_char ,2,”.”);
keta=length(syousuu_char);
end;

output;

run;
result_in_sas_on_demand

SAS pg実行後のアウトプットウィンドウ フォーカス遷移回避

プログラムの最後にリスト出力するとします。
そんなプログラムを実行すると、DMS?(Display Manager System)におけるフォーカスがアウトプットウィンドウに遷移して終了するのを避けたい。
フォーカスは実行したプログラムに戻ってきてほしい。
都度、エディタのどこかをClickしてフォーカスを戻すのが面倒なので。

そんなときはプログラムの最後に以下をつけてください。
dm ” continue;

これで、実行したプログラムのエディタにフォーカスがあたって終わります。
continueオプション?がないと、複数のプログラムを開いている場合、実行したプログラムではないプログラムにフォーカスがあたります。

この情報はKさんに教えてもらいました。Kさんいつも、ありがとう!いつか日本酒ごちさせてください。

このcontinueってほんとなんやねん、、DATAステップ中で使うものとしてのは聞いたことあるかもしれないけど、、、
この解決方法教えてもらった時、なんでかテンションあがりましたV(^0^)

“DDE セッションが準備されていません”対策のヒント

おーーー、今までSASからEXCELへのdde出力時、ログにでてくる”DDE セッションが準備されていません”への対応策は明確にはなかったけど、、少し見えてきた。

要旨

save.asの部分はマクロの中でする。以下の本のサンプルコードをダウンロードしてくれば、
“save_excel”というマクロがはいっていて、それでやる。

リンクはこちら
https://www.sas.com/store/books/categories/examples/exchanging-data-between-sas-and-microsoft-excel-tips-and-techniques-to-transfer-and-manage-data-more-efficiently/prodBK_64107_en.html

でもそれだとexcelが立ち上がったまま閉じてくれない。
excelファイルは閉じるよ、とも書いてあるけど、”閉じませんよ!!”と叫びたくなる。
(でも、このマクロ経由でやることで”~準備されていません”はいわれないので、”あと少し。。。”とモチベーションは高まった。)

で、save.asした後のexcelの閉じ方は以下を参考にした。もしかしたら以下の情報だけで完結できるのかもしれません。
リンクはこちら
http://stackoverflow.com/questions/8189278/save-as-and-close-file-without-using-macro

特に、宣言したFILENAMEをclearするっていうのはあまり知らなかったかも。

過去の現場の状況:

照会事項対応の業務です。みんな、、、目の色が違います!!

当局からは、(回答の)レイアウトもこうしてくださいね、という指定もあります。
メディカルライターさん達から解析メンバー側へ、”ひとまずどんなレイアウトになるかはようみせて♡”、というプレッシャーがある。
そのためEXCELでひとまずmockを提出した。そのためrtf出力ではない。

我々プログラマは泣きたいぐらいの帳票数をがんばっている最中、、、なんとか終われそうだけどログの汚点(DDE セッションが準備されていません)が非常にむかつく。
これさえ消せれば満点なのに、と。
そういう時に当情報が役立てば。

次にDDE出力の仕事がしたくなりました。。
========================================
I found some tips for SAS log “DDE session not ready”
point1,from the book

Maybe we’d better “save.as” through macro,

point2,from stackoverflow
do belows before “run;”
put ‘[file.close(0)]’;
str_line = cats(“[e”,”rror(true)]”);
put str_line;

and write “filename fileref_name clear;” after “run;”

sas ログ SASステートメントが生成されませんでした

SASステートメントが生成されませんでした”というWARNINGだかERRORだか忘れたけど、、この情報をググるもいい情報がヒットせず、、

こういう場合(=SASのノウハウが日本語で検索してもヒットしない状況)の定石、英語版SASで同じプログラムを流すと、”no SAS statements were generated” という言い回しでログがでてきました。それだけです。。