Sas 以每个料仓的最小比例处理hpbin

Sas 以每个料仓的最小比例处理hpbin,sas,nested-loops,binning,sas-studio,Sas,Nested Loops,Binning,Sas Studio,我正在使用Proc HPBIN将我的数据分割为等距的存储桶,即每个存储桶在变量的总范围内所占比例相等 我的问题是当我有一个大范围的极度倾斜的数据时。几乎我所有的数据点都在一个桶中,而在极端情况下,有两个观测点分散在一起 我想知道是否有办法强迫PROC Hpbin考虑每一个容器中的值的比例,并确保至少有5%的观察结果在一个垃圾箱中并分组给其他人? DATA var1; DO VAR1 = 1 TO 100; OUTPUT; END; DO VAR1 = 50

我正在使用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上的另一个图),因为我希望看到价差。

分位数
选项和
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);
数据已经存在;
DO VAR1=1至100;
产出;
结束;
DO VAR1=500至505;
产出;
结束;
DO VAR1=7000至7015;
产出;
结束;
DO VAR1=1000000至1000010;
产出;
结束;
跑
%宏bin_zoomer(数据=,变量=,nbins=,重新缩放=0.25,中联重科=8,输出=);
%本地数据\查看步骤下一步outbins缩放器;
proc-sql;
将视图数据创建为
选择1作为步骤,&var from&data;
退出
%设阶跃=1;
%让数据_查看=数据_缩放和步进;
%让出料仓=料仓→步骤和步骤;
%垃圾箱:
%如果&step>&zoomlimit%,则%goto done;
ODS排除所有;
ODS输出映射=&outbins;
PROC HPBIN DATA=&DATA\u查看存储桶;
id步;
输入&var/numbin=&nbins;
跑
ODS不排除无;
proc-sql-noprint;
选择“计数(*)到:缩放修剪”
发料箱和出料箱
其中比例>=&重新缩放
;
%注意:&=缩放器;
%如果&zoomers=0%,则%goto done;
%让步骤=%eval(&步骤+1);
proc-sql;
创建视图数据\u缩放和步进为
选择步骤(&S)作为步骤*
从数据查看数据(&U)
联接和输出箱
关于bins.LB和bins.UB之间的数据和变量
和箱子。比例>=&重新缩放
;
退出
%让出料仓=料仓→步骤和步骤;
%让数据_查看=数据_缩放和步进;
%后藤斌;
%完成:
%注意事项:完成@&=步骤;
*堆叠无问题或最终缩放的箱子;
*步骤2+中的LB到UB域将离散地覆盖边界
*原step1垃圾箱的数量;
数据输出;
设置
料仓步骤1-料仓步骤和步骤
indsname=源
;
如果比例<&重新缩放或source=“bin\u步骤和步骤”;
步骤=源;
跑
%修补;
选项mprint;
%bin_缩放器(数据=have,var=var1,nbins=15,out=bin);

分位数
选项和
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);
数据已经存在;
DO VAR1=1至100;
产出;
结束;
DO VAR1=500至505;
产出;
结束;
DO VAR1=7000至7015;
产出;
结束;
DO VAR1=1000000至1000010;
产出;
结束;
跑
%宏bin_zoomer(数据=,变量=,nbins=,重新缩放=0.25,中联重科=8,输出=);
%本地数据\查看步骤下一步outbins缩放器;
proc-sql;
将视图数据创建为
选择1作为步骤,&var from&data;
退出
%设阶跃=1;
%让数据_查看=数据_缩放和步进;
%让出料仓=料仓→步骤和步骤;
%垃圾箱:
%如果&step>&zoomlimit%,则%goto done;
ODS排除所有;
ODS输出映射=&outbins;
PROC HPBIN DATA=&DATA\u查看存储桶;
id步;
输入&var/numbin=&nbins;
跑
ODS不排除无;
proc-sql-noprint;
选择“计数(*)到:缩放修剪”
发料箱和出料箱
其中比例>=&重新缩放
;
%注意:&=缩放器;
%如果&zoomers=0%,则%goto done;
%让步骤=%eval(&步骤+1);
proc-sql;
创建视图数据\u缩放和步进为
选择步骤(&S)作为步骤*
从数据查看数据(&U)
联接和输出箱
关于bins.LB和bins.UB之间的数据和变量
和箱子。比例>=&重新缩放
;
退出
%让出料仓=料仓→步骤和步骤;
%让数据_查看=数据_缩放和步进;
%后藤斌;
%完成:
%注意事项:完成@&=步骤;
*堆叠无问题或最终缩放的箱子;
*步骤2+中的LB到UB域将离散地覆盖边界
*原step1垃圾箱的数量;
数据输出;
设置
料仓步骤1-料仓步骤和步骤
indsname=源
;
如果比例<&重新缩放或source=“bin\u步骤和步骤”;
步骤=源;
跑
%修补;
选项mprint;
%bin_缩放器(数据=have,var=var1,nbins=15,out=bin);

您是否尝试过使用
WINSOR
方法(winsorised binning)?从:

Winsorized装箱与铲斗装箱类似,不同之处在于两个尾部均被切断以获得平滑装箱结果。此技术通常用于在数据准备阶段删除异常值


您可以指定
WINSORRATE
来影响它调整这些尾部的方式。

您是否尝试过使用
WINSOR
方法(winsorised binning)?从:

Winsorized装箱与铲斗装箱类似,不同之处在于两个尾部均被切断以获得平滑装箱结果。此技术通常用于在数据准备阶段删除异常值


您可以指定
WINSORRATE
以影响其调整这些尾部的方式。

包含100%数据的1个箱子是否符合至少5%的条件?包含100%数据的1个箱子是否符合至少5%的条件?我想这与百分位数(数量)相同