2段階t検定をSASでシミュレーション(1)では、シミュレーションを行う基本的な方法を紹介しました。
が、思ったより処理に時間がかかります。
ログを確認すると、t検定を行うTTESTプロシジャで処理に手間取っていて、全体のほとんどの時間が費やされています。
これは何とかならないでしょうか?
その答えは、ODS RESULTS/NORESULTSの利用にあります。
プログラムでは、ODS OUTPUTステートメントを使用して、t検定などの結果をデータセットに出力していましたが、一般にBYステートメントを使用していると、出力が多大な場合は、システム処理に負荷がかかります。
具体的には、「結果ウィンドウ」に出力される内容が非常に大きくなり、マウスで内容を開こうとしても
結構待たされたりします。
では、その出力をやめてしまいましょう。
%let loop=10000;
%let n1=10;
%let mean1=0;
%let sd1=1.5;
%let n2=30;
%let mean2=0;
%let sd2=1;
data test;
call streaminit(12345);
array n{2} (&n1 &n2);
array mean{2} (&mean1 &mean2);
array sd{2} (&sd1 &sd2);
do loop=1 to &loop;
do group=1 to 2;
do i=1 to n[group];
y=rand('normal',mean[group],sd[group]);
output;
end;
end;
end;
run;
ods noresults;
ods listing close;
proc ttest data=test;
by loop;
class group;
var y;
ods output ttests=t equality=e;
run;
ods listing;
ods results;
/*以下略*/
結果は同じとなりますが、処理にかかる時間が大幅に短くなりました。
ODS OUTPUTステートメントは、ほぼあらゆる計算結果をデータセット化できる便利な機能ですが、
このような問題も存在します。ODS RESULTS/NORESULTSステートメントは、結果ウィンドウに
出力される内容を抑制する機能を持ちます。
ここで、当該プログラムの前後にステートメントを挟むと、非常に効率的な処理が可能になります。
なお、ODS OUTPUTを使う場合は、プロシジャのNOPRINTオプションは使わないでください。
ODS OUTPUTによるデータ出力もなくなってしまいますので。