前のページ|次のページ

SYSRANDOMマクロ変数とSYSRANENDマクロ変数を使用した乱数ストリームの作成

SYSRANDOMマクロ変数とSYSRANENDマクロ変数の概要

SASには乱数ストリームを使用するプロシジャが多数あります。たとえば、FREQ、GLM、MCMC、OPTEX、PLANなどです。これらのプロシジャは、SAS DATAステップで使用するのと同じ乱数関数とCALLルーチンを使用します。SASプロシジャでは、乱数ストリームを初期化するシードを指定するのにSEED=オプションを使用します。
乱数シードを使用するSASプロシジャは、SYSRANDOMとSYSRANENDの2つのマクロ変数を作成します。これらのマクロ変数を使用すると、別のプロシジャで再現できる乱数ストリームを作成できます。

SYSRANDOMマクロ変数

SYSRANDOMマクロ変数は、直近のプロシジャの乱数シードを格納します。このマクロ変数は、SEED=オプションで指定されている整数に対応します。FREQ、GLM、MI、MCMC、OPTEX、PHREG、PLANなど、多数のプロシジャにSEED=オプションがあります。SEED=オプションで指定する整数は、乱数ストリームの開始に使用します。正のシードを指定すると、指定したとおりに使用されます。SEED=オプションでシードを指定しない場合、またはシードがゼロ以下の場合は、プロシジャでクロックタイムからシードが生成されます。SYSRANDOMマクロ変数を使用すれば、直接指定したシードと内部生成されたシードのどちらでも復元できます。

SYSRANENDマクロ変数

SYSRANENDマクロ変数は、プログラムの次のステップで使用できるようにシードを格納します。プロシジャが完了したときの乱数プロセスの状態を、このシードが取得する場合があります。プログラムに複数のステップを含めて、各プロシジャで明示的にシードを指定せずに乱数列を制御できます。シミュレーションを1つのシードで開始し、後続のすべてのプロシジャでSYSRANENDマクロ変数を使ってシードを指定できます。また、同一のストリームを継続する乱数ジェネレータ(RNG)の停止と再開にもSYSRANENDマクロ変数を使用できる場合があります。
SASプロシジャには2種類のRNGがあります。RANUNI関数で使用されている従来からのRNGは、疑似乱数ストリームを単一のシードで開始し、プロセスの状態を新しいシードに取得できます。GLM、GLIMMIX、MI、OPTEX、PLANやその他のプロシジャでは、この従来からのRNGが使用されます。プロシジャが終了すると、SYSRANENDに格納されている値が新しいシードとなります。ジェネレータを停止した後、SYSRANENDマクロ変数を使用して停止点からジェネレータを再開できます。
MCMC、GENMOD、LIFEREG、PHREGなど、その他のプロシジャは新しいMersenne-Twister RNGを使用します。このRNGはRAND関数でも使用されており、単一のシードを通じてストリームの状態を伝えません。プロシジャの中には、1つのRNGを複数の計算に使用するものもあれば、他の計算には他のRNGを使用するものあります。これらのプロシジャからSYSRANENDマクロ変数を使用すれば、一連のプロシジャ実行を再現できるようになります。ただし、ランダムストリームは、単一の長いプロシジャ実行と同じにはなりません。

例:結果を再現する

シードを復元し、復元したシードを一連の結果を再現する方法の例を次に示します。MCMCプロシジャは事後分布からサンプルを生成します。次のステートメントは線形回帰モデルから事後サンプルを作成します。
title 'Bayesian Linear Regression';

proc mcmc data=sashelp.class seed=0 outpost=out1;
   parms beta0 0 beta1 0;
   prior beta0 beta1 ~ normal(mean=0, var=1e6);
   mu=beta0 + beta1*height;
   model weight ~ n(mu, var=137);
run;
SEED=0が指定されたため、乱数シードがクロックタイムから自動的に生成されます。このシードはSYSRANDOMマクロ変数に格納されます。値は%PUTステートメントを使って表示できます。
%put sysrandom=&sysrandom;
次のステップは、前のステップと同一のシードで同一の結果を作成します。
proc mcmc data=sashelp.class seed=&sysrandom outpost=out2;
   parms beta0 0 beta1 0;
   prior beta0 beta1 ~ normal(mean=0, var=1e6);
   mu=beta0 + beta1*height;
   model weight ~ n(mu, var=137);
run;
次のステップをサブミットすると、PROC MCMCの2回の実行が同一のサンプルを作成していることを確認できます。
proc compare data=out1 compare=out2;
run;

例:再現可能な乱数ストリームを作成する

PLANプロシジャは完全要因実験計画を作成してランダム化します。OPTEXプロシジャは最適な実験計画の計画点候補一式を検索します。両方のプロシジャにSEED=オプションがあります。SYSRANENDマクロ変数を使用して、一連のステップを再現可能にする例を次に示します。
proc plan seed=17;
   factors x1=4 x2=4 x3=2 x4=2 x5=3 x6=3 x7=2 x8=2 / noprint;
   output out=cand;
run;
quit;

%put sysranend=&sysranend;

proc optex data=cand seed=&sysranend;
   class x1-x8;
   model x1-x8;
   generate n=26 iter=10 method=m_federov;
   output out=des;
run;
quit;
PROC OPTEXを複数回呼び出し、効率(計画がどの程度有効かを示す指標)が98%を超える計画を検出したときに停止できます。SYSRANDOMマクロ変数とSYSRANENDマクロ変数を使用してこれを実現できます。次のステートメントはPROC OPTEXを呼び出して100の計画を作成し、最良のD効率を出力します。
proc plan seed=17;
   factors x1=4 x2=4 x3=2 x4=2 x5=3 x6=3 x7=2 x8=2 / noprint;
   output out=cand;
run;
quit;

%macro design;
   ods listing close;
   %do %until(%sysevalf(&eff > 98));
      proc optex data=Cand seed=&sysranend;
         class x1-x8;
         model x1-x8;
         generate n=26 iter=100 keep=1 method=m_federov;
         ods output efficiencies=e1;
      run;
      quit;
  
      data _null_;
         set e1;
         call symputx('eff', dcriterion, 'L');
      run;
      %end;
   ods listing;

   proc optex data=Cand seed=&sysrandom;
      class x1-x8;
      model x1-x8;
      generate n=26 iter=100 keep=1 method=m_federov;
      output out=des;
   run;
   quit;
%mend;

%design;   
D効率はマクロ変数に格納されます。また、D効率が98より大きいときには反復が停止します。最後のステップのシードは最終結果を再現し、表示するために使用されます。
前のページ|次のページ|ページの先頭へ