options mprint ; %macro perm1(data,var,sampsizeg1,t1obs,iter,print='n') ; %local p1 rkp1 u1 iter ru1 p2 ynew rkdist permsum pcalc rejregion ; data p1 ; set &data ; do iter = 1 to &iter ; u1 = ranuni(0) ; output ; end ; %if &print = 'y' %then %do ; proc print ; %end ; proc sort data = p1 ; by iter ; proc rank data = p1 out = rkp1 ; var u1 ; ranks ru1 ; by iter ; %if &print = 'y' %then %do ; proc print ; %end ; data p2 ; set rkp1 ; ynew = &var*(ru1 le &sampsizeg1) ; %if &print = 'y' %then %do ; proc print ; %end ; proc means data = p2 noprint ; var ynew ; output out = rkdist sum = permsum ; by iter ; %if &print = 'y' %then %do ; proc print ; %end ; proc univariate data= rkdist noprint; histogram permsum / cfill = blue cframe = ligr; data pcalc ; set rkdist ; rejregion = (permsum ge &t1obs) ; proc means data = pcalc mean noprint ; var rejregion ; output out = errcalc mean = mrejregion ; data errcalc ; set errcalc ; esterr = 2*sqrt( mrejregion*(1 -mrejregion)/&iter ) ; file print notitles ; if _n_ = 1 then put ///// @15 'Permutation distribution results' // ; put @10 'approximate permutation p value = ' @47 mrejregion / @10 'with estimated error of +/- ' @45 esterr 7.4 ; run ; %mend perm1 ; data example3 ; input group y @@ ; cards ; 1 59.1 1 60.3 1 58.1 1 61.3 1 65.1 1 65.0 1 63.4 1 67.8 2 60.1 2 52.1 2 59.3 2 55.0 2 54.6 2 54.4 2 58.7 2 62.5 ; proc rank data = example3 out = rankex3 ; var y ; ranks rky ; run ; proc sort data = rankex3 ; by group ; proc print ; run ; %perm1(rankex3,rky,8,91,2000,print='n') ; proc npar1way data = example3 wilcoxon ; class group ; var y ; exact wilcoxon / n = 2000 ; run ; * data with ties ; data example5 ; input group y @@ ; cards ; 1 59.1 1 61.0 1 58.1 1 61.0 1 65.1 1 65.0 1 63.4 1 67.8 2 60.1 2 52.1 2 59.1 2 55.0 2 54.6 2 54.4 2 59.1 2 62.5 ; proc rank data = example5 out = rankex5 ; var y ; ranks rky ; run ; proc sort data = rankex5 ; by group ; proc print ; run ; %perm1(rankex5,rky,8,91,2000,print='n') ; proc npar1way data = example5 wilcoxon ; class group ; var y ; exact wilcoxon / n = 2000 ; run ;