%MACRO diagnostics (tables, varScore, varTarget, nbCoeffs=, out=, event=1) ; /* version 2015.11 */ /* Paramètre NBCOEFF : s'il est renseigné, on peut calculer un critère d'Akaike et un critère de Schwarz */ %LOCAL __var ; ODS NORESULTS ; ODS EXCLUDE ALL ; DATA work._scores (KEEP = _event _data _labData _score _score2) ; SET &tables INDSNAME=source ; LENGTH _data $ 3 source source_prec $ 41 ; RETAIN source_prec ; IF _N_=1 THEN DO ; num_data = 1 ; source_prec = " " ; END ; ELSE IF source NE source_prec THEN num_data + 1 ; _event = (&varTarget = &event) ; _score = &varScore ; _score2 = ROUND(&varScore, 0.002) ; _data = CATS("T",PUT(num_data,Z2.)) ; _labData = CATT("#", num_data, " "!!source) ; source_prec = source ; IF MISSING(&varTarget) OR MISSING(&varScore) THEN DELETE ; RUN ; PROC NPAR1WAY DATA=work._scores EDF ; VAR _score ; CLASS _event ; BY _data ; ODS OUTPUT %IF &sysver <= 9.3 %THEN kolSmir2stats ; %ELSE KS2Stats ; = work._ks (WHERE=(Name1 = "_KS_")) ; RUN ; PROC SQL ; %LET __var = f m2_ll misscl brier ; CREATE TABLE work._ll AS SELECT _data, _labData, COUNT(_event) AS f LABEL="Effectif", -2*SUM(LOG(CASE WHEN _event=1 THEN _score WHEN _event=0 THEN 1-_score ELSE . END)) AS m2_ll LABEL="-2 log L", MEAN((_score > 0.5) NE _event) AS misscl LABEL="% mal classés (seuil=0,5)" FORMAT=NLPCT8.2, SUM(_event*(1-_score)**2+(1-_event)*(_score)**2)/COUNT(_event) AS brier LABEL="Score de Brier" %IF &nbCoeffs NE %THEN %DO ; , CALCULATED m2_ll + 2*&nbCoeffs AS aic LABEL="AIC (Akaike)" , CALCULATED m2_ll + &nbCoeffs * LOG(COUNT(_event)) AS sc LABEL="SC (Schwarz)" %LET __var = &__var aic sc ; %END ; FROM work._scores GROUP BY _data, _labData ; CREATE TABLE work._stats AS SELECT _data, _labData, _score2, SUM(_event) AS _1, N(_event) - CALCULATED _1 AS _0 FROM work._scores GROUP BY _data, _labData, _score2 ; DROP TABLE work._scores ; QUIT ; DATA work._paires (KEEP=_data _labData paires nc nt nd c somers gamma tau_a) ; SET work._stats ; BY _data ; RETAIN tot1 tot0 nc nt ; IF FIRST._data THEN DO ; tot1=0 ; tot0=0 ; nc=0 ; nt=0 ; END ; nt = nt + _0 * _1 ; nc = nc + _1 * tot0 ; tot1 = tot1 + _1 ; tot0 = tot0 + _0 ; IF LAST._data THEN DO ; n = tot1 + tot0 ; paires = tot1*tot0 ; nd = paires - nc - nt ; c = (nc+0.5*nt)/paires ; somers = (nc-nd)/paires ; gamma = (nc-nd)/(nc+nd) ; tau_a = (nc-nd)/(0.5*n*(n-1)) ; nd = nd / paires ; nc = nc / paires ; nt = nt / paires ; OUTPUT ; END ; FORMAT nd nc nt PERCENT12.1 paires NLNUM20. somers gamma tau_a c 5.3 ; RUN ; DATA work._stats (KEEP = _data _labData &__var c somers gamma tau_a ks) ; MERGE work._ll work._paires work._ks (KEEP=_data nValue2 RENAME=(nValue2 = ks)) ; BY _data ; LABEL _labData = "Table SAS" c = "AUC (c de Pregibon)" somers = "Gini (D de Somers)" gamma = "Gamma" tau_a = "Tau-alpha" ks = "Kolmogorov Smirnov" ; FORMAT ks 6.3 ; RUN ; ODS SELECT ALL ; ODS RESULTS ; PROC PRINT DATA = work._stats (DROP=_data) LABEL NOOBS ; RUN ; %IF &out= %THEN %DO ; DATA &out ; SET work._stats ; RUN ; %END ; PROC SQL ; DROP TABLE work._ll ; DROP TABLE work._paires ; DROP TABLE work._stats ; DROP TABLE work._ks ; QUIT ; %MEND diagnostics ;