無作為抽出を行なう方法
[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」の項をご参照ください。
|
|||||||||||||||