%MACRO bootstrap_BCa (table, nbBoucles=100, alpha = 0.025, 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 ; /* "true" value computed on base sample */ %calcul (work._travail, outMV = vrai) ; /* acceleration constant computed by jackknife */ %JackknifeBCa (work._travail, nValue1, acc); %DO i = 1 %TO &nbBoucles ; PROC SURVEYSELECT DATA = work._travail OUT = work._samp METHOD = URS SAMPRATE = 1 SEED = &i NOPRINT ; RUN ; %calcul (work._samp, outTab = work._sampRes) ; %IF &i = 1 %THEN %DO ; DATA work._histo ; SET work._sampRes ; RUN ; %END ; %ELSE %DO ; PROC APPEND BASE = work._histo DATA = work._sampRes ; RUN ; %END ; %END ; /* computing bias correction */ PROC SQL NOPRINT ; SELECT PROBIT(COUNT(*)/&nbBoucles) INTO : z0 FROM work._histo WHERE nValue1 < &vrai ; QUIT ; /* computing endpoints a1 and a2 */ %LET za1 = %SYSFUNC(PROBIT(&alpha)) ; %LET za2 = %SYSFUNC(PROBIT(1-&alpha)) ; %LET a1 = %SYSFUNC( PROBNORM ( &z0 + (&z0 + &za1)/ (1 - &acc * (&z0 + &za1)) ) ) ; %LET a2 = %SYSFUNC( PROBNORM ( &z0 + (&z0 + &za2)/ (1 - &acc * (&z0 + &za2)) ) ) ; %LET a1 = %SYSFUNC (ROUND(&a1 * 100,.01)) ; %LET a2 = %SYSFUNC (ROUND(&a2 * 100,.01)) ; %LET nomA1 = %SYSFUNC (TRANSLATE(&a1,_,.)) ; %LET nomA2 = %SYSFUNC (TRANSLATE(&a2,_,.)) ; PROC UNIVARIATE DATA = work._histo NOPRINT ; VAR nValue1 ; OUTPUT OUT = work.CI (KEEP = P_&nomA1 P_&nomA2) PCTLPRE = P_ PCTLPTS = &a1 &a2 ; RUN ; TITLE1 "&nbBoucles bootstrap samples" ; TITLE2 "CI with %SYSEVALF(100 - &alpha*200) % confidence" ; TITLE3 "Valeur sur les données de base : &vrai" ; PROC PRINT DATA = work.CI LABEL ; LABEL P_&nomA1 = "Lower confidence limit" P_&nomA2 = "Upper confidence limit" ; RUN ; TITLE ; %MEND bootstrap_BCa ;