Sas 以每个料仓的最小比例处理hpbin
我正在使用Proc HPBIN将我的数据分割为等距的存储桶,即每个存储桶在变量的总范围内所占比例相等 我的问题是当我有一个大范围的极度倾斜的数据时。几乎我所有的数据点都在一个桶中,而在极端情况下,有两个观测点分散在一起 我想知道是否有办法强迫PROC Hpbin考虑每一个容器中的值的比例,并确保至少有5%的观察结果在一个垃圾箱中并分组给其他人?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
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%的条件?我想这与百分位数(数量)相同