2段階t検定をSASでシミュレーション(2)

Last-modified: 2008-12-02 (火) 22:01:45

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によるデータ出力もなくなってしまいますので。