楼主: jennyli1346
3410 2

[原创博文] SAS macro for exact two-sample permutation test [推广有奖]

  • 1关注
  • 1粉丝

已卖:539份资源

教授

13%

还不是VIP/贵宾

-

威望
0
论坛币
3701 个
通用积分
6.3229
学术水平
2 点
热心指数
4 点
信用等级
0 点
经验
46136 点
帖子
554
精华
0
在线时间
794 小时
注册时间
2009-11-30
最后登录
2025-9-16

楼主
jennyli1346 发表于 2010-1-4 04:28:11 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
[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);
二维码

扫码加我 拉你入群

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

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

关键词:Permutation Mutation Sample Macro exact comparison following presented includes possible

已有 1 人评分热心指数 收起 理由
crackman + 1 谢谢

总评分: 热心指数 + 1   查看全部评分

沙发
sigrid28 发表于 2010-4-28 01:57:37
That's awesome!!!!!!!

藤椅
crackman 发表于 2010-4-28 11:17:16
值得学习一下

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-25 08:12