Случайный выбор SAS, с размером группы - PullRequest
2 голосов
/ 05 февраля 2020

У меня есть набор данных с учетными записями и его атрибут (есть 9 основных атрибутов). Каждая группа атрибутов содержит различное количество учетных записей, где 2 группы содержат значительно большее количество учетных записей. Поэтому, когда я использую PRO C SURVEYSELECT, чтобы случайным образом выбрать 5 учетных записей на STRATA и METHOD = SRS, я получаю больше результатов от атрибутов, которые содержат больше учетных записей. Как я могу это исправить? Как я могу заставить SAS учитывать объем группы при выборке?

Вышеупомянутый код:

PROC SURVEYSELECT DATA=FINAL_RANDOM OUT=FINAL_RANDOM_1 NOPRINT 
     METHOD=srs
     SAMPSIZE = 5 
     SELECTALL;
     STRATA Account_Branch_Id ; 
RUN; 

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

Я не совсем понимаю вашу точку зрения, если вы используете Sample Size в качестве числа строк, вы получите точное число строк по вашим слоям Случайный образец выборки в SAS Guide

То же самое относится и к вашему коду,

PROC SURVEYSELECT DATA=*YOURDATASET* OUT=DATA 
 METHOD=srs
 SAMPSIZE = 5 
 SELECTALL;
 STRATA *YOUR_STRATA_VARIABLE*; 
RUN; 

Разница между N количеством наблюдений (в узле «Случайная выборка» в SAS Guide) и SAMPSIZE (в коде) заключается в том, что N дает вам общее количество наблюдений , тогда как SAMPSIZE дает вам число на переменную страты .

0 голосов
/ 05 февраля 2020

Вот некоторые примеры сгенерированных данных с двумя стратами (ветвями), каждая из которых содержит 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

enter image description here

...