%MACRO bootstrap_632 (table, nbBoucles=100, Log=non) ; %IF &log = non %THEN %DO ; OPTION NOMPRINT NOMLOGIC NOSYMBOLGEN NONOTES ; %END ; DATA work._travail ; SET &table NOBS = nb ; _index_ = _N_ ; CALL SYMPUT ("nb",nb) ; RUN ; /* computing apparent error rate */ %classif (table = &table, test = &table) ; DATA _NULL_ ; SET work._erreurs ; CALL SYMPUT ("appErr", test) ; RUN ; %DO i = 1 %TO &nbBoucles ; PROC SURVEYSELECT DATA = work._travail OUT = work._samp METHOD = URS SAMPRATE = 1 SEED = &i NOPRINT ; RUN ; /* defining which observations are not in sample */ %complete (total = work._travail, excerpt1 = work._samp, out = work._comp) ; %classif_632 (table = work._samp, test = work._comp, testOut = work._compT) ; DATA work._histo ; SET %IF &i > 1 %THEN %DO ; work._histo %END ; work._compT (IN = new) ; IF new THEN boucle = &i ; RUN ; %END ; /* computing bootstrap error rate, bootstrap optimism and bootstrap estimate for error rate */ DM "ODSRESULTS CLEAR ; PGM OFF ;" WPGM ; PROC SQL ; CREATE TABLE work._temp1 AS SELECT _index_, AVG(misclassified) AS rate FROM work._histo GROUP BY _index_ ; SELECT SUM(rate)/&nb AS e0, .368*&appErr + .632*CALCULATED e0 LABEL = ".632 estimate for error rate", &nbBoucles LABEL = "Number of loops" FROM work._temp1 ; DROP TABLE work._temp1 ; DROP TABLE work._temp2 ; DROP TABLE work._erreurs ; DROP TABLE work._samp ; DROP TABLE work._comp ; DROP TABLE work._compT ; QUIT ; %IF &log = non %THEN %DO ; OPTION NOTES ; %END ; %MEND bootstrap_632 ;