科研统计助手
医学科研资讯
前沿热点动态
统计分析服务
当前位置: 菁英统计工作室 > 统计知识 > 理论知识 > 新方法应用 > 正文
Permutation test
作者:tjstat  更新时间:2010-08-17 本条信息浏览人次共有

     在生物医学研究中,我们经常会遇到一些样本含量小的数据,往往不满足经典的参数检验条件,若直接应用参数检验方法。其检验效能较低。而若采用非参检验方法(如秩和检验),此时原始的数据被转换成秩次,这就损失了一部分原始信息,相对而言,其检验效能依然有所下降。在这种情况下。可以考虑应用Per—mutation tests来进行统计推断。

原理与方法
    Permutation tests是一种基于大量计算的统计推断方法。早在20世纪30年代,Fisher就已经公布了Permutation tests方法。但是由于其运算量大。而未得到足够的重视和应用。而随着现代计算机性能的不断提高,该方法完全可以利用计算机的出色运算能力来
实现,其应用前景也越来越广阔。由于Permutation tests并不依赖于总体分布。而是基于样本本身,因此相对于其他经典的参数检验方法有其特定的优势。有研究表明,当样本含量较大时。Permutation tests得到的结果与经典的参数检验(如t检验,F检验)近似。然而大部分的生物医学研究是基于随机分组而不是随机抽样,并且一般样本含量都比较小,此时比较组间差异。Permutation tests要优于t检验和F检验。并且其敏感性也高于秩和检验。实际上,Perm utation tests应用范围远不止如此,还包括配对设计资料、分类资料、相关分析、生存分析、ROC曲线比较、meta分析等等。

 

实现的SAS程序:
%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)
本文来自: 人大经济论坛 SAS专版 版.

上一篇:[新方法应用]
下一篇:BP神经生物网络

本站所发表的文章,大部分严格筛选,来源于各相关专业论坛或专业网站,内容仅供大家学习和参阅尊重原作者版权,勿用于商业用途,转载请注明来源。如有学术争议的文章,或可能与事实不符的,与本站立场无关。如有影响到您权益的文章,请及时通知本站,本站立即删除。谢谢监督。
推荐阅读
 
热门文章

Copyright 2010 Powered By 菁英统计工作室 www.tjstat.com 地址1:武汉市珞瑜路1037号 430074 ; 地址2:武汉市航空路13号 430030
邮箱:tjstat@126.com QQ: 点击这里给我发消息 点击这里给我发消息
鄂ICP备10020011号 |