Proc hpbin с минимальной пропорцией на бин - PullRequest
0 голосов
/ 15 апреля 2019

Я использую Proc HPBIN, чтобы разделить мои данные на равные интервалы, т. Е. Каждый сегмент имеет равную долю от общего диапазона переменной.

Моя проблема заключается в том, что я получаю чрезвычайно искаженные данные с большимспектр.Почти все мои точки данных лежат в одном ведре, в то время как вокруг крайностей разбросано несколько наблюдений.

Мне интересно, есть ли способ заставить PROC HPBIN учитывать соотношение значений в каждом бине иУдостоверьтесь, что есть хотя бы 5% наблюдений в корзине и сгруппируйте другие?

DATA var1;
    DO VAR1 = 1 TO 100;
        OUTPUT;
    END;
    DO VAR1 = 500 TO 505;
        OUTPUT;
    END;
    DO VAR1 = 7000 TO 7015;
        OUTPUT;
    END;
    DO VAR1 = 1000000 TO 1000010;
        OUTPUT;
    END;
RUN;

/*Use proc hpbin to generate bins of equal width*/
ODS EXCLUDE ALL;
ODS OUTPUT
    Mapping = bin_width_results;
PROC HPBIN
    DATA=var1
    numbin = 15
    bucket;
    input VAR1 / numbin = 15;
RUN;
ODS EXCLUDE NONE;

Я хотел бы увидеть способ, которым proc hpbin или другой метод группирует ячейки, которые пусты и позволяют вминимум 5% пропорции на ведро.Тем не менее, я не собираюсь использовать процентили в этом случае (это другой график в моем pdf), потому что я хотел бы увидеть спред.

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Вы пробовали использовать метод WINSOR (winsorised binning)? Из документации :

Winsorized биннинг похож на биннинг за исключением того, что оба хвоста обрезаются для получения гладкого результата биннинга. Этот метод часто используется для устранения выбросов на этапе подготовки данных.

Вы можете указать WINSORRATE, чтобы повлиять на настройку этих хвостов.

1 голос
/ 15 апреля 2019
Опция

Quantile и 20 ячейки должны дать вам ~ 5% на ячейку

PROC HPBIN DATA=var1 quantile;
    input VAR1 / numbin = 20;
RUN;

Когда значения ячейки необходимо динамически перебинить из-за слишком больших пропорций в ячейке (проблемные ячейки) вам нужно hpbin только те значения в бинах задач.Макрос может быть записан для циклического процесса HPBIN с увеличением проблемных областей.

Например:

DATA have;
    DO VAR1 = 1 TO 100;
        OUTPUT;
    END;
    DO VAR1 = 500 TO 505;
        OUTPUT;
    END;
    DO VAR1 = 7000 TO 7015;
        OUTPUT;
    END;
    DO VAR1 = 1000000 TO 1000010;
        OUTPUT;
    END;
RUN;

%macro bin_zoomer (data=, var=, nbins=, rezoom=0.25, zoomlimit=8, out=);

  %local data_view step nextstep outbins zoomers;

  proc sql;
    create view data_zoom1 as
    select 1 as step, &var from &data;
  quit;

  %let step = 1;
  %let data_view = data_zoom&step;
  %let outbins = bins_step&step;

%bin:
  %if &step > &zoomlimit %then %goto done;

  ODS EXCLUDE ALL;
  ODS OUTPUT Mapping = &outbins;
  PROC HPBIN DATA=&data_view bucket ;
    id step;
    input &var / numbin = &nbins;
  RUN;
  ODS EXCLUDE NONE;

  proc sql noprint;
    select count(*) into :zoomers trimmed
    from &outbins
    where proportion >= &rezoom
  ;

  %put NOTE: &=zoomers;

  %if &zoomers = 0 %then %goto done;

  %let step = %eval(&step+1);

  proc sql;
    create view data_zoom&step as
    select &step as step, *
    from &data_view data
    join &outbins   bins
    on data.&var between bins.LB and bins.UB
       and bins.proportion >= &rezoom
    ;
  quit;

  %let outbins = bins_step&step;
  %let data_view = data_zoom&step;

  %goto bin;

%done:

  %put NOTE: done @ &=step;

  * stack the bins that are non-problem or of final zoom;
  * the LB to UB domains from step2+ will discretely cover the bounds
  * of the original step1 bins;
  data &out;
    set 
      bins_step1-bins_step&step
      indsname = source
    ;
    if proportion < &rezoom or source = "bins_step&step";
    step = source;
  run;

%mend;

options mprint;

%bin_zoomer(data=have, var=var1, nbins=15, out=bins);
...