SAS/ETSで多次元正規分布に従う乱数列を生成する方法

[OS] ALL
[リリース] ALL
[キーワード] Random Number, MODEL

[質問]

SAS/ETSの機能を用いて多次元正規分布に従う乱数列を生成するにはどのようにしたらよいでしょうか。

[回答]

SAS/ETSのMODELプロシジャには、シミュレーションを行なう機能が備わっています。
これを利用して、Mersenne-Twister (MT)、および乗算型合同法による乱数列を生成することができます。
なお、PSEUDO= オプションは、SAS9 以降でのみ利用可能であり、SAS8 では利用できません。

次の例は、3次元正規分布に従う乱数列を100オブザベーション作成しています。


                                                        /* MTの例 */
               /* 平均と共分散行列からなる SAS データセットを作成 */
          /* 1行目は平均ベクトル、2行目以降は共分散行列を表します */
  DATA cov2;
    INFILE DATALINES DSD;
    INPUT _NAME_$ a1-a3;
  DATALINES;
  ,  20,   30,  40
  a1, 1,    1.2, 2.25,
  a2, 1.2,  4,   3.3,
  a3, 2.25, 3.3, 9,
  ;
  run;

                                               /* MODELプロシジャ */
  PROC MODEL DATA=_NULL_ NOPRINT;
    PARMS a1 a2 a3;
    col1=a1;
    col2=a2;
    col3=a3;

   /* SOLVEステートメントでは、ESTDATA= で平均ベクトル、SDATA= で */
 /* 共分散行列からなるデータセット名を指定します。また、RANDOM=で */
               /* オブザベーション数を、SEED=でシードを与えます。 */
    /* SAS9.1では、PSEUDO=TWISTERを指定するとMT、PSEUDO=DEFAULTと */
            /* 指定すると乗算型合同法に基づく乱数列を生成します。 */
                           /* SAS 8ではこのオプションは利用できず */
                   /* 乗算型合同法に基づいた方法のみ利用できます。*/
    SOLVE col1-col3 / ESTDATA=cov2 RANDOM=100 SEED=12345
        PSEUDO=TWISTER
        OUT=mnormal2(WHERE=(_REP_^=0) DROP=_TYPE_ _MODE_ _ERRORS_);
  RUN;
  QUIT;

なお、SAS/STATのMIXEDプロシジャや、SAS/IMLを使用して、多次元正規分布に従う乱数列を生成することも可能です。
詳細については、以下のFAQをご参照ください。