中国卫生统计
    主页 > 期刊导读 >

Friedman M检验平均秩的多重比较在SAS软件的实

对于随机区组设计资料不满足方差分析的条件时,可使用基于秩的非参数检验。统计软件SPSS 18.0及其更高版本已经提供了通过菜单操作实现Friedman M检验平均秩的多重比较功能[1],但SPSS提供的多重比较方法对P值进行了校正,虽降低了犯Ⅰ类错误的概率,但当处理组数较多时,检验结果偏保守。《中国卫生统计》杂志于2013年8月发表了一篇关于在SPSS中通过编程实现同样功能的文章[1],虽解决了这个问题,但部分计算还需要手工计算(如相同秩次的重复次数的计算),且只能计算出多重比较的统计量q值,而对应的P值还需要查q界值表[2],不仅繁琐,且无法得到精确概率。本研究使用SAS编程避免了所有手工计算,同时可获得q值对应的确切概率值,避免了以上不足。

q检验原理

设随机区组设计资料有g个处理组,n个区组,在不满足方差分析的条件时,进行Friedman M检验。Friedman M检验的结果为拒绝H0时,可以认为多个总体分布位置不全相同,需要进一步分析具体哪两组总体位置分布不同。此时,可先将原始数据在每个区组内编秩,相同数据取平均秩,然后基于秩次做多个相关样本两两比较的q检验[3]。q检验的原假设和备择假设分别为H0:任意两个总体分布位置相同,H1:任意两个总体分布位置不同。规定检验水准为α,q统计量的计算公式是:

其中MS误差=

Ri为第i个处理组的秩和,Rj为第j个处理组的秩和,n为区组个数,g为处理组个数,tk为各区组内第k个相同秩的个数。q的分布形态依赖于自由度和样本跨度,其中自由度v=(n-1)(g-1),样本跨度m为将g个样本秩和排序后,Ri和Rj之间涵盖的秩和的个数(包括Ri和Rj自身在内,故2≤m≤g)。

通过式(1)可以计算任意两组的q值和自由度以及样本跨度,利用特定的SAS函数可进一步计算出q值对应的P值[4],从而得到相应的检验结果。

实例分析

8名受试者在相同试验条件下接受4种不同频率声音的刺激,他们的反应率(%)资料见表1[3]。问4种不同频率声音刺激的反应率是否有差别?

表1 8名受试对象对4中不同频率声音刺激的反应率(%)比较编号频率A反应率秩频率B反应率秩频率C反应率秩频率D反应率秩.—11—16—23.5—29.5

q检验的步骤和相应的SAS程序

第一步:建立数据集,并对各处理组进行正态性检验。

data example;

input x group block @@;

/* x:反应率,group:分组,block:区组*/

cards;

8.4 1 1 9.6 2 1 9.8 3 1 11.7 4 1

11.6 1 2 12.7 2 2 11.8 3 2 12.0 4 2

9.4 1 3 9.1 2 3 10.4 3 3 9.8 4 3

?

7.8 1 8 8.2 2 8 8.5 3 8 10.8 4 8

;

proc univariate normal data=example;

var x;class group;run;

正态性检验结果:当group=2时,Shapiro-Wilk统计量(W= 0.)对应的P值为0.037,不满足正态分布,使用非参数检验。

第二步:随机区组设计的Friedman M检验。

proc freq data=example;

tables block*group*x/scores=rank cmh2;

run;

Friedman M检验结果:当g=4且n>5时,Friedman M检验的统计量M的分布近似χ2分布,χ2=15.1519,对应的P值为0.0017,可认为4种频率声音刺激的反应率总体分布位置不全相同,需使用多重比较进行进一步分析。

第三步:对反应率x在各区组内编秩,为多重比较作准备。

proc rank data=example out=ex_rank;

by block;var x;ranks x_rank;

/*对x在区组内编秩的结果存放在新变量x_rank中*/

run;

第四步:基于新变量x_rank计算多重比较的q统计量和对应的P值。

data ex_rank1;

/*逐步累加求出4个处理组的秩和,放在数组R的4个元素中*/

setex_rank;

array R[4](0,0,0,0);

retain R;sum_Ri=0;

do i=1 to 4;

if group=i then R[i]=R[i]+x_rank;

sum_Ri=sum_Ri+R[i]*R[i];

/*sum_Ri存放各个处理组的秩的平方和*/

end;run;

data ex_rank2;/*去掉不用的变量和观测*/

set ex_rank1;drop x i;

where group=4 and block=8;run;

ods output table=again(where=(x_N>1) keep=x_N);