[url=]Abstract[/url]An algorithm written in SAS/IML is presented that can perform an exact permutation test for a two-sample comparison. All possible permutations are considered. The Baumgartner-Wei?Schindler statistic is exemplarily used as the test statistic for the permutation test.
[url=]Program[/url]The following SAS macro includes the exact permutation test:
%MACRO Permtest(indata);
proc iml;
/* Reading the data */
USE &indata;
READ ALL INTO currdata;
/* Computation of ranks */
ranks=RANKTIE(currdata[ ,2]);
/* Calculation of the sample sizes per group */
N_total=Nrow(currdata[ ,2]);
n2=currdata[+,1];
n1=N_total-n2;
print N_total n1 n2;
/* Creation of all possible permutations */
start perm(n,n_1);
matrix = shape(0,(gamma(n+1)/(gamma(n_1+1)*gamma(n-n_1+1))),n);
index = 1;
vektor=shape(-1,1,n);
pos = 1;
ok = 1;
do while(ok=1);
if pos > n then do;
if vektor[,+] = n_1 then do;
matrix[index,]= vektor;
index = index + 1;
end;
pos = pos-1;
end;
else do;
if vektor[,pos] < 1 then do;
vektor[,pos] = vektor[,pos]+1;
pos = pos+1;
end;
else do;
vektor[,pos]=-1;
pos = pos-1;
end;
end;
if pos < 1 then ok = 0;
end;
return (matrix);
finish;
permutations = perm(N_total,n1);
P=Nrow(permutations);
/* Calculation of test statistic */
start test_sta(R1, R2, N_total, n1, n2);
b=R1;
R1[,rank(R1)]=b;
b=R2;
R2[,rank(R2)]=b;
i=1:n1;
j=1:n2;
Bx=sum( (R1-(N_total/n1)#i)##2/( (i/(n1+1))#(1-(i/(n1+1)))#n2 ) );
By=sum( (R2-(N_total/n2)#j)##2/( (j/(n2+1))#(1-(j/(n2+1)))#n1 ) );
B=Bx+By;
return (B);
finish;
/* Carrying out the test */
Tab=REPEAT(T(ranks),P,1);
R1=choose(permutations=0,.,Tab);
R2=choose(permutations=1,.,Tab);
R1g=R1[loc(R1^=.)];
R2g=R2[loc(R2^=.)];
R1z=shape(R1g,P, n1);
R2z=shape(R2g,P, n2);
test_st0=
test_sta(T(ranks[1:n1]),T(ranks[(n1+1):N_total]), N_total, n1, n2);
Pval=0;
do i=1 to P by 1;
B = test_sta(R1z[ i , ], R2z[ i , ], N_total, n1, n2);
if B >= test_st0 then Pval=Pval+1;
end;
Pval=Pval/P;
/* Definition of output */
x=(Pval || test_st0 || P);
cols={P_value test_statistic total_Perms};
print x[colname=cols];
/* optional: Creation of an output dataset called results */
CREATE results FROM x[colname=cols];
APPEND FROM x;
CLOSE results;
/**********************************************************/
quit;
%MEND Permtest;
In order to use this macro the SAS dataset needs the variables GROUP and VALUE (in this order). The variable GROUP should have the values 0 and 1 as codes for the two groups. Thus, the data step is as follows:
DATA example1;
INPUT group value @@;
CARDS;
0 154 0 155 0 158 0 159 0 161 0 163 0 177 0 183 0 192 0 219
1 171 1 172 1 178 1 179 1 184 1 185 1 186 1 194 1 196 1 223
;
RUN;
Here we use a placebo-controlled trial as an example. The raw data in the data step given above are reaction times (in msec) and were presented by Sedlmeier and Renkewitz (
[14], p. 583]. The placebo group is coded as 0, the active group as 1. In this example there are no ties. However, our program also works in the presence of ties.
The macro can be invoked with the following statement:
%Permtest(example1);