全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
3386 2
2010-01-04
[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);
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2010-4-28 01:57:37
That's awesome!!!!!!!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-4-28 11:17:16
值得学习一下
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群