SAS中文论坛

标题: 请教随机抽取样本的一个问题(着急用,在线等) [打印本页]

作者: shiyiming    时间: 2012-11-12 16:35
标题: 请教随机抽取样本的一个问题(着急用,在线等)
大家好,我的问题是这样的。我有一个数据集,一共96条记录(96个人 subjid,每个人一条),我现在要随机抽取10%的人(96*10%=9.6,不是整数,取10人)。抽取的时候要考虑中心(siteid),保证每个中心至少一个人(中心总数不超过10的)。该如何实现?谢谢各位大侠!数据如下:

[code:21r1pj20]data sj;
input siteid $ subjid $;
cards;
1001        8008   
1001        8009   
1001        8010   
1001        8201   
1001        8202   
1001        8216   
1001        8217   
1001        8218   
1001        8219   
1001        8401   
1001        8402   
1001        8403   
1001        8406   
1001        8407   
1001        8408   
1001        8411   
1001        8412   
1001        8413   
1002        8003   
1002        8011   
1002        8204   
1002        8205   
1002        8211   
1002        8212   
1003        8042   
1003        8045   
1003        8046   
1003        8047   
1003        8048   
1003        8049   
1003        8083   
1003        8213   
1003        8214   
1003        8215   
1003        8241   
1003        8246   
1003        8247   
1003        8248   
1003        8249   
1003        8281   
1003        8289   
1004        8050   
1004        8087   
1004        8088   
1004        8250   
1004        8284   
1004        8286   
1004        8287   
1004        8288   
1004        8291   
1004        8292   
1004        8300   
1006        8252   
1006        8253   
1006        8254   
1006        8255   
1006        8256   
1007        8001   
1007        8002   
1007        8004   
1007        8043   
1007        8044   
1007        8052   
1007        8085   
1007        8210   
1008        8084   
1008        8086   
1008        8203   
1008        8206   
1008        8207   
1008        8243   
1008        8244   
1008        8245   
1008        8251   
1008        8285   
1008        8290   
1008        8293   
1009        8005   
1009        8006   
1009        8007   
1009        8041   
1009        8051   
1009        8208   
1009        8209   
1009        8242   
1013        8294   
1013        8295   
1013        8296   
1013        8297   
1013        8298   
1013        8299   
1013        8301   
1022        8081   
1022        8082   
1022        8282   
1022        8283
;
run;
[/code:21r1pj20]
作者: shiyiming    时间: 2012-11-12 20:43
标题: Re: 请教随机抽取样本的一个问题(着急用,在线等)
[code:2dndhk5f]
data sj;
input siteid $ subjid $;
cards;
1001   8008   
1001   8009   
1001   8010   
1001   8201   
1001   8202   
1001   8216   
1001   8217   
1001   8218   
1001   8219   
1001   8401   
1001   8402   
1001   8403   
1001   8406   
1001   8407   
1001   8408   
1001   8411   
1001   8412   
1001   8413   
1002   8003   
1002   8011   
1002   8204   
1002   8205   
1002   8211   
1002   8212   
1003   8042   
1003   8045   
1003   8046   
1003   8047   
1003   8048   
1003   8049   
1003   8083   
1003   8213   
1003   8214   
1003   8215   
1003   8241   
1003   8246   
1003   8247   
1003   8248   
1003   8249   
1003   8281   
1003   8289   
1004   8050   
1004   8087   
1004   8088   
1004   8250   
1004   8284   
1004   8286   
1004   8287   
1004   8288   
1004   8291   
1004   8292   
1004   8300   
1006   8252   
1006   8253   
1006   8254   
1006   8255   
1006   8256   
1007   8001   
1007   8002   
1007   8004   
1007   8043   
1007   8044   
1007   8052   
1007   8085   
1007   8210   
1008   8084   
1008   8086   
1008   8203   
1008   8206   
1008   8207   
1008   8243   
1008   8244   
1008   8245   
1008   8251   
1008   8285   
1008   8290   
1008   8293   
1009   8005   
1009   8006   
1009   8007   
1009   8041   
1009   8051   
1009   8208   
1009   8209   
1009   8242   
1013   8294   
1013   8295   
1013   8296   
1013   8297   
1013   8298   
1013   8299   
1013   8301   
1022   8081   
1022   8082   
1022   8282   
1022   8283
;
run;

proc sort data=sj;
  by siteid;
run;

proc surveyselect data=sj
  method=srs
  rep=1
  samprate=0.1
  seed=12345
  out=samds;
  strata siteid;
  id _all_;
run;
[/code:2dndhk5f]
作者: shiyiming    时间: 2012-11-13 07:28
标题: Re: 请教随机抽取样本的一个问题(着急用,在线等)
谢谢  MerlinZHOU。
这里的samprate是对每个strata 组里面的人数分别取10%? 理论上(#strata1*10% +#strata2*10%+.....)=(#strata1+#strata2+......)*10%. 但这个过程如果#strata1是18人,#strata1*10%=1.8, 这个时对strata1 是不是会取到2个人? 这样(#strata1*10% +#strata2*10%+.....) != (#strata1+#strata2+......)*10%. 所以这里的样本的总数是不是ceil(96*10%)=10,结果是14. 有没有一种办法,让总数为10的前提下,保证每个site 都有一个人?
作者: shiyiming    时间: 2012-11-13 08:41
标题: Re: 请教随机抽取样本的一个问题(着急用,在线等)
附上一段我的一短比较笨的方法:
[code:i4e6cfoo]
proc sort data=sj;by siteid;run;

proc surveyselect data=sj
  method=srs
  sampsize=(1 1 1 1 1 1 1 1 1 1) /*刚好有10个中心,所以每个中心的权中都是一样的*/
  seed=12345
  out=samds;
  strata siteid;
  id siteid;
run;

[/code:i4e6cfoo]
作者: shiyiming    时间: 2012-11-14 10:16
标题: Re: 请教随机抽取样本的一个问题(着急用,在线等)
你的方法很好用,我加了点东西让它智能点。
[code:3avjpee0]

%let sr=0.1;

proc sort data=sj;
  by siteid;
run;

data sj;
set sj nobs=num;
call symput('num',num);
run;

data one;
r=ceil(&num.*&sr.);
do i=1 to r;
   one=1;
   output;
end;
keep one;
run;

proc sql noprint;
  select one into :one separated by ' '
  from one;
quit;

proc surveyselect data=sj
  method=srs
  sampsize=(&one.) /*刚好有10个中心,所以每个中心的权中都是一样的*/
  seed=12345
  out=samds;
  strata siteid;
  id siteid;
run;
[/code:3avjpee0]
作者: shiyiming    时间: 2012-12-5 16:05
标题: Re: 请教随机抽取样本的一个问题(着急用,在线等)
膜拜大神,认真体会!
作者: shiyiming    时间: 2012-12-18 10:47
标题: Re: 请教随机抽取样本的一个问题(着急用,在线等)
really 好的观点.

proc surveyselect....samplesize =10;
..;
strata.../alloc =prop;
run;
sas 应该自动控制每层的个数至少为1.
京剧




欢迎光临 SAS中文论坛 (http://mysas.net/forum/) Powered by Discuz! X3.2