简单随机抽样sas实现

来源:互联网 发布:手机广告声音制作软件 编辑:程序博客网 时间:2024/06/06 03:50

      简单随机抽样,就是以相同概率从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=&NSTART=&START;/* output the values of these macrovariables to SAS LOG */%MEND SAMPLE;DATA A;INPUT GROUP $ FREQ;CARDS;A 11B 12C 13D 14E 15F 16G 17H 18J 19K 20L 21M 22N 23P 24A 11B 12C 13D 14E 15F 16G 17H 18J 19K 20L 21M 22N 23P 24B 12C 13D 14E 15F 16G 17H 18J 19K 20L 21M 22N 23P 24A 11B 12C 13D 14E 15F 16G 17H 18J 19K 20L 21M 22N 23P 24;RUN;%SAMPLE(A,B,0.5,MRSS=20,OVERSAM=0.10);PROC PRINT DATA=B;RUN;