無作為抽出を行なう方法

[OS]ALL
[リリース] 6.12, 8.1, 8.2
[キーワード] Random Sampling, SURVEYSELECT

[質問]

無作為抽出を実行できるプロシジャはありますか?

[回答]

SAS 8.1以降では、SURVEYSELECTプロシジャを使用してさまざまな抽出を実行できます。

以下のサンプルプログラムは、706オブザベーションからなるサンプルデータから100件のオブザベーションを無作為抽出(非復元抽出、Random sampling without replacement)します。


  /* サンプルデータの作成 */
  data test;
    keep group type x;
    do group=1 to 10;
     do type=1 to 2;
      r=int(ranuni(12345)*50+10);
      do j=1 to r;
       x=rannor(12346);
       output;
      end;
     end;
    end;
  run;

  /* SURVEYSELECTプロシジャの実行 */
  /* METHOD=SRSで単純無作為抽出(非復元抽出)を指定 */
  proc surveyselect data=test method=srs rep=5
         n=100 seed=12345 out=out; /* n=100の指定で100オブザベーションを抽出 */
  run;

METHOD=オプションにおける指定をMETHOD=URSに変更すると、重複を許した無作為抽出(復元抽出)を行なうことも可能です。

また、層別抽出を行なうにはSTRATAステートメントを使用します。この場合、STRATAステートメントで指定する変数について、事前にソートしておく必要があります。


  /* 同じサンプルデータを使用します */

  /* SORTプロシジャ */
  proc sort data=test out=sortout;
   by group type;
  run;

  proc surveyselect data=sortout method=srs
      rate=.1 seed=12345 out=out2;
                 /* rate=.1で各層からそれぞれ10%のオブザベーションを抽出 */
   strata group type;                              /* 層を表す変数を指定 */
  run;

上記プログラムで指定しているステートメントおよびオプションは下記のとおりです。

STRATA 層を表す変数を指定する
N= サンプリング数をオブザベーションの数で指定するオプション
RATE= サンプリング数を割合で指定するオプション
SEED= ランダムサンプリングを行なう際のシード値を設定する
METHOD= サンプリングの方法を指定する
OUT= サンプリング後の出力データセットを指定する
REP= 無作為抽出を行なう回数を指定する

なお、SAS 6.12では、簡単な抽出法であれば、DATAステップで比較的容易に行なうことができます。
下記のプログラムは、オブザベーションの抽出数を指定して、データセットを作成します。



  /** 1000件の無作為抽出を行なう場合 **/
   %let m=1000; /* 抽出したい数を指定します */
   %let seed=1234; /* RANUNI関数のシード値を指定します */
   %let data=data1; /* 抽出したいデータセット名を指定します */

   data sample;
      set &data nobs=total;
        drop random ;   /*必要のない変数の消去*/
         if random < &m then do;

         if ranuni(&seed)*(total+1 - _N_) <= (&m - random) then do ;
             random+1;
             output;
          end;
        end;
   run;

各オプションの指定方法など、SURVEYSELECTプロシジャの詳細に関しては「SAS/STAT User's Guide」の「The SURVEYSELECT Procedure」の項をご参照ください。