全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学
5721 10
2010-01-20
到处找了一下 好像sas中permutation test的实现方法有3种说法
1 是有人提到用proc multtest permutation...来做  这个我觉得是不对的
2 是曾邦伟提到的方法  但是我算出来和作者的计算结果不一样。文献和程序见附件“方法2”和“文献”
3 是某高手提出的方法  见附件“方法3”
但是好像后两者提出的方法计算结果完全不一样。
以以下的数据为例  麻烦大家看一下  究竟哪一种算法是对的啊?
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;
烦请高手劳驾帮我看看啊  谢谢先
附件列表

方法2.txt

大小:1.96 KB

 马上下载

文献.pdf

大小:225.44 KB

 马上下载

方法3.txt

大小:2.25 KB

 马上下载

二维码

扫码加我 拉你入群

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

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

全部回复
2010-1-20 14:25:55
方法2 的程序:
%macro permute(data_name=,class_name=,var_name=,num=);
option nonotes;
proc means data=&data_name noprint;/*计算原始样本两组的均值*/
        class &class_name;
        var &var_name;
        output out=out1 n=n mean=m;
        run;
data _null_;/*计算原始样本统计量*/
        set out1(where=(_type_^=0));
        mean_d=abs(dif(m));
        if _n_=1 then call symput("grp1_n",compress(n));
        if _n_=2 then do;
        call symput("grp2_n",compress(n));
        call symput("mean_d_obs",compress(mean_d));
        end;
        run;
%let total_n=%eval(&grp1_n+&grp2_n);/*计算总样本含量*/
data _null_;/*计算所有可能的排列组合数*/
        call symput("pm_n",compress(gamma(&total_n+1)/(gamma(&grp1_n+1)*gamma(&grp2_n+1))));
        run;
%if &num=%then %let num=&pm_n;/*默认的模拟次数为所有可能的排列组合数*/
%if %eval(&pm_n<&num) %then %let num=&pm_n;
proc plan;/*产生随机排列数*/
        factors random=&pm_n id=&grp1_n of &total_n comb/noprint;
        output out=regrp1;
        run;
        quit;
proc sort data=regrp1 out=regrp2;
        by random id;
        run;
data temp1;
        set &data_name;
        id=_n_;
        run;
%let n=0;
%do i=1 %to &num;
        %pm_mean(rd=&i);
%end;
proc datasets nolist;
        delete mean_t merge_t out1 regrp1 regrp2 t temp1 temp2;
        quit;
data _null_;
        p=&n/&num;
        format p 10.4;
        put "排列组合数为&pm_n";
        put "模拟次数为&num";
        put "模拟数据的统计量大于原始样本统计量的次数为" n;
        put "概率为" p;
        run;
option notes;
%mend permute;
/*第二部分:被主程序调用的宏,用于对样本进行随机分组,并计算统计量*/
%macro pm_mean(rd);
data merge_t;
        merge temp1 regrp2(in=grp1 where=(random=&rd));
        by id;
        if grp1 then grp_new=1;
        else grp_new=2;
        run;
proc means data=merge_t noprint;/*计算随机分组样本两组的均值*/
        var &var_name;
        class grp_new;
        output out=mean_t mean=m;
        run;
data temp2;/*计算随机分组样本的统计量*/
        set mean_t(where=(_type_^=0));
        mean_d=abs(dif(m));
        if _n_=2 and mean_d>=&mean_d_obs then call symput("n",%eval(&n+1));
        run;
proc datasets nolist;
        delete mean_&rd merge_&rd;
        quit;
%mend pm_mean;
%permute(data_name=xls,class_name=grp,var_name=x)
二维码

扫码加我 拉你入群

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

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

2010-1-20 14:26:24
方法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);
二维码

扫码加我 拉你入群

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

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

2010-1-20 14:27:59
我不太懂sas程序的啊 请高手帮帮忙
二维码

扫码加我 拉你入群

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

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

2010-1-22 15:12:32
继续求助 恳请帮忙啊 谢谢
二维码

扫码加我 拉你入群

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

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

2010-1-25 10:12:57
恳请帮助 谢谢
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

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