简单随机抽样,就是以相同概率从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;