| Date: | Tue, 14 Oct 2008 10:22:27 +0800 |
| Reply-To: | Alex Murphy <goladin@GMAIL.COM> |
| Sender: | "SAS(r) Discussion" <SAS-L@LISTSERV.UGA.EDU> |
| From: | Alex Murphy <goladin@GMAIL.COM> |
| Subject: | Re: ROC & Gains/Lift Chart |
|
| In-Reply-To: | <883306.98319.qm@web45415.mail.sp1.yahoo.com> |
| Content-Type: | text/plain; charset=ISO-8859-1 |
Hi,
Try this. Not very efficient though.
%MACRO ROC(INPUT=,TARGET=,PRED=,ACTUAL=);
/************************************
SORTING IN DESCENDING ORDER
*************************************/
PROC SORT DATA=&INPUT;
BY DESCENDING &TARGET;
RUN;
/************************************
CREATING ROC ORDER
*************************************/
DATA &INPUT;
SET &INPUT;
ROC_ORDER = _N_;
CALL SYMPUT('ROC_COUNTS',_N_);
RUN;
/*************************************
INCREMENT GAPS AND LIMIT CALCULATION
**************************************/
%LET INCREMENT_GAP = %SYSEVALF(&ROC_COUNTS/20,FLOOR);
%DO I = 1 %TO 20;
%IF &I = 1 %THEN %DO;
%LET LIMIT_&I = %EVAL(1+&INCREMENT_GAP);
%END;
%ELSE %DO;
%LET J = %EVAL(&I-1);
%LET LIMIT_&I = %EVAL(&&LIMIT_&J+&INCREMENT_GAP);
%END;
%END;
/*************************************************
ROC COMPUTATION
**************************************************/
DATA &INPUT;
SET &INPUT;
IF ROC_ORDER <= &LIMIT_1 THEN ROC_GROUP = 1;
ELSE IF &LIMIT_1 < ROC_ORDER <= &LIMIT_2 THEN ROC_GROUP = 2;
ELSE IF &LIMIT_2 < ROC_ORDER <= &LIMIT_3 THEN ROC_GROUP = 3;
ELSE IF &LIMIT_3 < ROC_ORDER <= &LIMIT_4 THEN ROC_GROUP = 4;
ELSE IF &LIMIT_4 < ROC_ORDER <= &LIMIT_5 THEN ROC_GROUP = 5;
ELSE IF &LIMIT_5 < ROC_ORDER <= &LIMIT_6 THEN ROC_GROUP = 6;
ELSE IF &LIMIT_6 < ROC_ORDER <= &LIMIT_7 THEN ROC_GROUP = 7;
ELSE IF &LIMIT_7 < ROC_ORDER <= &LIMIT_8 THEN ROC_GROUP = 8;
ELSE IF &LIMIT_8 < ROC_ORDER <= &LIMIT_9 THEN ROC_GROUP = 9;
ELSE IF &LIMIT_9 < ROC_ORDER <= &LIMIT_10 THEN ROC_GROUP = 10;
ELSE IF &LIMIT_10 < ROC_ORDER <= &LIMIT_11 THEN ROC_GROUP = 11;
ELSE IF &LIMIT_11 < ROC_ORDER <= &LIMIT_12 THEN ROC_GROUP = 12;
ELSE IF &LIMIT_12 < ROC_ORDER <= &LIMIT_13 THEN ROC_GROUP = 13;
ELSE IF &LIMIT_13 < ROC_ORDER <= &LIMIT_14 THEN ROC_GROUP = 14;
ELSE IF &LIMIT_14 < ROC_ORDER <= &LIMIT_15 THEN ROC_GROUP = 15;
ELSE IF &LIMIT_15 < ROC_ORDER <= &LIMIT_16 THEN ROC_GROUP = 16;
ELSE IF &LIMIT_16 < ROC_ORDER <= &LIMIT_17 THEN ROC_GROUP = 17;
ELSE IF &LIMIT_17 < ROC_ORDER <= &LIMIT_18 THEN ROC_GROUP = 18;
ELSE IF &LIMIT_18 < ROC_ORDER <= &LIMIT_19 THEN ROC_GROUP = 19;
ELSE ROC_GROUP = 20;
RUN;
/*******************************************************
ASSIGNMENT OF VALUES
********************************************************/
PROC SQL NOPRINT;
%DO I = 1 %TO 20;
SELECT COUNT(*) INTO: TPSUM&I FROM &INPUT WHERE ROC_GROUP <= &I AND
&PRED = 1 AND &ACTUAL = 1;
SELECT COUNT(*) INTO: TPCOUNT&I FROM &INPUT WHERE &PRED = 1 AND &ACTUAL
= 1;
SELECT COUNT(*) INTO: FPSUM&I FROM &INPUT WHERE ROC_GROUP <= &I AND
&PRED = 1 AND &ACTUAL = 0;
SELECT COUNT(*) INTO: FPCOUNT&I FROM &INPUT WHERE &PRED = 1 AND &ACTUAL
= 0;
%END;
QUIT;
DATA &INPUT._ROC;
%DO I = 0 %TO 20;
%IF &I = 0 %THEN %DO;
ROC = &I;
TPSUM = 0;
TPCOUNT = 0;
TPR = 0;
FPSUM = 0;
FPCOUNT = 0;
FPR = 0;
BASE_TPR = 0;
BASE_FPR = 0;
%END;
%ELSE %DO;
ROC = &I;
TPSUM = &&TPSUM&I;
TPCOUNT = &&TPCOUNT&I;
TPR = TPSUM/TPCOUNT;
FPSUM = &&FPSUM&I;
FPCOUNT = &&FPCOUNT&I;
FPR = FPSUM/FPCOUNT;
BASE_TPR = &I/20;
BASE_FPR = &I/20;
%END;
OUTPUT;
%END;
RUN;
SYMBOL INTERPOL=JOIN;
PROC GPLOT DATA = &INPUT._ROC;
PLOT TPR*FPR BASE_TPR*BASE_FPR/OVERLAY;
RUN;
QUIT;
GOPTIONS RESET=ALL;
%MEND;
Regards,
Murphy
On Tue, Oct 14, 2008 at 9:45 AM, paul wilson <paulwilsn@yahoo.com> wrote:
> Hi,
>
> Would anyone be able to provide an example of a code needed to produce ROC
> & Gains/Lift charts in SAS?
>
> Thanks a lot in advance!!
>
|