分享

正态性检验Anderson-Darling在Excel中的实现!

 留在家里 2022-05-03 发布于浙江

图片

哈姆雷特说:“生存还是死亡,这是一个问题”。套用一下,“数据是正态还是非正态,这是一个问题”。而且对于统计学来说,这是一个非常重要的问题!很多统计工具的运用,都是基于数据的正态性。判断数据的正态性,乃是万种统计技术的基石,没有基石,何来高楼!

正态性检验Minitab中一般采用Anderson-Darling检验(以下简称AD检验),6SQ统计V3.1(以下简称6SQ统计)软件同样如此。

那么Excel是否能简单地进行AD检验呢?答案是肯定的,一切在于您的Excel技能。

当然,重中之重,先得搞清楚AD检验的具体计算方法,以下用实例进行说明。

先看Minitab的帮助文件:

图片

其原理大致上就是,用样本数据的实际累积分布概率,与已知均值和标准差的正态分布的累积分布概率,两相比较,如果其差异小于一个阀值,就是正态分布,反之则非。

具体的算法:

Minitab帮助文件中的“方法和公式”,是这样描述的:

图片

让我们来解析一下统计量A2的计算公式:

式中,N是数据个数,i是数据序号。F函数,这里指的是正态分布的累积分布函数(CDF),Excel中的正态分布累积分布函数是NormDist函数。查看Excel帮助文件中关于NormDist函数的说明:

图片

NormDist函数有四个参数,第1个参数为数据Yi,第2个参数为均值(Mean),第3个参数为标准偏差(StDev),第4个参数为累积还是非累积,这里是CDF,取逻辑型常数True。

应用这个函数,首先要计算出均值和标准偏差,这在Excel中很简单,略过。

先将数据从小到大排列,构建序号i,F(Yi)就是第i个数据的累积分布函数,Excel公式为:

=NormDist(第i个数据Yi,Mean,StDev,True)

F(YN+1-i),就是倒数第i个数据的累积分布函数,Excel公式为:

=NormDist(第N+1-i个数据YN+1-i,Mean,StDev,True)

当i=1时,F(Yi)就是第1个数据的累积分布概率,1- F(YN+1-i),就是总概率1,减去第N个数据的累积分布概率,也就是最后一个数据在正态分布概率图形上的右尾累积概率。

如果完全符合正态分布,而正态分布的概率密度图形呈倒钟形,左右对称,分位数为0.05处的左侧累积概率,与分位数1-0.05=0.95处的右侧累积概率是相等的。如果不相等,说明与正态分布有所偏离,偏离的程度用一个统计量来表述,这就是AD检验的统计量A2的大致原理。

AD检验的计算过程:

1. 根据A2的计算公式:

图片

计算第i行数据的 (2i-1) × [ Ln(F(Yi)) + Ln(1- F(YN+1-i)) ],然后累加,再乘以-1/N,再减去N,即可得到A2统计量。

这里,F(Yi)的Excel计算公式上文已述:

=NormDist(Yi,Mean,StDev,True)

2. A2统计量进行调整,得到调整了的统计量A2',公式为:

A2' = A2×[ 1 + 0.75/A2 + 2.25/(A2×A2) ]

