【问题标题】:SAS how to get random selection by group randomly split into multiple groupsSAS如何按组随机选择随机分成多个组
【发布时间】:2015-06-11 00:28:14
【问题描述】:

我有一个简单的客户数据集(大约 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 中使用替代解决方案

【问题讨论】:

标签: sql sas sample proc


【解决方案1】:

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;

【讨论】:

    【解决方案2】:
    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;
    

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

    现在我实现了组内的随机观察序列。 i=1 和 i+1 将是识别组内的观察行。这意味着将避免提取重复的观察结果。使用output 语句以及根据i. 控制要存储观察的位置

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

    【讨论】:

    • ranuni(0) 不应在这种情况下使用。总是,总是,总是用一个正整数作为种子,所以如果需要可以复制样本。
    【解决方案3】:

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

    (顺便说一句,最好不要将变量命名为“组”。)

    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;
    

    【讨论】:

      猜你喜欢
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 2022-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      相关资源
      最近更新 更多