SAS上的非参数测试

时间:2014-12-09 21:07:24

标签: statistics sas

我有一个小的数据集,包括对三个变量中的每一个的三个不同的观察结果,比如x1 x2,x3和伴随的响应y,我想在其上执行方差分析以测试平均值是否相等。

data anova;
input var obs resp;
cards;
1 1 1.1
1 2 .5 
1 3 -2.1
2 1 4.2
2 2 3.7
2 3 .8
3 1 3.2
3 2 2.8
3 3 6.3
;

proc anova data=anova;
class var;
model resp=var;
run;

到目前为止一切顺利。然而,现在,我想使用置换测试来检查F统计量的p值。测试非常简单,它包括随机地将9个观测值重新分配给3个变量,以便每个变量有三个观测值,并且每次计算F统计量。然后,p值将是这些统计数据的比例高于4.39,即上述代码中的F检验值。

通常情况下,我会手工完成,但这里有1680种可能的组合(9!/(3!3!3!)),所以我需要一周时间。是否有更优雅的方式来实现这一目标?也许是一种在循环或函数中包装此过程的方法?

我将非常感谢你的帮助,谢谢你。

2 个答案:

答案 0 :(得分:2)

这样的重新采样可以通过几个步骤完成。首先,following an example from SAS help,使用PROC SQL创建一个包含var和resp的所有可能组合的表。

PROC SQL;
 CREATE TABLE possibilities AS SELECT a.var, b.resp FROM
  anova a CROSS JOIN anova b;
QUIT;

然后,使用PROC SURVEYSELECT从var和resp的所有可能组合重新采样。

PROC SURVEYSELECT
 DATA = possibilities
 OUT = permutations
 METHOD = URS  /* URS means unrestricted sampling, or sampling uniformly with
                  replacement */
 SAMPSIZE = 9  /* Generate samples that are the same size as your original 
                  data */
 REP = 1000;   /* Repeat 1000 times */
 STRATA var / ALLOC = PROP;  /* Make sure that we sample evenly from each of the
                                3 values of var */
RUN;

然后,使用带有BY语句的PROC GLM,计算每个复制的F统计量。

/* Data must be sorted to use a BY statement */
PROC SORT
 DATA = permutations;
 BY replicate;
RUN;
PROC GLM
 DATA = permutations
 NOPRINT
 OUTSTAT = f_statistics;
 CLASS var;
 MODEL resp = var;
 BY replicate;
 WEIGHT numberhits;
QUIT;

最后,在数据步骤中,创建一个虚拟变量,指示每个F统计量是否大于4.39,来自示例的测试统计量,然后使用MEANS过程获得真实的次数。最终答案应该约为0.068,如原始示例所示。

DATA final;
 SET f_statistics;
 IF f ne .;  /* Drop rows of the GLM output that don't contain an F statistic */
 reject_null = (f > 4.39);
RUN;

PROC MEANS
 DATA = final
 MEAN;
 VAR reject_null;
RUN;

答案 1 :(得分:1)

这是我的方法。它使用SAS的allperm例程来填充所有排列。然后为了消除重复,我使用组中数字的乘积作为关键字。结果是1680年。

在此之后,您可以使用by关键字proc glm根据最终数据集中的组指标group运行。

proc transpose data=anova(keep=resp) out=anova1;
run;
quit;

data anova1;
    set anova1;
    n = fact(9);
    array rs (*) col1-col9;
    do i=1 to n;
        call allperm(i, of rs(*));
        a = rs(1)*rs(2)*rs(3);
        b = rs(4)*rs(5)*rs(6);
        c = rs(7)*rs(8)*rs(9);
        file resperms notitles;
        put rs(*) a b c;
    end;
run;

data perms;
    infile resperms;
    input x1-x3 y1-y3 z1-z3 a b c;
run;

proc sort data=perms nodupkey;
    by a b c;
run;

data perms;
    set perms;
    group = _N_;
    drop a b c;
run;

proc transpose data=perms out=perms;
    by group;
run;
quit;

data perms;
    set perms;
    var = substr(_NAME_,1,1);
    obs = substr(_NAME_,2,1)*1;
    rename col1=resp;
    drop _NAME_;
run;