登录
首页精彩阅读SAS—计算K-S值及画图
SAS—计算K-S值及画图
2017-06-01
收藏

SAS—计算K-S值及画图

近来,时于夜半下雨,也常在梦里被雨扰醒。究其原因,也是因为近来工作无趣,本身也只喜欢写写SAS或Python代码,做模型,可近来却连数据权限都没有,万灰俱灭。雨声轻轻,却也容易愁闷得睡不着。想着要去外包,却因自己的犹豫不决也没有去成。
好了,不说废话了。昨天有人在微信上问KS的计算方式。今天介绍一下KS值吧。
先看一段程序:
data logistic;

   input accident age vision drive;

datalines;

1 17 1 1

1 44 0 0

1 48 1 0

1 55 0 0

1 75 1 1

0 35 0 1

0 42 1 1

0 57 0 0

0 28 0 1

0 20 0 1

0 38 1 0

0 45 0 1

0 47 1 1

0 52 0 0

0 55 0 1

1 68 1 0

1 18 1 0

1 68 0 0

1 48 1 1

1 17 0 0

1 70 1 1

1 72 1 0

1 35 0 1

1 19 1 0

1 62 1 0

0 39 1 1

0 40 1 1

0 55 0 0

0 68 0 1

0 25 1 0

0 17 0 0

0 45 0 1

0 44 0 1

0 67 0 0

0 55 0 1

1 61 1 0

1 19 1 0

1 69 0 0

1 23 1 1

1 19 0 0

1 72 1 1

1 74 1 0

1 31 0 1

1 16 1 0

1 61 1 0

;

proc logistic data=logistic  outest=model;

model accident(event='1')=age vision drive/selection=stepwise

sle=0.05 sls=0.05 outroc=roc;

output out= pred   p=p1 ;

run;

proc npar1way data=pred  noprint;

    class accident;

    var p1;

    output out=ks;

run;
以上是一段常规的计算KS值。
首先要了解什么是KS值,K-S值(kolmogorov-smirnov curve)将总体进行n等分组并按照违约概率降序排列,计算每一等份中违约与正常百分比的累积分布,绘制出两者之间的差值就是K-S曲线。其中K-S曲线中的最大值即为K-S统计量,取值范围在0到1之间。
以下是计算K-S值及画图的宏程序:
/**data:逻辑回归后包含验证结果的数据集,var:违约概率变量,status:分类变量,data1:切分后的变量,Mks:最大ks值,M:分组组数**/

%macro KS(data, var, status, data1, Mks,M);

proc sort data=&data;

by &var;

run;

proc sql noprint;

 select sum(&status) into:P from &data;

 select count(*) into :Ntot from &data;

 quit;

 %let N=%eval(&Ntot-&P);

data &data1;

set &data nobs=NN;

by &var;

retain tile 1  totP  0 totN 0;

Tile_size=ceil(NN/&M);

if &status=1 then totP=totP+&status;

else totN=totN+1;

Pper=totP/&P;

Nper=totN/&N;

if _N_ = Tile*Tile_Size then

  do;

  output;

   if Tile <&M then  

       do;

         Tile=Tile+1;

         SumResp=0;

       end;

  end;    

keep Tile Pper Nper;

run;

data temp;

     Tile=0;

     Pper=0;

     NPer=0;

run;

Data &data1;

  set temp &data1;

run;

data &data1;

    set &data1;

    Tile=Tile/&M;

    label Pper='Percent of Positives';

    label NPer ='Percent of Negatives';

    label Tile ='Percent of population';

    KS=NPer-PPer;

run;

proc sql noprint;

 select max(KS) into :&Mks from &data1;

run; quit;

proc datasets library=work nodetails nolist;

 delete temp ;

run;

quit;

%mend;

%macro PlotKS(data1);

 symbol1 value=dot color=red   interpol=join  height=1;

 legend1 position=top;

 symbol2 value=dot color=blue  interpol=join  height=1;

 symbol3 value=dot color=green interpol=join  height=1;

proc gplot data=&data1;

  plot( NPer PPer KS)*Tile / overlay legend=legend1;

 run;

quit;

    goptions reset=all;

%mend;

数据分析咨询请扫描二维码

客服在线
立即咨询