Statistics SAS的非参数检验
我有一个小数据集,由三个变量中每一个的三个不同观察值组成,比如x1 x2,x3和随附的响应y,我想对其进行方差分析,以检验均值是否相等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; 到目前为止一切都很好。现
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
上阅读文档。组合生成是一个困难的部分,但模型运行不是。它是类变量
和按组
,而不是类组
。组是组合组号,类是方差分析组。非常感谢。我会仔细研究所有这些说法。