我有一个小的数据集,包括对三个变量中的每一个的三个不同的观察结果,比如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!)),所以我需要一周时间。是否有更优雅的方式来实现这一目标?也许是一种在循环或函数中包装此过程的方法?
我将非常感谢你的帮助,谢谢你。
答案 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;