*--------------------------------------------------------------*; * Two Stage Model; *; * Class target: BAD; * Value target: DEBTINC; *; *--------------------------------------------------------------*; * TARGET=BAD : Tree Model; *--------------------------------------------------------------*; ****************************************************************; ****** DECISION TREE SCORING CODE ******; ****************************************************************; ****** LENGTHS OF NEW CHARACTER VARIABLES ******; LENGTH I_BAD $ 12; LENGTH _WARN_ $ 4; ****** LABELS FOR NEW VARIABLES ******; LABEL _NODE_ = 'Node' ; LABEL _LEAF_ = 'Leaf' ; LABEL P_BAD1 = 'Predicted: BAD=1' ; LABEL P_BAD0 = 'Predicted: BAD=0' ; LABEL I_BAD = 'Into: BAD' ; LABEL U_BAD = 'Unnormalized Into: BAD' ; LABEL _WARN_ = 'Warnings' ; ****** TEMPORARY VARIABLES FOR FORMATTED VALUES ******; LENGTH _ARBFMT_2 $ 12; DROP _ARBFMT_2; _ARBFMT_2 = ' '; /* Initialize to avoid warning. */ LENGTH _ARBFMT_5 $ 17; DROP _ARBFMT_5; _ARBFMT_5 = ' '; /* Initialize to avoid warning. */ ****** ASSIGN OBSERVATION TO NODE ******; DROP _BRANCH_; _BRANCH_ = -1; IF NOT MISSING(INDELINQ ) AND INDELINQ < 0.5 THEN DO; _BRANCH_ = 1; END; ELSE IF NOT MISSING(INDELINQ ) AND 0.5 <= INDELINQ THEN DO; _BRANCH_ = 2; END; IF _BRANCH_ LT 0 AND NOT MISSING(MORTDUE ) THEN DO; IF NOT MISSING(MORTDUE ) AND MORTDUE < 210156 THEN DO; _BRANCH_ = 1; END; ELSE IF NOT MISSING(MORTDUE ) AND 210156 <= MORTDUE THEN DO; _BRANCH_ = 2; END; END; IF _BRANCH_ LT 0 AND NOT MISSING(VALUE ) THEN DO; IF NOT MISSING(VALUE ) AND 18866 <= VALUE THEN DO; _BRANCH_ = 1; END; ELSE IF NOT MISSING(VALUE ) AND VALUE < 18866 THEN DO; _BRANCH_ = 2; END; END; IF _BRANCH_ LT 0 THEN _BRANCH_ = 1; IF _BRANCH_ EQ 2 THEN DO; _BRANCH_ = -1; _ARBFMT_5 = PUT( NINQ_XA9 , NINQ_PP_17.); %DMNORMIP( _ARBFMT_5); IF _ARBFMT_5 IN ('0001:LOW-0.5' ,'0002:0.5-1.5' ) THEN DO; _BRANCH_ = 1; END; ELSE IF _ARBFMT_5 IN ('0003:1.5-HIGH' ) THEN DO; _BRANCH_ = 2; END; IF _BRANCH_ LT 0 AND NOT MISSING(MORTDUE ) THEN DO; IF NOT MISSING(MORTDUE ) AND MORTDUE < 138422.5 THEN DO; _BRANCH_ = 1; END; ELSE IF NOT MISSING(MORTDUE ) AND 138422.5 <= MORTDUE THEN DO; _BRANCH_ = 2; END; END; IF _BRANCH_ LT 0 AND NOT MISSING(CLNO ) THEN DO; IF NOT MISSING(CLNO ) AND CLNO < 41.5 THEN DO; _BRANCH_ = 1; END; ELSE IF NOT MISSING(CLNO ) AND 41.5 <= CLNO THEN DO; _BRANCH_ = 2; END; END; IF _BRANCH_ LT 0 THEN _BRANCH_ = 1; IF _BRANCH_ EQ 2 THEN DO; _BRANCH_ = -1; IF NOT MISSING(MORTDUE ) AND MORTDUE < 48385.5 THEN DO; _BRANCH_ = 1; END; ELSE IF NOT MISSING(MORTDUE ) AND 48385.5 <= MORTDUE THEN DO; _BRANCH_ = 2; END; IF _BRANCH_ LT 0 AND NOT MISSING(VALUE ) THEN DO; IF NOT MISSING(VALUE ) AND VALUE < 25975 THEN DO; _BRANCH_ = 1; END; ELSE IF NOT MISSING(VALUE ) AND 25975 <= VALUE THEN DO; _BRANCH_ = 2; END; END; IF _BRANCH_ LT 0 AND NOT MISSING(LOAN ) THEN DO; IF NOT MISSING(LOAN ) AND LOAN < 4050 THEN DO; _BRANCH_ = 1; END; ELSE IF NOT MISSING(LOAN ) AND 4050 <= LOAN THEN DO; _BRANCH_ = 2; END; END; IF _BRANCH_ LT 0 THEN _BRANCH_ = 2; IF _BRANCH_ EQ 1 THEN DO; _NODE_ = 14; _LEAF_ = 11; P_BAD1 = 0.75675675675675; P_BAD0 = 0.24324324324324; I_BAD = '1' ; U_BAD = 1; END; ELSE DO; _BRANCH_ = -1; IF NOT MISSING(VALUE ) AND VALUE < 184712 THEN DO; _BRANCH_ = 1; END; ELSE IF NOT MISSING(VALUE ) AND 184712 <= VALUE THEN DO; _BRANCH_ = 2; END; IF _BRANCH_ LT 0 AND NOT MISSING(LOAN ) THEN DO; IF NOT MISSING(LOAN ) AND LOAN < 68600 THEN DO; _BRANCH_ = 1; END; ELSE IF NOT MISSING(LOAN ) AND 68600 <= LOAN THEN DO; _BRANCH_ = 2; END; END; IF _BRANCH_ LT 0 THEN _BRANCH_ = 1; IF _BRANCH_ EQ 2 THEN DO; _NODE_ = 23; _LEAF_ = 13; P_BAD1 = 0.8235294117647; P_BAD0 = 0.17647058823529; I_BAD = '1' ; U_BAD = 1; END; ELSE DO; _NODE_ = 22; _LEAF_ = 12; P_BAD1 = 0.4; P_BAD0 = 0.6; I_BAD = '0' ; U_BAD = 0; END; END; END; ELSE DO; IF NOT MISSING(LOAN ) AND LOAN < 5100 THEN DO; _BRANCH_ = -1; IF NOT MISSING(VALUE ) AND VALUE < 91879.5 THEN DO; _BRANCH_ = 1; END; ELSE IF NOT MISSING(VALUE ) AND 91879.5 <= VALUE THEN DO; _BRANCH_ = 2; END; IF _BRANCH_ LT 0 AND NOT MISSING(MORTDUE ) THEN DO; IF NOT MISSING(MORTDUE ) AND MORTDUE < 82591 THEN DO; _BRANCH_ = 1; END; ELSE IF NOT MISSING(MORTDUE ) AND 82591 <= MORTDUE THEN DO; _BRANCH_ = 2; END; END; IF _BRANCH_ LT 0 AND NOT MISSING(LOAN ) THEN DO; IF NOT MISSING(LOAN ) AND 1650 <= LOAN THEN DO; _BRANCH_ = 1; END; ELSE IF NOT MISSING(LOAN ) AND LOAN < 1650 THEN DO; _BRANCH_ = 2; END; END; IF _BRANCH_ LT 0 THEN _BRANCH_ = 1; IF _BRANCH_ EQ 2 THEN DO; _NODE_ = 21; _LEAF_ = 9; P_BAD1 = 1; P_BAD0 = 0; I_BAD = '1' ; U_BAD = 1; END; ELSE DO; _BRANCH_ = -1; IF NOT MISSING(CLNO ) AND CLNO < 18 THEN DO; _BRANCH_ = 1; END; ELSE IF NOT MISSING(CLNO ) AND 18 <= CLNO THEN DO; _BRANCH_ = 2; END; IF _BRANCH_ LT 0 AND NOT MISSING(LOAN ) THEN DO; IF NOT MISSING(LOAN ) AND LOAN < 2650 THEN DO; _BRANCH_ = 1; END; ELSE IF NOT MISSING(LOAN ) AND 2650 <= LOAN THEN DO; _BRANCH_ = 2; END; END; IF _BRANCH_ LT 0 AND NOT MISSING(MORTDUE ) THEN DO; IF NOT MISSING(MORTDUE ) AND MORTDUE < 53320.5 THEN DO; _BRANCH_ = 1; END; ELSE IF NOT MISSING(MORTDUE ) AND 53320.5 <= MORTDUE THEN DO; _BRANCH_ = 2; END; END; IF _BRANCH_ LT 0 THEN _BRANCH_ = 2; IF _BRANCH_ EQ 1 THEN DO; _NODE_ = 30; _LEAF_ = 7; P_BAD1 = 1; P_BAD0 = 0; I_BAD = '1' ; U_BAD = 1; END; ELSE DO; _NODE_ = 31; _LEAF_ = 8; P_BAD1 = 0.18181818181818; P_BAD0 = 0.81818181818181; I_BAD = '0' ; U_BAD = 0; END; END; END; ELSE DO; _NODE_ = 13; _LEAF_ = 10; P_BAD1 = 0.27403846153846; P_BAD0 = 0.72596153846153; I_BAD = '0' ; U_BAD = 0; END; END; END; ELSE DO; _BRANCH_ = -1; IF NOT MISSING(LOAN ) AND LOAN < 4150 THEN DO; _BRANCH_ = 1; END; ELSE IF NOT MISSING(LOAN ) AND 4150 <= LOAN THEN DO; _BRANCH_ = 2; END; IF _BRANCH_ LT 0 AND NOT MISSING(VALUE ) THEN DO; IF NOT MISSING(VALUE ) AND VALUE < 20562.5 THEN DO; _BRANCH_ = 1; END; ELSE IF NOT MISSING(VALUE ) AND 20562.5 <= VALUE THEN DO; _BRANCH_ = 2; END; END; IF _BRANCH_ LT 0 THEN _BRANCH_ = 2; IF _BRANCH_ EQ 1 THEN DO; _BRANCH_ = -1; IF NOT MISSING(VALUE ) AND VALUE < 74457.5 THEN DO; _BRANCH_ = 1; END; ELSE IF NOT MISSING(VALUE ) AND 74457.5 <= VALUE THEN DO; _BRANCH_ = 2; END; IF _BRANCH_ LT 0 AND NOT MISSING(MORTDUE ) THEN DO; IF NOT MISSING(MORTDUE ) AND MORTDUE < 74095.0494665215 THEN DO; _BRANCH_ = 1; END; ELSE IF NOT MISSING(MORTDUE ) AND 74095.0494665215 <= MORTDUE THEN DO; _BRANCH_ = 2; END; END; IF _BRANCH_ LT 0 AND NOT MISSING(NINQ_XA9 ) THEN DO; _ARBFMT_5 = PUT( NINQ_XA9 , NINQ_PP_17.); %DMNORMIP( _ARBFMT_5); IF _ARBFMT_5 IN ('0002:0.5-1.5' ,'0003:1.5-HIGH' ) THEN DO; _BRANCH_ = 1; END; ELSE IF _ARBFMT_5 IN ('0001:LOW-0.5' ) THEN DO; _BRANCH_ = 2; END; END; IF _BRANCH_ LT 0 THEN _BRANCH_ = 1; IF _BRANCH_ EQ 2 THEN DO; _NODE_ = 9; _LEAF_ = 2; P_BAD1 = 0.11111111111111; P_BAD0 = 0.88888888888888; I_BAD = '0' ; U_BAD = 0; END; ELSE DO; _NODE_ = 8; _LEAF_ = 1; P_BAD1 = 0.86363636363636; P_BAD0 = 0.13636363636363; I_BAD = '1' ; U_BAD = 1; END; END; ELSE DO; IF NOT MISSING(CLNO ) AND CLNO < 2.5 THEN DO; _BRANCH_ = -1; IF NOT MISSING(VALUE ) AND VALUE < 75083.5 THEN DO; _BRANCH_ = 1; END; ELSE IF NOT MISSING(VALUE ) AND 75083.5 <= VALUE THEN DO; _BRANCH_ = 2; END; IF _BRANCH_ LT 0 AND NOT MISSING(MORTDUE ) THEN DO; IF NOT MISSING(MORTDUE ) AND MORTDUE < 78543.5494665215 THEN DO; _BRANCH_ = 1; END; ELSE IF NOT MISSING(MORTDUE ) AND 78543.5494665215 <= MORTDUE THEN DO; _BRANCH_ = 2; END; END; IF _BRANCH_ LT 0 AND NOT MISSING(LOAN ) THEN DO; IF NOT MISSING(LOAN ) AND LOAN < 15450 THEN DO; _BRANCH_ = 1; END; ELSE IF NOT MISSING(LOAN ) AND 15450 <= LOAN THEN DO; _BRANCH_ = 2; END; END; IF _BRANCH_ LT 0 THEN _BRANCH_ = 1; IF _BRANCH_ EQ 2 THEN DO; _NODE_ = 17; _LEAF_ = 5; P_BAD1 = 1; P_BAD0 = 0; I_BAD = '1' ; U_BAD = 1; END; ELSE DO; _BRANCH_ = -1; IF NOT MISSING(CLNO ) AND CLNO < 0.5 THEN DO; _BRANCH_ = 1; END; ELSE IF NOT MISSING(CLNO ) AND 0.5 <= CLNO THEN DO; _BRANCH_ = 2; END; IF _BRANCH_ LT 0 AND NOT MISSING(MORTDUE ) THEN DO; IF NOT MISSING(MORTDUE ) AND 6867 <= MORTDUE THEN DO; _BRANCH_ = 1; END; ELSE IF NOT MISSING(MORTDUE ) AND MORTDUE < 6867 THEN DO; _BRANCH_ = 2; END; END; IF _BRANCH_ LT 0 AND NOT MISSING(VALUE ) THEN DO; IF NOT MISSING(VALUE ) AND 43258 <= VALUE THEN DO; _BRANCH_ = 1; END; ELSE IF NOT MISSING(VALUE ) AND VALUE < 43258 THEN DO; _BRANCH_ = 2; END; END; IF _BRANCH_ LT 0 THEN _BRANCH_ = 1; IF _BRANCH_ EQ 2 THEN DO; _NODE_ = 25; _LEAF_ = 4; P_BAD1 = 1; P_BAD0 = 0; I_BAD = '1' ; U_BAD = 1; END; ELSE DO; _NODE_ = 24; _LEAF_ = 3; P_BAD1 = 0.11111111111111; P_BAD0 = 0.88888888888888; I_BAD = '0' ; U_BAD = 0; END; END; END; ELSE DO; _NODE_ = 11; _LEAF_ = 6; P_BAD1 = 0.11441307578008; P_BAD0 = 0.88558692421991; I_BAD = '0' ; U_BAD = 0; END; END; END; ****************************************************************; ****** END OF DECISION TREE SCORING CODE ******; ****************************************************************; *--------------------------------------------------------------*; * TARGET=DEBTINC : Regression Model; *--------------------------------------------------------------*; *************************************; *** begin scoring code for regression; *************************************; length _WARN_ $4; label _WARN_ = 'Warnings' ; drop _Y; _Y = DEBTINC ; drop _DM_BAD; _DM_BAD=0; *** Check LOAN for missing values ; if missing( LOAN ) then do; substr(_warn_,1,1) = 'M'; _DM_BAD = 1; end; *** Check MORTDUE for missing values ; if missing( MORTDUE ) then do; substr(_warn_,1,1) = 'M'; _DM_BAD = 1; end; *** Check VALUE for missing values ; if missing( VALUE ) then do; substr(_warn_,1,1) = 'M'; _DM_BAD = 1; end; *** Check CLNO for missing values ; if missing( CLNO ) then do; substr(_warn_,1,1) = 'M'; _DM_BAD = 1; end; *** Check INDELINQ for missing values ; if missing( INDELINQ ) then do; substr(_warn_,1,1) = 'M'; _DM_BAD = 1; end; *** Check P_BAD1 for missing values ; if missing( P_BAD1 ) then do; substr(_warn_,1,1) = 'M'; _DM_BAD = 1; end; *** Generate dummy variables for REASON ; drop _0_0 ; if missing( REASON ) then do; _0_0 = .; substr(_warn_,1,1) = 'M'; _DM_BAD = 1; end; else do; length _dm7 $ 7; drop _dm7 ; %DMNORMCP( REASON , _dm7 ) if _dm7 = 'DEBTCON' then do; _0_0 = 1; end; else if _dm7 = 'HOMEIMP' then do; _0_0 = -1; end; else do; _0_0 = .; substr(_warn_,2,1) = 'U'; _DM_BAD = 1; end; end; *** Generate dummy variables for JOB ; drop _1_0 ; if missing( JOB ) then do; _1_0 = .; substr(_warn_,1,1) = 'M'; _DM_BAD = 1; end; else do; length _dm7 $ 7; drop _dm7 ; %DMNORMCP( JOB , _dm7 ) if _dm7 = 'OTHER' then do; _1_0 = 1; end; else if _dm7 = 'PROFEXE' then do; _1_0 = -1; end; else do; _1_0 = .; substr(_warn_,2,1) = 'U'; _DM_BAD = 1; end; end; *** Generate dummy variables for NINQ_XA9 ; drop _2_0 _2_1 ; if missing( NINQ_XA9 ) then do; _2_0 = .; _2_1 = .; substr(_warn_,1,1) = 'M'; _DM_BAD = 1; end; else do; length _dm17 $ 17; drop _dm17 ; _dm17 = put( NINQ_XA9 , NINQ_PP_17. ); %DMNORMIP( _dm17 ) if _dm17 = '0001:LOW-0.5' then do; _2_0 = 1; _2_1 = 0; end; else if _dm17 = '0002:0.5-1.5' then do; _2_0 = 0; _2_1 = 1; end; else if _dm17 = '0003:1.5-HIGH' then do; _2_0 = -1; _2_1 = -1; end; else do; _2_0 = .; _2_1 = .; substr(_warn_,2,1) = 'U'; _DM_BAD = 1; end; end; *** If missing inputs, use averages; if _DM_BAD > 0 then do; _LP0 = 33.4731171764995; goto VX1DR1; end; *** Compute Linear Predictor; drop _TEMP; drop _LP0; _LP0 = 0; *** Effect: LOAN ; _TEMP = LOAN ; _LP0 = _LP0 + ( 0.00003969502913 * _TEMP); *** Effect: MORTDUE ; _TEMP = MORTDUE ; _LP0 = _LP0 + ( 0.0000123909236 * _TEMP); *** Effect: VALUE ; _TEMP = VALUE ; _LP0 = _LP0 + ( 2.991616805052E-6 * _TEMP); *** Effect: REASON ; _TEMP = 1; _LP0 = _LP0 + ( -0.16084046371068) * _TEMP * _0_0; *** Effect: JOB ; _TEMP = 1; _LP0 = _LP0 + ( 1.29288489761007) * _TEMP * _1_0; *** Effect: CLNO ; _TEMP = CLNO ; _LP0 = _LP0 + ( 0.12518228039632 * _TEMP); *** Effect: INDELINQ ; _TEMP = INDELINQ ; _LP0 = _LP0 + ( -0.19916135207979 * _TEMP); *** Effect: NINQ_XA9 ; _TEMP = 1; _LP0 = _LP0 + ( -1.2137210426341) * _TEMP * _2_0; _LP0 = _LP0 + ( -0.42580879207021) * _TEMP * _2_1; *** Effect: P_BAD1 ; _TEMP = P_BAD1 ; _LP0 = _LP0 + ( 0.9879474353126 * _TEMP); *--- Intercept ---*; _LP0 = _LP0 + ( 28.3101853652795); VX1DR1: *** Predicted Value, Error, and Residual; label P_DEBTINC = 'Predicted: DEBTINC' ; P_DEBTINC = _LP0; drop _R; if _Y = . then do; R_DEBTINC = .; end; else do; _R = _Y - _LP0; label R_DEBTINC = 'Residual: DEBTINC' ; R_DEBTINC = _R; end; *************************************; ***** end scoring code for regression; *************************************; *--------------------------------------------------------------*; * End of Value Model. Target= DEBTINC; *--------------------------------------------------------------*; * Create Expected value. Bias= None; *--------------------------------------------------------------*; label EV_DEBTINC='Expected Value: DEBTINC'; EV_DEBTINC= P_DEBTINC ; *--------------------------------------------------------------*; * Two Stage Model: DEBTINC: Decisions; *--------------------------------------------------------------*; **** NO DECISION CODE;