对于大多数参数统计方法,均要求数据服从待定的分布形态,对于两组或多组数据,还需要满足组间分布形态相同或组间方差相等假设等等。如果数据不满足特定分析说需要的前提条件,最终均可归入分参数分析方法的处理范畴。下面就是一段处理多组分参数检验的SAS程序,首先进行Kruskal-Wallis秩和检验,若p>0.05则显示结果,若p<0.05则进行Nemenyi法的多组比较。摘抄自《A SAS Macro for Testing Differences among Three or More Independent Groups Using Kruskal-Wallis and Nemenyi Tests》
<br />
%macro Nemenyi ( Libname=,/* the SAS Library name of specified dataset */<br />
Filename=, /* the dataset name */<br />
GroupVar=, /* name of variable that defines the subgroup combinations for the analysis */<br />
TargetVar=, /* name of analysis variable */<br />
FreqVar=,/* name of variable that contains frequency of each observation. It should be null when there is no variable for frequency */<br />
Alpha= /* confidence level */);<br />
options nodate nonumber;</p>
<p>data _working;<br />
set &Libname..&Filename.;<br />
%if &FreqVar.^= %then %do;<br />
do _i=1 to &FreqVar.;<br />
output;<br />
end;<br />
keep &FreqVar.;<br />
%end;<br />
keep &GroupVar. &TargetVar.;<br />
run;</p>
<p>ods output KruskalWallisTest=_KruskalWallisTest;<br />
proc npar1way data=_working wilcoxon;<br />
var &TargetVar.;<br />
class &GroupVar.;<br />
run;<br />
ods output close;</p>
<p>data _null_;<br />
set _KruskalWallisTest end=_eof;<br />
if _eof then call symputx("p_value",round(nValue1,0.0001));<br />
run;</p>
<p>proc sql noprint;<br />
select count(distinct &GroupVar.) into :GroupNum<br />
from _working;<br />
quit;</p>
<p>%if &GroupNum.>2 and &p_value.<&Alpha. %then %do;<br />
proc rank data=_working out=_RankData ties=mean;<br />
var &TargetVar.;<br />
run;</p>
<p>ods listing close;<br />
proc means data=_RankData chartype;<br />
class &GroupVar. &TargetVar.;<br />
var &TargetVar.;<br />
output out=_CharData(where=(_type_='10')) mean=_R n=_n;<br />
output out=_C(where=(_type_='01')) n=_t;<br />
run;</p>
<p>ods listing;<br />
data _null_;<br />
set _CharData(keep=&GroupVar. _R _n) end=_eof;<br />
_R=round(_R,0.01);<br />
_TotalNum+_n;<br />
array _Char{*} _character_;<br />
array _Num{*} _numeric_;<br />
do i=1 to dim(_Char);<br />
call symputx(cats(vname(_Char[i] ),_n_),_Char[i]);<br />
end;<br />
do i=1 to dim(_Num);<br />
call symputx(cats(vname(_Num[i] ),_n_),_Num[i]);<br />
end;<br />
if _eof then call symputx ("TotalNum",_TotalNum);<br />
run;</p>
<p>data _null_;<br />
set _C(keep=_t) end=_eof;<br />
_C+(_t**3-_t)/(&TotalNum.**3-&TotalNum.);<br />
if _eof then call symputx ( '_C', 1-_C);<br />
run;</p>
<p>data _Nemenyi;<br />
%do _i=1 %to &GroupNum.;<br />
%do _j=2 %to &GroupNum.;<br />
%if &_j.>&_i. %then %do;<br />
length _Groups $ 10;<br />
_Groups = "&&&GroupVar&_i. vs &&&GroupVar&_j.";<br />
_MeanScore1=&&_R&_i.;<br />
_MeanScore2=&&_R&_j.;<br />
_Chi_Square=round((&&_R&_i.-&&_R&_j.)**2/((&TotalNum.*(&TotalNum.+1)/12*(1/&&_n&_i.+1/&&_n&_j.))*&_C.),0.0001);<br />
_DF=&GroupNum.-1;<br />
length _Pr $ 6;<br />
_Pr=ifc(1-probchi(_Chi_Square,&GroupNum.-1)<0.0001,"<.0001",strip(put(1-probchi( _Chi_Square,&GroupNum.-1),10.4)));<br />
output;<br />
%end;<br />
%end;<br />
%end;<br />
format _MeanScore1 _MeanScore2 10.2<br />
_Chi_Square 10.4;<br />
label _MeanScore1="Mean Score of Group 1"<br />
_MeanScore2="Mean Score of Group 2"<br />
_Groups ="Groups for Comparison"<br />
_Chi_Square="Chi-Square"<br />
_DF ="DF"<br />
_Pr ="Pr > Chi-Square";<br />
run;<br />
title1 " ";<br />
title2 'Nemenyi test for multiple comparisons ';<br />
proc print data=_Nemenyi noobs label;<br />
run;<br />
title1;<br />
%end;<br />
%mend;<br />
</p>