3. 根据A2'计算p值:

 A2'≥0.6时:

  EXP(1.2937 - 5.709 × A2' + 0.0186 × A2' × A2')

  这里计算结果如果小于0.001,就记为“<0.001”,不必显示很小的数值。

 A2'≥0.34时:

  EXP(0.9177 - 4.279 × A2' - 1.38 × A2' × A2')

 A2'≥0.2时:

  1 - EXP(-8.318 + 42.796 × A2' - 59.938 × A2' × A2')

 A2'<0.2时:

  1 - EXP(-13.436 + 101.14 × A2' - 223.73 × A2' × A2')

 注:EXP函数,表示自然常数e的几次方,例如EXP(2)就是e的平方。

4. 如果p≥0.05(这个临界值一般认为是0.05,也有采用0.10的),即可认为数据符合正态分布,否则不是正态分布。

6SQ统计和Minitab的AD检验:

实例数据如下:

一组数据,排序,构建序号,并计算F函数如下表:

数据

序号

F(Yi)

1-F(YN+1-i)

8

1

0.156

0.0161

8.6

2

0.184

0.0386

9

3

0.203

0.107

9.1

4

0.208

0.122

9.2

5

0.213

0.186

9.2

6

0.213473141

0.222

9.3

7

0.219

0.304

10.2

8

0.269

0.390

10.3

9

0.275

0.688

10.4

10

0.281

0.713

10.5

11

0.287

0.719

10.9

12

0.312

0.725

15.2

13

0.610

0.731

16.5

14

0.696

0.781

17.91

15

0.778

0.787

18.61

16

0.814

0.787

20.13

17

0.878

0.792

20.56

18

0.893

0.797

23.5

19

0.961

0.816

25.6

20

0.984

0.844

其中,表中F函数的计算公式:

序号

F(Yi)

1-F(YN+1-i)

1

=NORMDIST(SMALL($C$2:$C$21,D2),$I$7,$I$8,TRUE)

=1-NORMDIST(LARGE($C$2:$C$21,D2),$I$7,$I$8,TRUE)

2

=NORMDIST(SMALL($C$2:$C$21,D3),$I$7,$I$8,TRUE)

=1-NORMDIST(LARGE($C$2:$C$21,D3),$I$7,$I$8,TRUE)

3

=NORMDIST(SMALL($C$2:$C$21,D4),$I$7,$I$8,TRUE)

=1-NORMDIST(LARGE($C$2:$C$21,D4),$I$7,$I$8,TRUE)

4

=NORMDIST(SMALL($C$2:$C$21,D5),$I$7,$I$8,TRUE)

=1-NORMDIST(LARGE($C$2:$C$21,D5),$I$7,$I$8,TRUE)

5

=NORMDIST(SMALL($C$2:$C$21,D6),$I$7,$I$8,TRUE)

=1-NORMDIST(LARGE($C$2:$C$21,D6),$I$7,$I$8,TRUE)

说明:Small返回数据区域的第n小的数据,Large返回数据区域的第n大的数据,单元格I7和I8分别是数据的均值和标准偏差。采用Small和Large函数在源数据没有排序时也能得到正确的结果。

得到的结果:

图片

具体计算过程请参见附上的Excel文档。

以下是6SQ统计输出的图表

图片


图片

Minitab的输出:图片

两个软件的检验结果完全相同,但输出的详略有很大区别,6SQ包含直方图和概率图,及详细具体的计算过程,研究一下6SQ统计输出的Excel文档,就可以看出AD检验的步骤。而Minitab只输出一张图,帮助文件中只有A2统计量的算法,并未涉及统计量的调整算法和p值的计算方法。

挑战高难度:三个单元格实现AD检验:

有时候AD检验并不需要输出那么多内容,尽量简单的检验结果也非常有必要。例如SPC控制图工作表的设计,只要有AD检验的结果就可以了。

6SQ统计软件可以只用三个单元格就搞定AD检验,在需要进行AD检验的其它统计功能中,就是这么做的。(这里所说的三个单元格,并未包括用于标识的单元格。)

同样,您如果对Excel操作够熟悉,您也可以!

三个单元格,对,就三个!Come on。

Step 1:添加工作表名称定义

添加两个工作表的名称定义:

SQ_AD,其Refers to为源数据区域

SQ_AdCnt,数据源为: =COUNT(SQ_AD) 

“Sorry,添加名称定义,偶不会操作:)”,好吧,这里有个截图说明,我的Exce是英文的2013版本,没办法,将就着看。

还是不会?纳尼,那您还是问度娘吧……

图片

Step 2:输入公式:

第1个单元格D2:用于计算A2统计量

在D2单元格中输入公式:

=-SQ_ADCnt-(1/SQ_ADCnt)*SUM((2*ROW(OFFSET($C$1,,,SQ_ADCnt))-1)*(LN(NORMDIST(SMALL(SQ_AD,ROW(OFFSET($C$1,,,SQ_ADCnt))),AVERAGE(SQ_AD),STDEV(SQ_AD),1))+LN(1-NORMDIST(LARGE(SQ_AD,ROW(OFFSET($C$1,,,SQ_ADCnt))),AVERAGE(SQ_AD),STDEV(SQ_AD),1))))

复制这个公式文本到单元格,按F2进入公式编辑状态,再按下Ctrl + Shift + Enter组合键,输入数组公式。不输入数组公式是无法得到正确结果滴。

这个公式看上去很复杂,其实还是根据Minitab帮助文件中的AD统计量的计算方法而来,只是将众多单元格的公式浓缩在一个单元格内。

后面两个单元格就比较简单了,无需输入数组公式。

第2个单元格D3:用于计算调整了的A2统计量A2'

在D3单元格中输入以下公式:

=D2*(1+0.75/COUNT(SQ_AD)+2.25/COUNT(SQ_AD)^2)

或者:

=D2*(1+0.75/SQ_ADCnt +2.25/SQ_ADCnt^2)

第3个单元格D4:用于计算p值

在D4单元格中输入以下公式:

=IF(ISERROR($D$3),'',IF($D$3='','',IF($D$3>=0.6,IF(EXP(1.2937- 5.709 * $D$3 + 0.0186 * $D$3 *$D$3)<0.001,'<0.001',EXP(1.2937 - 5.709 * $D$3 + 0.0186 * $D$3* $D$3)),IF($D$3>=0.34,EXP(0.9177 - 4.279 * $D$3 - 1.38 * $D$3 *$D$3),IF($D$3>=0.2,1 - EXP(-8.318 + 42.796 * $D$3 - 59.938 * $D$3 * $D$3),1- EXP(-13.436 + 101.14 * $D$3 - 223.73 * $D$3 * $D$3))))))

Step 3:得到的结果

AD统计量

1.415142907

AD调整值

1.476170945

p值

<0.001

公式如下:

AD统计量

=-SQ_ADCnt-(1/SQ_ADCnt)*SUM((2*ROW(OFFSET($C$1,,,SQ_ADCnt))-1)*(LN(NORMDIST(SMALL(SQ_AD,ROW(OFFSET($C$1,,,SQ_ADCnt))),AVERAGE(SQ_AD),STDEV(SQ_AD),1))+LN(1-NORMDIST(LARGE(SQ_AD,ROW(OFFSET($C$1,,,SQ_ADCnt))),AVERAGE(SQ_AD),STDEV(SQ_AD),1))))

AD调整值

=D2*(1+0.75/COUNT(SQ_AD)+2.25/COUNT(SQ_AD)^2)

p值

=ISERROR($D$3)  '' $D$3='' '' $D$3>=0.6 IF(EXP(1.2937 -  5.709 * $D$3 + 0.0186 * $D$3 *  $D$3)<0.001,'<0.001',EXP(1.2937 - 5.709 * $D$3 + 0.0186 *  $D$3 * $D$3)) $D$3>=0.34 EXP(0.9177 - 4.279 * $D$3 - 1.38 * $D$3 * $D$3)  $D$3>=0.2 1

当然,也可以不定义SQ_ADCnt名称定义,直接用COUNT(SQ_AD)代替即可。

可以发现,三个单元格得到的计算结果,和6SQ统计和Minitab的输出完全相同。

步骤还是太多,您如果会VBA编程,就可以自己设计一个按钮,一键实现AD检验,原理在这里放着,就等您来运用了。

图片

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多