LISTSERV at the University of Georgia
Menubar Imagemap
Home Browse Manage Request Manuals Register
Previous messageNext messagePrevious in topicNext in topicPrevious by same authorNext by same authorPrevious page (October 2008, week 2)Back to main SAS-L pageJoin or leave SAS-L (or change settings)ReplyPost a new messageSearchProportional fontNon-proportional font
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
Comments:   To: paul wilson <paulwilsn@yahoo.com>
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!! >


Back to: Top of message | Previous page | Main SAS-L page