Proc hpbin с минимальной долей на бин

Я использую 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-файле), потому что я хотел бы увидеть разброс.


person 78282219    schedule 15.04.2019    source источник
comment
Будет ли 1 бин, содержащий 100 % данных, соответствовать не менее 5 %?   -  person Richard    schedule 15.04.2019


Ответы (2)


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

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

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

person Joe    schedule 15.04.2019
comment
Я посмотрю на это! Я уже удаляю 5% данных, обрезая процентили. Однако некоторые из моих коэффициентов являются отношениями, которые становятся неустойчивыми, когда знаменатель мал. - person 78282219; 16.04.2019
comment
Это делает его более проблематичным с качеством данных, но сложным в управлении. - person 78282219; 16.04.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);
person Richard    schedule 15.04.2019
comment
Я предполагаю, что это то же самое, что и процентили (квантили, дающие равное количество наблюдений на бин). Я думаю, что я все еще хочу иметь одинаковую ширину на бин, просто крайности сгруппированы вместе, так что я существенно увеличиваю масштаб эта корзина с 90% наблюдений в ней. т.е. Я хочу увидеть распределение обсов в этой корзине - person 78282219; 15.04.2019
comment
Если вы увеличите конкретный домен, чтобы увидеть распределение внутри корзины, размер корзины изменится. Если у вас есть фиксированное количество бинов, пропорция в каждом бине будет варьироваться; и вы можете узнать, какова пропорция через выходные данные. Вам потребуется второй шаг, чтобы определить домены (ячейки), которые вы хотите увеличить, и иметь дополнительные критерии того, как разбить эти ячейки на более мелкие детали, опять же с фиксированным количеством ячеек или квантилей. - person Richard; 15.04.2019
comment
Я так и думал, буду работать над этим. Я читаю ваш ответ, я собираюсь проверить это! - person 78282219; 16.04.2019