Вот некоторые примеры сгенерированных данных с двумя стратами (ветвями), каждая из которых содержит 35% всех счетов, а остальные 7 страт, содержащие оставшиеся 30% счета, распределены поровну.
Код в вопросе делает выборку из 5 выборок из каждой страты (branch_id
) и случайное превышение атрибута (risk
).
Я не так хорош в SurverySelect
, чтобы сказать, что вы не можете выбрать «равномерно» над risk
в пределах strata
- но если это возможно, вам нужно будет указать METHOD=
, отличный от SRS
Пример
data have;
call streaminit (123);
do account_id = 1 to 100000;
x = rand('uniform');
select;
when (x>.65) branch_id = 1;
when (x>.30) branch_id = 2;
otherwise branch_id = 3 + floor(rand('uniform',7));
end;
open_date = round(rand('uniform', today())); format open_date yymmdd10.;
balance = round(rand('uniform',1e6)); format balance dollar9.;
if branch_id = 7 then do;
open_date = round(rand('uniform', 4000));
balance = 5e5 + round(rand('uniform',5e5)); format balance dollar9.;
end;
select (branch_id);
when (1) risk = ceil(rand('normal',5,1));
when (5) risk = ceil(rand('uniform', 2)) * 2;
when (6) risk = 3 + ceil(rand('uniform', 4));
when (9) risk = 4 + ceil(rand('uniform', 5));
otherwise risk = ceil(rand('uniform', 9));
end;
output;
end;
drop x;
run;
proc sort data=have;
by branch_id account_id;
run;
proc tabulate data=have;
title "Original risk distribution by branch";
class branch_id risk;
table branch_id='', risk * n='' * format=comma9. * [s=[width=1cm]] / box='branch_id';
run;
* survery select;
PROC SURVEYSELECT NOPRINT DATA=have OUT=want
METHOD=srs
SAMPSIZE = 5
SELECTALL
;
STRATA Branch_Id ;
RUN;
proc sql;
create table sample_classes_with_zeros as
select class.branch_id, class.risk,
case when sample.risk then 1 else 0 end as z
from (
select distinct branch_id, risk from have
) as class
left join sample
on class.branch_id = sample.branch_id
& class.risk = sample.risk
;
proc tabulate data=sample_classes_with_zeros;
title "A SurveySelect SRS SAMPSIZE=5 sampling, risk distribution by branch";
class branch_id risk;
var z;
table branch_id='', risk * z='' * sum='' * f=comma9. * [s=[width=1cm textalign=center]] / box='branch_id';
run;
![enter image description here](https://i.stack.imgur.com/kiUe1.png)
![enter image description here](https://i.stack.imgur.com/KR01B.png)