Statistics SAS的非参数检验

Statistics SAS的非参数检验,statistics,sas,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; 到目前为止一切都很好。现

我有一个小数据集,由三个变量中每一个的三个不同观察值组成,比如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个变量,使每个变量有3个观察值,并每次计算F统计量。然后,p值将是高于4.39的统计数据的比例,即上述代码中的F检验值

通常我会手工做,但这里有1680种可能的组合(9!/(3!3!)),所以我需要一周的时间。有没有更优雅的方法来实现这一点?也许有一种方法可以将这个过程包装成循环或函数


非常感谢您的帮助,谢谢。

像这样的重新采样只需几个步骤即可完成。首先,使用procsql创建一个包含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;
然后,使用PROC GLM和BY语句,计算每个复制的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(示例中的测试统计量),然后使用平均值程序获得为真的时间分数。最终答案应约为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;

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

在此之后,您可以使用
proc glm
by
关键字,根据最终数据集中的组指示符
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;

是的,只要可能,在SAS中使用BY语句多次运行。非常强大,运行和编码速度都比大型宏循环或类似循环快得多。谢谢,但上面可能有概念上的错误。我不想样品更换,但没有。每个观测值都应该有相同的被选择机会,一旦被选择,就不能再被选择。产生的p值不应变化。无论您运行测试多少次,它都应该是常量。我相信这里的正确答案是0.071。@JohnK其余的,你可以参考Jake的答案,从
proc glm
开始。用
group
替换
replicate
,删除
weight
语句,然后进行最终统计。我只是想告诉你如何生成组合。你需要告诉我们你遇到了什么问题。代码将提供1680组/组合,这正是您想要的。我测试过了。然后像Jake提到的那样,使用
proc glm的
by
。另外,花一些时间在
proc glm
上阅读文档。组合生成是一个困难的部分,但模型运行不是。它是
类变量
按组
,而不是
类组
。组是组合组号,类是方差分析组。非常感谢。我会仔细研究所有这些说法。