***** Macros to calculate IV for QCB char Worst Status Variables *****;
* Macro Variable Binning for QCB Char Worst Status variables ;
%macro QCBWSBin(qvar);
length &qvar._f $40;
length &qvar._g $5;
if missing(&qvar.) then do;
&qvar._g = 'G1'; &qvar._f = 'G1: Missing';
end;
else if &qvar. in ('_', 'T') then do;
&qvar._g = 'G2'; &qvar._f = 'G2: default value (- T)';
end;
else if &qvar. in ('M','C','H','F','G','K') then do;
&qvar._g = 'G3'; &qvar._f = "G3: default value (M C H F G K)";
end;
else if &qvar. in ('R','V','D') then do;
&qvar._g = 'G4'; &qvar._f = "G4: R V D";
end;
else if &qvar. in ('6','B','5','4') then do;
&qvar._g = 'G5'; &qvar._f = "G5: 6 B 5 4";
end;
else if &qvar. in ('3','A','I','2','1') then do;
&qvar._g = 'G6'; &qvar._f = "G6: 3 A I 2 1";
end;
else if &qvar. in ('Q','U','N','Z','0','S','X','.','*') then do;
&qvar._g = 'G7'; &qvar._f = "G7: Q U N Z 0 S X . *";
end;
else do;
&qvar._g = 'G8'; &qvar._f = "G8: wrong";
end;
%mend QCBWSBin;
* Calculate IV for binned variables;
%macro IVcal_qcbchar(dsn=, tgt=, qvar=, keyv=);
data &dsn.;
set &dsn.;
TargetBinary = &tgt.;
good = &tgt.;
bad = 1-&tgt.;
run;
proc sort data = &dsn.; by &keyv.; run;
proc means data = &dsn. missing noprint;
class &keyv.;
var good bad;
output out = &dsn._mean sum(good)=goodct sum(bad)=badct;
run;
proc sql noprint;
select goodct, badct into :_totgood, :_totbad
from &dsn._mean
where _type_ = 0;
quit;
%put _totgood = &_totgood. and _totbad = &_totbad.;
data &dsn._mean0 (drop=_type_ rename=(&keyv. = vgroup _freq_=volume));
/*retain IV_cum 0;*/
retain varname &keyv. _freq_ pvolume goodct badct pgood pbad goodrate badrate IV WOE logodds tgt_rate;
set &dsn._mean ;
format pvolume goodrate badrate pgood pbad percent10.2;
format logodds WOE IV 8.3;
format tgt_rate percent10.2;
if _type_=1;
varname = "&qvar.";
pvolume = _freq_/(&_totgood. + &_totbad.);
goodrate = goodct/(goodct+badct);
badrate = badct/(goodct+badct);
if goodrate ne 0 and badrate ne 0 then logodds = log(goodrate/badrate);
else logodds = .;
pgood = goodct/&_totgood.;
pbad = badct/&_totbad.;
WOE = 0;
if (pbad > 0 and pgood > 0) then WOE = log(pgood/pbad);
IV = (pgood-pbad)*woe;
Tgt_Rate = goodrate;
/*IV_cum = IV_cum + IV;*/
run;
proc sql noprint;
select sum(IV), count(*) into :&qvar._IV_tot, :&qvar._numgrp
from &dsn._mean0
quit;
data &dsn._IV;
varname = "&qvar.";
IV = &&&qvar._IV_tot.;
Num_Group = &&&qvar._numgrp.;
run;
%if %sysfunc(exist(&dsn._IV)) %then %do;
data IV;
set IV &dsn._IV;
run;
%end;
%if %sysfunc(exist(&dsn._mean0)) %then %do;
data vargroup;
set vargroup &dsn._mean0;
format vgroup $40.;
run;
%end;
/*Delete temperary data*/
proc datasets lib=work nolist;
delete &dsn. &dsn._mean &dsn._mean0 &dsn._IV;
run;
quit;
%mend IVcal_qcbchar;
%macro QCBCharWSIV(dsn, tgt, qvar, qvarb);
data &qvarb.;
set &dsn. (keep=orangeid dial_month &tgt. &qvar.);
%QCBWSBin(qvar = &qvar.); /*Call Macro*/
run;
%IVcal_qcbchar(dsn=&qvarb., tgt=&tgt., qvar=&qvar., keyv=&qvar._f); /*Call Macro*/
%mend QCBCharWSIV;
/*%QCBCharWSIV(datainv.CA_QCB_orange_n5_s1, tgt=Tgt_sumpay_N60D_flag, qvar=CBT0316, qvarb=CBT0316);*/
/*%QCBCharWSIV(datainv.CA_QCB_orange_n5_s1, tgt=Tgt_sumpay_N60D_flag, qvar=CBT0456, qvarb=CBT0456);*/
***** Macros to calculate IV for QCB char Not Worst Status Variables *****;
* IV calculation for QCB char variables (not worst status);
%macro QCBCharNotWSIV(dsn, tgt, qvar, qvarb);
data &qvarb.;
set &dsn. (keep=LegacyID &tgt. &qvar.);
length &qvar._f $40;
if missing(&qvar.) then &qvar._f = 'Missing';
else &qvar._f = &qvar.;
run;
%IVcal_qcbchar(dsn=&qvarb., tgt=&tgt., qvar=&qvar., keyv=&qvar._f); /*Call Macro*/
%mend QCBCharNotWSIV;
/*%QCBCharNotWSIV(datainv.CA_QCB_orange_n5_s1, tgt=Tgt_sumpay_N60D_flag, qvar=CBT0324, qvarb=CBT0324);*/
* Macro to Run Batch to calculate IV;
%macro IVbatchChar(datadsn, listdsn, tgt, ivmacro);
proc sql noprint;
select count(*) into :nobs
from &listdsn.;
quit;
%put <<&listdsn.: nobs=&nobs.>>;
data _null_;
set &listdsn.;
call symput(varid, varname);
run;
%put <<&listdsn.: qcbv_1=&qcbv_1. & qcbv_2=&qcbv_2.>>;
%let i = 1;
%do %while (&i.<=&nobs.);
/*%do %while (&i.<=4);*/
%put <<<<date=%sysfunc(date(), date9.), time=%sysfunc(time(), time.)>>>>;
%put <<<<i = &i., qvar=&&qcbv_&i.>>>>;
%&ivmacro.(dsn=&datadsn., tgt=&tgt., qvar=&&qcbv_&i., qvarb=&&qcbv_&i.);
%let i = %eval(&i.+1);
%end;
%mend IVbatchChar;