無作為抽出を行なう方法
[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;
上記プログラムで指定しているステートメントおよびオプションは下記のとおりです。
なお、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」の項をご参照ください。
|