简单随机抽样,就是以相同概率从N个总体单位中抽取n个单位。根据有无放回,它又分为无放回的简单随机抽样和有放回的简单随机抽样。支持以上观点的书籍很多,如《Elements of sampling theory and methods》、《抽样调查的理论及其应用方法》、《抽样技术》等等。另外,《survey Samling》《data preparation for analytics using sas》等书中引用了限制随机抽样和无限制随机抽样的叫法。他们认为,不放回的叫简单随机抽样(限制随机抽样),而有放回的随机抽样叫做无限制抽样。
总之,对于两种随机抽样的实现都殊途同归,分清就好。很多书籍都讨论了对简单随机抽样的实现问题。如:
《data preparation for analytics using sas》一书中介绍了重点介绍了简单随机抽样,分层抽样和整群抽样以及其软件实现方式。《SAS编程与数据挖掘商业案例》一书中,姚志勇给出了自己处理简单无重复抽样、分层等比例和不等比例抽样及随机抽样的宏代码。
《多元统计和sas》一书在试验设计一讲中,针对随机试验设计原则,给出了服从标准正态分布和一般正态分布的随机数实现方式。
不同理解的代如下:
1、以10%的概率无限制从总体中抽取,我们会得到近似10%的概率。
data all;
do i=1 to 100;
output;
end;
run;
data sample1;
set all;
if ranuni(0)<0.1 then output;
run;
data sample2;
set all;
if ranuni(0)<10/100 then output;
run;
2.限制性的随机抽样
data all;
do i=1 to 100;
output;
end;
run;
data sample3;
set all;
if nobs < 10 then do;
if ranuni(0)*(100-_N_)<=(100-nobs) then do;
output;
nobs+1;
end;
end;
run;
该种抽样的宏代码如下(姚书):
%let sampsize=100;
data tmp;
set sashelp.prdsale nobs=nobs;
retain_cnt_0;
if &sampsize>_cnt_ and ranuni(0)*(nobs+ _n_) < (&sampsize-_cnt_) then do;
_cnt_+1;
output;
end;
drop _cnt_;
run;
该书中还介绍了利用uniform函数以及surveyselect过程对该种抽样的实现,详情见该书。
3.简单随机抽样的宏代码
%MACRO SAMPLE(EMDS,SAMPLE,RAND,MRSS=,OVERSAM=0.05); DATA _NULL_; FSS=CEIL(&MRSS*(1+&OVERSAM)); CALL SYMPUT('FSS',LEFT(PUT(FSS,8.))); RUN; /* get the number of FSS and store it in &FSS */ DATA _NULL_; IF 0 THEN SET &EMDS NOBS=EM; CALL SYMPUT('EM', LEFT(PUT(EM,8.))); STOP; RUN; /* get the number of EM and store it in &EM at compile time */ DATA &EMDS; SET &EMDS; OBSNUM=_N_;/*use OBSNUM to track chosen members */ RUN; DATA _NULL_; N=FLOOR(&EM/&FSS); START=MAX(ROUND(&RAND*N),1);/* round START using .5 rule */ CALL SYMPUT('N', LEFT(PUT(N,8.))); CALL SYMPUT('START',LEFT(PUT(START,8.))); RUN; DATA &SAMPLE(DROP=I); LENGTH LIST $7; DO I=1 TO &FSS; OBSIN=&START+FLOOR((I-1)*(&EM/&FSS)); SET &EMDS POINT=OBSIN;/*draw members by their observation #*/ IF I <= &MRSS THEN LIST='PRIMARY'; ELSE LIST='AUXILIA'; OUTPUT; END; STOP; RUN; %PUT EM=&EM MRSS=&MRSS FSS=&FSS N=&N START=&START;/* output the values of these macro variables to SAS LOG */ %MEND SAMPLE; DATA A; INPUT GROUP $ FREQ; CARDS; A 11 B 12 C 13 D 14 E 15 F 16 G 17 H 18 J 19 K 20 L 21 M 22 N 23 P 24 A 11 B 12 C 13 D 14 E 15 F 16 G 17 H 18 J 19 K 20 L 21 M 22 N 23 P 24 B 12 C 13 D 14 E 15 F 16 G 17 H 18 J 19 K 20 L 21 M 22 N 23 P 24 A 11 B 12 C 13 D 14 E 15 F 16 G 17 H 18 J 19 K 20 L 21 M 22 N 23 P 24 ; RUN; %SAMPLE(A,B,0.5,MRSS=20,OVERSAM=0.10); PROC PRINT DATA=B; RUN;