楼主: 汪政元
8027 4

[程序分享] 【信用评分之变量分组】——等宽、等频、分位数 [推广有奖]

  • 3关注
  • 7粉丝

硕士生

74%

还不是VIP/贵宾

-

威望
0
论坛币
117 个
通用积分
5.0300
学术水平
12 点
热心指数
16 点
信用等级
8 点
经验
755 点
帖子
77
精华
0
在线时间
259 小时
注册时间
2012-10-14
最后登录
2024-2-3

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

最优分组,将后续添加
  1. /*------------------------【变量分组宏】:method=1,等频;method=2,等宽-;method=3,分位数分组------------------------------*/
  2. /*DSin=待分析数据集,method=分组方法,Nbins=分组数,IVar=分析自变量,DVar=分析因变量,DSout=映射输出*/
  3. %macro ChcAnalysis(DSin=,method=,Nbins=,IVar=,DVar=,DSout=,p_start=,p_end=,p_interval=);

  4.         proc sort data=&DSin;
  5.                 by &IVar;
  6.         run;

  7.         data temp;
  8.                 set &DSin;
  9.                 by  &IVar;
  10.                 _obs = _n_ ;
  11.                 keep &IVar &DVar _obs;
  12.         run;

  13.         %if &method = 1 %then %do;/*        基于等频分组,即根据观测obs分组*/
  14.                         proc sql   noprint;
  15.                                 select count(&DVar) into:N from temp;
  16.                                 select min(_obs),max(_obs) into: Vmin,:Vmax from temp;
  17.                         quit;

  18.                         %let Binsize = %sysevalf(&Vmax/&Nbins);
  19.                         %let LB_1 = 0;
  20.                                 %do i = 1 %to &Nbins;
  21.                                         %let LB_&i = %sysevalf(&LB_1 + (&i-1) * &Binsize);
  22.                                         %let UB_&i = %sysevalf(&&LB_&i + &Binsize);

  23.                                     proc sql noprint;
  24.                                                 select sum(&DVar),count(&DVar) into:sum_&i ,:N_&i from temp
  25.                                                         where _obs >= &&LB_&i and _obs < &&UB_&i;/*等频基于观测号,划分*/
  26.                                     quit;
  27.                            %end;
  28.         %end;
  29.         %else %if  &method = 2 %then %do;/*        根据自变量的取值范围,进行等宽分组*/
  30.                         proc sql   noprint;
  31.                                 select count(&DVar) into:N from temp;
  32.                                 select min(&IVar),max(&IVar) into: Vmin,:Vmax from temp;
  33.         /*PS:无论是存储观测的最大最小值,还是自变量的最大最小值,都要存储到相同的宏变量里,因为后续引用名称相同*/
  34.                         quit;

  35.                         %let Binsize = %sysevalf((&Vmax-&Vmin)/&Nbins);
  36.                         %let LB_1 = 0;
  37.                                    %do i = 1 %to &Nbins;
  38.                                                 %let LB_&i = %sysevalf(&LB_1 + (&i-1) * &Binsize);
  39.                                                 %let UB_&i = %sysevalf(&&LB_&i + &Binsize);

  40.                                             proc sql noprint;
  41.                                                         select sum(&DVar),count(&DVar) into:sum_&i ,:N_&i from temp
  42.                                                                 where &IVar >= &&LB_&i and &IVar < &&UB_&i;/*等宽基于自变量值,划分*/
  43.                                             quit;
  44.                                    %end;
  45.         %end;
  46.         %else %if  &method = 3 %then %do;/*        分位数分组,需要进一步改进*/

  47.                 /*        根据univariate过程,存储分位数数据集*/
  48.                         proc univariate data = &DSin;
  49.                                         var &IVar ;
  50.                                         output out =temp_qt
  51.                                                    pctlpts = &p_start to &p_end by &p_interval
  52.                                                    pctlpre = P_;
  53.                                 run;
  54.                          
  55.                         /*        对分位数数据集转置*/
  56.                                 proc transpose data=temp_qt
  57.                                      out=qt_dsout_trans(rename = (col1=value) drop=_LABEL_ )
  58.                                           NAME = Quantiles;
  59.                                 run;

  60.                         /*        将一列数据存为宏变量 */
  61.                                 proc sql;
  62.                                         select quantiles into: qtl separated by ' ' from qt_dsout_trans;
  63.                                         select value into:value separated by  ' '  from  qt_dsout_trans;
  64.                                 quit;
  65.                                  
  66.                         /*        利用scan函数,将对value宏变量进行分割,另存为单个数值*/
  67.                                  %let n = %sysevalf((&p_end - &p_start)/&p_interval + 1);
  68.                                 %do j = 1 %to &n ;
  69.                                         %let var&j = %sysfunc(trim(%scan(&value,&j,' ')));
  70.                                         %put &&var&j;
  71.                                 %end;

  72.                         /*        创建分组结果集*/
  73.                                 proc sql  ;
  74.                                         create table &DSout(n num,bin_l num,bin_u num );
  75.                                                  %do  i = 1 %to 10;
  76.                                                         %let bin_l&i = &&var&i;
  77.                                                         %let k = %eval(&i+1);
  78.                                                         %let bin_u&k = &&var&k;
  79.                                                         insert into &dsout values
  80.                                                                 (&i,&&bin_l&i,&&bin_u&k );
  81.                                                  %end;
  82. quit;
  83.         %end;                               

  84.         /*将划分好的变量进行分组映射*/
  85.                  data &DSout;
  86.                    %do i=1 %to &NBins;
  87.                                  Bin = &i;
  88.                                 Lowerbound =  &&LB_&i;
  89.                                 upperbound  = &&UB_&i;
  90.                           if (&&sum_&i = .) then N_1 = 0           ;else N_1 = &&sum_&i ;
  91.                           if (&&N_&i = . )  then Bintotal = 0 ;else Bintotal = &&N_&i;
  92.                           N_0 = Bintotal - N_1 ;
  93.                           percent_1 = N_1 / Bintotal;
  94.                           percent_0 = N_0 / Bintotal;
  95.                           output;
  96.                         %end;
  97.                  run;
  98.        
  99. %mend;
复制代码


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:信用评分 变量分组 分位数 Univariate quantiles method 因变量 自变量 count

使用道具

藤椅
420948492 发表于 2015-8-7 12:11:53 |只看作者 |坛友微信交流群
{:3_42:}

使用道具

板凳
625404022 发表于 2015-8-7 16:57:58 |只看作者 |坛友微信交流群
这是某本书里面的吧

使用道具

报纸
wps930720 在职认证  发表于 2018-11-2 12:16:02 |只看作者 |坛友微信交流群
贴主,能否将其它宏变量说明一下?p_start=,p_end=,p_interval=;
还有,分组为什么要加入分析的自变量?

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-26 15:12