SAS中文论坛
标题:
SAS MACRO TO EVALUATE THE PREDICTABILITY OF A SCORECARD
[打印本页]
作者:
shiyiming
时间:
2010-10-22 13:24
标题:
SAS MACRO TO EVALUATE THE PREDICTABILITY OF A SCORECARD
From Wensui Liu's blog
<font size="2"><span style="background-color:#ffffff"><font color="#0000ff">%macro</font></span> separate(<span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> = , score = , y = , wt = NONE);<br /><span style="background-color:#ffffff"><font color="#008000">***************************************************************;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">* THIS MACRO IS TO EVALUATE THE PREDICTABILITY OF A SCORECARD *;</font></span> <br /><span style="background-color:#ffffff"><font color="#008000">* ----------------------------------------------------------- *;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">* PARAMETERS: *;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">* DATA : INPUT DATASET *;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">* SCORE : SCORECARD VARIABLE *;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">* Y : RESPONSE VARIABLE IN (0, 1) *;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">* WT : WEIGHT VARIABLE IN POSITIVE INTEGER *;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">* ----------------------------------------------------------- *;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">* OUTPUTS: *;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">* &AUC : MACRO VARIABLE FOR AUC STATISTICS *;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">* &GINI : MACRO VARIABLE FOR GINI COEFFICIENT *;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">* &KS : MACRO VARIABLE FOR KS STATISTICS *;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">* &KS_SCORE : MACRO VARIABLE FOR SCORE VALUE MAXIMIZING KS *;</font></span> <br /><span style="background-color:#ffffff"><font color="#008000">* &DIVERGENCE : MACRO VARIABLE FOR DIVERGENCE *;</font></span> <br /><span style="background-color:#ffffff"><font color="#008000">* REPORT : GOOD-BAD SEPARATION REPORT IN HTML FORMAT *;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">* ----------------------------------------------------------- *;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">* AUTHOR: <!-- e --><a href="mailto:WENSLIU@PAYPAL.COM">WENSLIU@PAYPAL.COM</a><!-- e --> *;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">***************************************************************;</font></span><br /><br /><span style="background-color:#ffffff"><font color="#0000ff">options</font></span> nonumber nodate orientation = landscape linesize = <span style="background-color:#ffffff"><font color="#2e8b57"><b>160</b></font></span> nocenter; <br /><br /><span style="background-color:#ffffff"><font color="#008000">*** DEFAULT GROUP NUMBER FOR REPORT ***;</font></span><br /><span style="background-color:#ffffff"><font color="#0000ff">%let</font></span> grp = <span style="background-color:#ffffff"><font color="#2e8b57"><b>10</b></font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#008000">*** CHECK IF THERE IS WEIGHT VARIABLE ***;</font></span><br /><span style="background-color:#ffffff"><font color="#0000ff">%if</font></span> <span style="background-color:#ffffff"><font color="#0000ff">%upcase</font></span>(<font color="#0000ff"><b>&wt</b></font>) = NONE <span style="background-color:#ffffff"><font color="#0000ff">%then</font></span> <span style="background-color:#ffffff"><font color="#0000ff">%do</font></span>;<br /> <span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> _tmp1 (<span style="background-color:#ffffff"><font color="#0000ff">keep</font></span> = <font color="#0000ff"><b>&y</b></font> <font color="#0000ff"><b>&score</b></font> _wt);<br /> <span style="background-color:#ffffff"><font color="#0000ff">set</font></span> <font color="#0000ff"><b>&data</b></font>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">where</font></span> <font color="#0000ff"><b>&y</b></font> <span style="background-color:#ffffff"><font color="#0000ff">in</font></span> (<span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>, <span style="background-color:#ffffff"><font color="#2e8b57"><b>0</b></font></span>) <span style="background-color:#ffffff"><font color="#0000ff">and</font></span><br /> <font color="#0000ff"><b>&score</b></font> ~= .;<br /> _wt = <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>;<br /> <font color="#0000ff"><b>&score</b></font> = <span style="background-color:#ffffff"><font color="#0000ff">round</font></span>(<font color="#0000ff"><b>&score</b></font>., <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>);<br /> <span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /><span style="background-color:#ffffff"><font color="#0000ff">%end</font></span>;<br /><span style="background-color:#ffffff"><font color="#0000ff">%else</font></span> <span style="background-color:#ffffff"><font color="#0000ff">%do</font></span>;<br /> <span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> _tmp1 (<span style="background-color:#ffffff"><font color="#0000ff">keep</font></span> = <font color="#0000ff"><b>&y</b></font> <font color="#0000ff"><b>&score</b></font> _wt);<br /> <span style="background-color:#ffffff"><font color="#0000ff">set</font></span> <font color="#0000ff"><b>&data</b></font>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">where</font></span> <font color="#0000ff"><b>&y</b></font> <span style="background-color:#ffffff"><font color="#0000ff">in</font></span> (<span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>, <span style="background-color:#ffffff"><font color="#2e8b57"><b>0</b></font></span>) <span style="background-color:#ffffff"><font color="#0000ff">and</font></span><br /> <font color="#0000ff"><b>&score</b></font> ~= . <span style="background-color:#ffffff"><font color="#0000ff">and</font></span><br /> <span style="background-color:#ffffff"><font color="#0000ff">round</font></span>(<font color="#0000ff"><b>&wt</b></font>., <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>) > <span style="background-color:#ffffff"><font color="#2e8b57"><b>0</b></font></span>;<br /> _wt = <span style="background-color:#ffffff"><font color="#0000ff">round</font></span>(<font color="#0000ff"><b>&wt</b></font>., <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>);<br /> <font color="#0000ff"><b>&score</b></font> = <span style="background-color:#ffffff"><font color="#0000ff">round</font></span>(<font color="#0000ff"><b>&score</b></font>., <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>);<br /> <span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /> <br /><span style="background-color:#ffffff"><font color="#0000ff">%end</font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#0000ff">filename</font></span> lst_out temp;<br /><br /><span style="background-color:#ffffff"><font color="#000080"><b>proc printto</b></font></span> new print = lst_out;<br /><span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#008000">*** CONDUCT NON-PARAMETRIC TESTS ***;</font></span> <br />ods <span style="background-color:#ffffff"><font color="#0000ff">output</font></span> wilcoxonscores = _wx;<br />ods <span style="background-color:#ffffff"><font color="#0000ff">output</font></span> kolsmir2stats = _ks;<br /><span style="background-color:#ffffff"><font color="#000080"><b>proc npar1way</b></font></span> wilcoxon edf <span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> = _tmp1;<br /> class <font color="#0000ff"><b>&y</b></font>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">var</font></span> <font color="#0000ff"><b>&score</b></font>;<br /> freq _wt;<br /><span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#000080"><b>proc printto</b></font></span>;<br /><span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#000080"><b>proc sort</b></font></span> <span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> = _wx;<br /> <span style="background-color:#ffffff"><font color="#0000ff">by</font></span> class;<br /><span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#008000">*** CALCULATE ROC AND GINI ***;</font></span><br /><span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> <font color="#a020f0">_null_</font>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">set</font></span> _wx <span style="background-color:#ffffff"><font color="#0000ff">end</font></span> = eof;<br /> <span style="background-color:#ffffff"><font color="#0000ff">by</font></span> class;<br /><br /> <span style="background-color:#ffffff"><font color="#0000ff">array</font></span> a{<span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span>, <span style="background-color:#ffffff"><font color="#2e8b57"><b>3</b></font></span>} _temporary_;<br /> <span style="background-color:#ffffff"><font color="#0000ff">if</font></span> <font color="#a020f0">_n_</font> = <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">then</font></span> <span style="background-color:#ffffff"><font color="#0000ff">do</font></span>;<br /> a[<span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>, <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>] = <span style="background-color:#ffffff"><font color="#0000ff">n</font></span>;<br /> a[<span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>, <span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span>] = sumofscores;<br /> a[<span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>, <span style="background-color:#ffffff"><font color="#2e8b57"><b>3</b></font></span>] = expectedsum;<br /> <span style="background-color:#ffffff"><font color="#0000ff">end</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">else</font></span> <span style="background-color:#ffffff"><font color="#0000ff">do</font></span>;<br /> a[<span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span>, <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>] = <span style="background-color:#ffffff"><font color="#0000ff">n</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">end</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">if</font></span> eof <span style="background-color:#ffffff"><font color="#0000ff">then</font></span> <span style="background-color:#ffffff"><font color="#0000ff">do</font></span>;<br /> auc = (a[<span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>, <span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span>] - a[<span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>, <span style="background-color:#ffffff"><font color="#2e8b57"><b>3</b></font></span>]) / (a[<span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>, <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>] * a[<span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span>, <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>]) + <span style="background-color:#ffffff"><font color="#2e8b57"><b>0.5</b></font></span>;<br /> gini = <span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span> * (auc - <span style="background-color:#ffffff"><font color="#2e8b57"><b>0.5</b></font></span>); <br /> <span style="background-color:#ffffff"><font color="#0000ff">call</font></span> execute(<span style="background-color:#ffffff"><font color="#a020f0">'%global auc; %let auc = '</font></span>||<span style="background-color:#ffffff"><font color="#0000ff">put</font></span>(auc, <span style="background-color:#ffffff"><font color="#2e8b57"><b>10.8</b></font></span>)||<span style="background-color:#ffffff"><font color="#a020f0">';'</font></span>);<br /> <span style="background-color:#ffffff"><font color="#0000ff">call</font></span> execute(<span style="background-color:#ffffff"><font color="#a020f0">'%global gini; %let gini = '</font></span>||<span style="background-color:#ffffff"><font color="#0000ff">put</font></span>(gini, <span style="background-color:#ffffff"><font color="#2e8b57"><b>10.8</b></font></span>)||<span style="background-color:#ffffff"><font color="#a020f0">';'</font></span>);<br /> <span style="background-color:#ffffff"><font color="#0000ff">end</font></span>;<br /><span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#008000">*** CALCULATE KS ***;</font></span><br /><span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> <font color="#a020f0">_null_</font>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">set</font></span> _ks;<br /><br /> <span style="background-color:#ffffff"><font color="#0000ff">if</font></span> <font color="#a020f0">_n_</font> = <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">then</font></span> <span style="background-color:#ffffff"><font color="#0000ff">do</font></span>;<br /> ks = nvalue2 * <span style="background-color:#ffffff"><font color="#2e8b57"><b>100</b></font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">call</font></span> execute(<span style="background-color:#ffffff"><font color="#a020f0">'%global ks; %let ks = '</font></span>||<span style="background-color:#ffffff"><font color="#0000ff">put</font></span>(ks, <span style="background-color:#ffffff"><font color="#2e8b57"><b>10.8</b></font></span>)||<span style="background-color:#ffffff"><font color="#a020f0">';'</font></span>);<br /> <span style="background-color:#ffffff"><font color="#0000ff">end</font></span>;<br /><span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#008000">*** CAPTURE SCORE POINT FOR MAX KS ***;</font></span><br /><span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> <font color="#a020f0">_null_</font>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">infile</font></span> lst_out;<br /> <span style="background-color:#ffffff"><font color="#0000ff">input</font></span> @<span style="background-color:#ffffff"><font color="#a020f0">" at Maximum = "</font></span> ks_score;<br /> <span style="background-color:#ffffff"><font color="#0000ff">output</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">call</font></span> execute(<span style="background-color:#ffffff"><font color="#a020f0">'%global ks_score; %let ks_score = '</font></span>||<span style="background-color:#ffffff"><font color="#0000ff">put</font></span>(ks_score, <span style="background-color:#ffffff"><font color="#2e8b57"><b>10.0</b></font></span>)||<span style="background-color:#ffffff"><font color="#a020f0">';'</font></span>);<br /> <span style="background-color:#ffffff"><font color="#0000ff">stop</font></span>;<br /><span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#000080"><b>proc summary</b></font></span> <span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> = _tmp1 nway;<br /> class <font color="#0000ff"><b>&y</b></font>;<br /> freq _wt;<br /> <span style="background-color:#ffffff"><font color="#0000ff">output</font></span> out = _data_ (<span style="background-color:#ffffff"><font color="#0000ff">drop</font></span> = _type_ _freq_)<br /> <span style="background-color:#ffffff"><font color="#0000ff">mean</font></span>(<font color="#0000ff"><b>&score</b></font>.) = <span style="background-color:#ffffff"><font color="#0000ff">mean</font></span> <span style="background-color:#ffffff"><font color="#0000ff">var</font></span>(<font color="#0000ff"><b>&score</b></font>.) = variance;<br /><span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#008000">*** CALCULATE DIVERGENCE ***;</font></span><br /><span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> <font color="#a020f0">_null_</font>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">set</font></span> _last_ <span style="background-color:#ffffff"><font color="#0000ff">end</font></span> = eof;<br /> <span style="background-color:#ffffff"><font color="#0000ff">array</font></span> a{<span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span>, <span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span>} _temporary_;<br /> <span style="background-color:#ffffff"><font color="#0000ff">if</font></span> <font color="#a020f0">_n_</font> = <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">then</font></span> <span style="background-color:#ffffff"><font color="#0000ff">do</font></span>;<br /> a[<span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>, <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>] = <span style="background-color:#ffffff"><font color="#0000ff">mean</font></span>;<br /> a[<span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>, <span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span>] = variance;<br /> <span style="background-color:#ffffff"><font color="#0000ff">end</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">else</font></span> <span style="background-color:#ffffff"><font color="#0000ff">do</font></span>;<br /> a[<span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span>, <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>] = <span style="background-color:#ffffff"><font color="#0000ff">mean</font></span>;<br /> a[<span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span>, <span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span>] = variance;<br /> <span style="background-color:#ffffff"><font color="#0000ff">end</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">if</font></span> eof <span style="background-color:#ffffff"><font color="#0000ff">then</font></span> <span style="background-color:#ffffff"><font color="#0000ff">do</font></span>;<br /> divergence = (a[<span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>, <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>] - a[<span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span>, <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>]) ** <span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span> / ((a[<span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>, <span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span>] + a[<span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span>, <span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span>]) / <span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span>);<br /> <span style="background-color:#ffffff"><font color="#0000ff">call</font></span> execute(<span style="background-color:#ffffff"><font color="#a020f0">'%global divergence; %let divergence = '</font></span>||<span style="background-color:#ffffff"><font color="#0000ff">put</font></span>(divergence, <span style="background-color:#ffffff"><font color="#2e8b57"><b>10.8</b></font></span>)||<span style="background-color:#ffffff"><font color="#a020f0">';'</font></span>); <br /> <span style="background-color:#ffffff"><font color="#0000ff">end</font></span>; <br /><span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#008000">*** CAPTURE THE DIRECTION OF SCORE ***;</font></span><br />ods listing <span style="background-color:#ffffff"><font color="#0000ff">close</font></span>;<br />ods <span style="background-color:#ffffff"><font color="#0000ff">output</font></span> spearmancorr = _cor;<br /><span style="background-color:#ffffff"><font color="#000080"><b>proc corr</b></font></span> <span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> = _tmp1 spearman;<br /> <span style="background-color:#ffffff"><font color="#0000ff">var</font></span> <font color="#0000ff"><b>&y</b></font>;<br /> with <font color="#0000ff"><b>&score</b></font>;<br /><span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br />ods listing;<br /> <br /><span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> <font color="#a020f0">_null_</font>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">set</font></span> _cor;<br /> <span style="background-color:#ffffff"><font color="#0000ff">if</font></span> <font color="#0000ff"><b>&y</b></font> >= <span style="background-color:#ffffff"><font color="#2e8b57"><b>0</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">then</font></span> <span style="background-color:#ffffff"><font color="#0000ff">do</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">call</font></span> symput(<span style="background-color:#ffffff"><font color="#a020f0">'desc'</font></span>, <span style="background-color:#ffffff"><font color="#a020f0">'descending'</font></span>);<br /> <span style="background-color:#ffffff"><font color="#0000ff">end</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">else</font></span> <span style="background-color:#ffffff"><font color="#0000ff">do</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">call</font></span> symput(<span style="background-color:#ffffff"><font color="#a020f0">'desc'</font></span>, <span style="background-color:#ffffff"><font color="#a020f0">' '</font></span>);<br /> <span style="background-color:#ffffff"><font color="#0000ff">end</font></span>;<br /><span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /><span style="background-color:#ffffff"><font color="#0000ff">%put</font></span> <font color="#0000ff"><b>&desc</b></font>;<br /><br /><span style="background-color:#ffffff"><font color="#008000">*** DEFINE DECILES WITH WEIGHT VARIABLE ***;</font></span><br /><span style="background-color:#ffffff"><font color="#000080"><b>proc univariate</b></font></span> <span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> = _tmp1 noprint;<br /> freq _wt;<br /> <span style="background-color:#ffffff"><font color="#0000ff">var</font></span> <font color="#0000ff"><b>&score</b></font>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">output</font></span> out = _tmp2 pctlpre = decile_ pctlpts = <span style="background-color:#ffffff"><font color="#2e8b57"><b>0</b></font></span> to <span style="background-color:#ffffff"><font color="#2e8b57"><b>100</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">by</font></span> <span style="background-color:#ffffff"><font color="#0000ff">%sysevalf</font></span>(<span style="background-color:#ffffff"><font color="#2e8b57"><b>100</b></font></span> / <font color="#0000ff"><b>&grp</b></font>.);<br /><span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> _tmp3 (<span style="background-color:#ffffff"><font color="#0000ff">keep</font></span> = <span style="background-color:#ffffff"><font color="#0000ff">rank</font></span> _wt <font color="#0000ff"><b>&y</b></font> <font color="#0000ff"><b>&score</b></font> _dwt);<br /> <span style="background-color:#ffffff"><font color="#0000ff">set</font></span> _tmp1;<br /><br /> <span style="background-color:#ffffff"><font color="#0000ff">if</font></span> <font color="#a020f0">_n_</font> = <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">then</font></span> <span style="background-color:#ffffff"><font color="#0000ff">do</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">set</font></span> _tmp2;<br /> <span style="background-color:#ffffff"><font color="#0000ff">end</font></span>;<br /><br /> <span style="background-color:#ffffff"><font color="#0000ff">array</font></span> d[*] decile_:;<br /> <span style="background-color:#ffffff"><font color="#0000ff">rank</font></span> = <span style="background-color:#ffffff"><font color="#2e8b57"><b>999</b></font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">do</font></span> i = <span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span> to <span style="background-color:#ffffff"><font color="#0000ff">dim</font></span>(d);<br /> <span style="background-color:#ffffff"><font color="#0000ff">if</font></span> <font color="#0000ff"><b>&score</b></font> <= d[i] <span style="background-color:#ffffff"><font color="#0000ff">and</font></span> <span style="background-color:#ffffff"><font color="#0000ff">rank</font></span> = <span style="background-color:#ffffff"><font color="#2e8b57"><b>999</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">then</font></span> <span style="background-color:#ffffff"><font color="#0000ff">do</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">rank</font></span> = i - <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">end</font></span>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">end</font></span>; <br /> <br /> _dwt = <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span> / _wt; <br /><span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#000080"><b>proc summary</b></font></span> <span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> = _last_ nway;<br /> class <span style="background-color:#ffffff"><font color="#0000ff">rank</font></span>;<br /> freq _wt;<br /> <span style="background-color:#ffffff"><font color="#0000ff">output</font></span> out = _data_ (<span style="background-color:#ffffff"><font color="#0000ff">drop</font></span> = _type_ <span style="background-color:#ffffff"><font color="#0000ff">rename</font></span> = (_freq_ = freq))<br /> <span style="background-color:#ffffff"><font color="#0000ff">min</font></span>(<font color="#0000ff"><b>&score</b></font>) = min_score <span style="background-color:#ffffff"><font color="#0000ff">max</font></span>(<font color="#0000ff"><b>&score</b></font>) = max_score<br /> <span style="background-color:#ffffff"><font color="#0000ff">sum</font></span>(<font color="#0000ff"><b>&y</b></font>) = bads <span style="background-color:#ffffff"><font color="#0000ff">sum</font></span>(_dwt) = raw;<br /><span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#000080"><b>proc sql</b></font></span> noprint;<br /> <span style="background-color:#ffffff"><font color="#0000ff">select</font></span> <span style="background-color:#ffffff"><font color="#0000ff">sum</font></span>(bads) <span style="background-color:#ffffff"><font color="#0000ff">into</font></span> :bcnt <span style="background-color:#ffffff"><font color="#0000ff">from</font></span> _last_;<br /> <span style="background-color:#ffffff"><font color="#0000ff">select</font></span> <span style="background-color:#ffffff"><font color="#0000ff">sum</font></span>(freq) - <span style="background-color:#ffffff"><font color="#0000ff">sum</font></span>(bads) <span style="background-color:#ffffff"><font color="#0000ff">into</font></span> :gcnt <span style="background-color:#ffffff"><font color="#0000ff">from</font></span> _last_;<br /><span style="background-color:#ffffff"><font color="#000080"><b>quit</b></font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#000080"><b>proc sort</b></font></span> <span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> = _last_ (<span style="background-color:#ffffff"><font color="#0000ff">drop</font></span> = <span style="background-color:#ffffff"><font color="#0000ff">rank</font></span>);<br /> <span style="background-color:#ffffff"><font color="#0000ff">by</font></span> <font color="#0000ff"><b>&desc</b></font> min_score;<br /><span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> _data_;<br /> <span style="background-color:#ffffff"><font color="#0000ff">set</font></span> _last_;<br /> <span style="background-color:#ffffff"><font color="#0000ff">by</font></span> <font color="#0000ff"><b>&desc</b></font> min_score;<br /><br /> i + <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span>; <br /> percent = i * <span style="background-color:#ffffff"><font color="#0000ff">%sysevalf</font></span>(<span style="background-color:#ffffff"><font color="#2e8b57"><b>100</b></font></span> / <font color="#0000ff"><b>&grp</b></font>) / <span style="background-color:#ffffff"><font color="#2e8b57"><b>100</b></font></span>; <br /> good = freq - bads;<br /> odds = good / bads;<br /><br /> hit_rate = bads / freq;<br /> <span style="background-color:#ffffff"><font color="#0000ff">retain</font></span> cum_bads cum_freq;<br /> cum_bads + bads;<br /> cum_freq + freq;<br /> cum_hit_rate = cum_bads / cum_freq;<br /><br /> cat_rate = bads / <font color="#0000ff"><b>&bcnt</b></font>;<br /> <span style="background-color:#ffffff"><font color="#0000ff">retain</font></span> cum_cat_rate;<br /> cum_cat_rate + cat_rate; <br /><span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#008000">*** GENERATE GAIN CHART ***;</font></span><br />ods html <span style="background-color:#ffffff"><font color="#0000ff">file</font></span> = <span style="background-color:#ffffff"><font color="#a020f0">"%upcase(%trim(&score))_SEPARATION_REPORT.html"</font></span> style = sasweb;<br /><span style="background-color:#ffffff"><font color="#0000ff">title</font></span>;<br /><span style="background-color:#ffffff"><font color="#000080"><b>proc report</b></font></span> <span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span> = _last_ box spacing = <span style="background-color:#ffffff"><font color="#2e8b57"><b>1</b></font></span> split = <span style="background-color:#ffffff"><font color="#a020f0">"/"</font></span><br /> style(header) = [font_face = <span style="background-color:#ffffff"><font color="#a020f0">"courier new"</font></span>] style(column) = [font_face = <span style="background-color:#ffffff"><font color="#a020f0">"courier new"</font></span>]<br /> style(lines) = [font_face = <span style="background-color:#ffffff"><font color="#a020f0">"courier new"</font></span>] style(report) = [font_face = <span style="background-color:#ffffff"><font color="#a020f0">"courier new"</font></span>]<br /> style(summary) = [font_face = <span style="background-color:#ffffff"><font color="#a020f0">"courier new"</font></span> font_style = roman]; <br /><br /> column(<span style="background-color:#ffffff"><font color="#a020f0">"/GOOD BAD SEPARATION REPORT FOR %upcase(%trim(&score)) WEIGHTED BY %upcase(&wt) IN DATA %upcase(%trim(&data))</font></span><br /><span style="background-color:#ffffff"><font color="#a020f0"> / MAXIMUM KS = %trim(&ks) AT SCORE POINT %trim(&ks_score) / </font></span><br /><span style="background-color:#ffffff"><font color="#a020f0"> / ( AUC STATISTICS = %trim(&auc), GINI COEFFICIENT = %trim(&gini), DIVERGENCE = %trim(&divergence) )/ /"</font></span><br /> percent min_score max_score raw good bads freq odds hit_rate cum_hit_rate cat_rate cum_cat_rate);<br /><br /> define percent / <span style="background-color:#ffffff"><font color="#a020f0">" % "</font></span> center width = <span style="background-color:#ffffff"><font color="#2e8b57"><b>6</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">format</font></span> = percent6.<span style="background-color:#ffffff"><font color="#2e8b57"><b>0</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">order</font></span> <span style="background-color:#ffffff"><font color="#0000ff">order</font></span> = <span style="background-color:#ffffff"><font color="#000080"><b>data</b></font></span>;<br /> define min_score / <span style="background-color:#ffffff"><font color="#a020f0">"MIN/SCORE"</font></span> width = <span style="background-color:#ffffff"><font color="#2e8b57"><b>6</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">format</font></span> = <span style="background-color:#ffffff"><font color="#2e8b57"><b>5</b></font></span>. analysis <span style="background-color:#ffffff"><font color="#0000ff">min</font></span> center;<br /> define max_score / <span style="background-color:#ffffff"><font color="#a020f0">"MAX/SCORE"</font></span> width = <span style="background-color:#ffffff"><font color="#2e8b57"><b>6</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">format</font></span> = <span style="background-color:#ffffff"><font color="#2e8b57"><b>5</b></font></span>. analysis <span style="background-color:#ffffff"><font color="#0000ff">max</font></span> center;<br /> define raw / <span style="background-color:#ffffff"><font color="#a020f0">"RAW/UNITS"</font></span> width = <span style="background-color:#ffffff"><font color="#2e8b57"><b>10</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">format</font></span> = comma9. analysis <span style="background-color:#ffffff"><font color="#0000ff">sum</font></span> center;<br /> define good / <span style="background-color:#ffffff"><font color="#a020f0">"GOOD/#"</font></span> width = <span style="background-color:#ffffff"><font color="#2e8b57"><b>15</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">format</font></span> = comma14. analysis <span style="background-color:#ffffff"><font color="#0000ff">sum</font></span>;<br /> define bads / <span style="background-color:#ffffff"><font color="#a020f0">"BAD/#"</font></span> width = <span style="background-color:#ffffff"><font color="#2e8b57"><b>15</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">format</font></span> = comma14. analysis <span style="background-color:#ffffff"><font color="#0000ff">sum</font></span>;<br /> define freq / <span style="background-color:#ffffff"><font color="#a020f0">"TOTAL/#"</font></span> width = <span style="background-color:#ffffff"><font color="#2e8b57"><b>15</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">format</font></span> = comma14. analysis <span style="background-color:#ffffff"><font color="#0000ff">sum</font></span>;<br /> define odds / <span style="background-color:#ffffff"><font color="#a020f0">"ODDS"</font></span> width = <span style="background-color:#ffffff"><font color="#2e8b57"><b>10</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">format</font></span> = <span style="background-color:#ffffff"><font color="#2e8b57"><b>9</b></font></span>. <span style="background-color:#ffffff"><font color="#0000ff">order</font></span>;<br /> define hit_rate / <span style="background-color:#ffffff"><font color="#a020f0">"HIT/RATE"</font></span> width = <span style="background-color:#ffffff"><font color="#2e8b57"><b>10</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">format</font></span> = percent9.<span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">order</font></span> center;<br /> define cum_hit_rate / <span style="background-color:#ffffff"><font color="#a020f0">"CUMULATIVE/HIT RATE"</font></span> width = <span style="background-color:#ffffff"><font color="#2e8b57"><b>10</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">format</font></span> = percent9.<span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">order</font></span>;<br /> define cat_rate / <span style="background-color:#ffffff"><font color="#a020f0">"CATCH/RATE"</font></span> width = <span style="background-color:#ffffff"><font color="#2e8b57"><b>10</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">format</font></span> = percent9.<span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">order</font></span> center;<br /> define cum_cat_rate / <span style="background-color:#ffffff"><font color="#a020f0">"CUMULATIVE/CATCH RATE"</font></span> width = <span style="background-color:#ffffff"><font color="#2e8b57"><b>10</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">format</font></span> = percent9.<span style="background-color:#ffffff"><font color="#2e8b57"><b>2</b></font></span> <span style="background-color:#ffffff"><font color="#0000ff">order</font></span>; <br /><br /> rbreak after / summarize style = [font_weight = bold];<br /><span style="background-color:#ffffff"><font color="#000080"><b>run</b></font></span>; <br />ods html <span style="background-color:#ffffff"><font color="#0000ff">close</font></span>;<br /><br /><span style="background-color:#ffffff"><font color="#008000">*************************************************;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">* END OF THE MACRO *;</font></span><br /><span style="background-color:#ffffff"><font color="#008000">*************************************************;</font></span> <br /><span style="background-color:#ffffff"><font color="#0000ff">%mend</font></span> separate;</font>
欢迎光临 SAS中文论坛 (https://mysas.net/forum/)
Powered by Discuz! X3.2