/* nov04.ex4 */ /* */ /* macro to do two sample permutation test */ /* */ /* */ options ls=80 symbolgen ; %macro permttest(dsname,response,groupvar,krep) ; /* ds = SAS ds name */ /* response = variable to be analyzed */ /* groupvar = distinguishes groups */ /* krep = number of replications */ /* two sample t-test */ proc ttest data=&dsname ; class &groupvar ; * distinguish groups ; var &response ; * what variable? ; ods output Statistics=permstat ; ods output TTests=permtt ; run ; /* */ /* get macro variables out of ods datasets */ data _null_ ; set permstat ; if( _n_ eq 1 ) then call symputx('m',N) ; if( _n_ eq 2 ) then call symputx('n',N) ; run ; data _null_ ; set permtt ; if( _n_ eq 1 ) then call symputx('tobserved',tValue) ; run ; /* */ /* permutation distribution is random assignment */ /* of individual to groups -- with same totals */ %let mpn = %eval(&m + &n) ; * total ; data aperm ; array pj(&krep) ; retain pj1-pj&krep &m _all_ ; * initial value ; keep permgroup k &response ; set &dsname ; seed = 5151917 ; do k = 1 to &krep ; if( ranuni(seed) lt pj(k)/(&mpn-_n_+1) ) then do ; permgroup = 1 ; pj(k) = pj(k) - 1 ; end ; else permgroup = 2 ; output ; * make obs ; end ; * of loop on k ; run ; /* now analyze each one */ /* */ /* first sort by replication counter */ proc sort data=aperm ; by k ; run ; /* */ /* now compute statistic */ ods listing close ; * stop printing ; proc ttest data=aperm ; class permgroup ; * two groups, 1 & 2 ; var &response ; * analyze response ; by k ; * replication ; ods output TTests=permtds ; run ; ods listing ; /* how simple? */ proc means data=permtds n ; where ( (tValue > &tobserved) and (Variances='Equal') ); title "how extreme of &krep" ; run ; /* done */ %mend permttest ; /* */ /* teacher salary data */ /* i subject index */ /* salary salary (in thousands $) */ /* exp experience (in years) */ /* gender gender (m or f) (character) */ /* */ data payequity ; infile 'salary.dat'; input i salary exp gender $ ; /* add some dummies */ fem = (gender = 'f') ; femexp = fem*exp ; run ; /* nov04.ex5 */ /* */ /* macro to do two sample permutation test */ /* */ %permttest(payequity,exp,gender,1000) ; %permttest(payequity,salary,gender,10000) ; /* */