SAS如何通过组随机选择随机分成多个组

时间:2015-06-11 00:28:15

标签: sql sas sample proc

我有一个简单的客户数据集(约40,000k) 它看起来像:

customerid, group, other_variable
a,blue,y
b,blue,x
c,blue,z
d,green,y
e,green,d
f,green,r
g,green,e

我想随机选择每个组,Y量的客户(以及他们的其他变量)。 问题是,我希望每组有两个随机选择的Y量 即

4000 random green customers split into two sets of 2000 randomly
and 4000 random blue customers split into two sets of 2000 randomly

这是因为我有两个不同的消息给两个不同的分裂 我没有替换样品。需要成为独特的客户

更喜欢PROC SQL中的解决方案,但如果proc sql不是

,那么我很乐意在sas中使用替代解决方案

3 个答案:

答案 0 :(得分:4)

proc surveyselect是SAS中随机抽样的首选工具。代码非常简单,我只会对每组中的4000个进行采样,然后每2000行分配一个新的子组,因为无论如何数据都是随机顺序(尽管按组排序)。

proc surveyselect的默认抽样方法是srs,这是一种简单的随机抽样,无需替换,完全符合此要求。

这是一些示例代码。

/* create dummy dataset */
data have;
do customerid = 1 to 10000;
length group other_variable $8;
if rand('uniform')<0.5 then group = 'blue'; /* assign blue or green with equal likelihood */
    else group = 'green';
other_variable = byte(97+(floor((1+122-97)*rand('uniform')))); /* random letter between a and z */
output;
end;
run;

/* dataset must be sorted by group variable */
proc sort data=have;
by group;
run;

/* extract random sample of 4000 from each group */
proc surveyselect data=have
                    out=want
                    n=4000
                    seed=12345; /* specify seed to enable results to be reproduced */
strata group; /* set grouping variable */
run;

/* assign a new subgroup for every 2000 rows */
data want;
set want;
sub=int((_n_-1)/2000)+1;
run;

答案 1 :(得分:0)

data custgroup ;
do i=1 to nobs;
set sorted_data nobs=nobs ;
point = ranuni(0);
end;

proc sort data = custgroup out=sortedcust
by group point;
run;

data final;
set sortedcust;
by group point;
if first group then i=1;
i+1;
run;

基本上我所做的是首先为数据集中的所有观察值分配一个随机数。然后根据变量grouppoint执行排序。

现在我在小组内实现了一个随机的观察序列。 i=1i+1 将识别组内的观察行。这意味着将避免提取重复的观察结果。还可以使用output语句控制基于i.

存储观察的位置

我的方法可能不是最有效的方法。

答案 2 :(得分:0)

下面的代码应该这样做。首先,您需要生成一个随机数。正如Joe上面所说,最好用特定的数字播种它,以便你可以在必要时重现样本。然后你可以使用带有outobs语句的Proc Sql来生成一个样本。

(顺便说一句,最好不要命名变量&#39; group&#39;。)

data YourDataSet;
set YourDataSet;
myrandomnumber = ranuni(123);
run;

proc sql outobs=2000;
create table bluesample as
select *
from YourDataSet
where group eq 'blue'
order by myrandomnumber;
quit;

proc sql outobs=2000;
create table greensample as
select *
from YourDataSet
where group eq 'green'
order by myrandomnumber;
quit;