方法3 的程序
%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;
DATA example1;
INPUT group value @@;
CARDS;
0 0.74 0 1.05 0 1.20 0 1.83 0 1.42 0 2.97 0 1.54 1 0.54 1 1.44 1 0.65 1 0.84 1 0.86 1 0.91 1 1.16
;
RUN;
proc ttest;
class group;
var value;
run;
%Permtest(example1);