现在的位置: 首页 > 综合 > 正文

简单随机抽样sas实现

2018年10月24日 ⁄ 综合 ⁄ 共 2230字 ⁄ 字号 评论关闭

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

 

抱歉!评论已关闭.