Shapiro-Wilk检验(或称为Shapiro检验)是频率学派统计学中的一种正态性检验。Shapiro检验的原假设是总体服从正态分布。在用于检测各类偏离正态分布情况的检验中,它是三大正态性检验之一。如果计算得到的 p 值小于或等于 0.05,那么正态性的假设将被 Shapiro 检验拒绝。如果检验未通过(即拒绝原假设),我们可以以 95% 的置信度断定数据不符合正态分布。然而,如果检验通过,则表明数据没有显著偏离正态分布。这项检验在 R 编程语言 中可以非常轻松地完成。
#### Shapiro-Wilk 检验公式
假设一个样本,比如 x1, x2…….xn,来自一个正态分布的总体。那么根据 Shapiro-Wilk 检验的原假设检验公式:
W=\frac{(\sum{i=1}^n aix{(i)})^2}{(\sum{i=1}^n x_i – \bar{x})^2}
> 其中,
>
>
> – x(i) : 给定样本中第 i 小的数。
> – mean(x) : ( x1+x2+……+xn) / n,即样本均值。
> – ai : 系数,计算公式为 (a1, a2,….,an) = (mT V-1)/C 。这里的 V 是协方差矩阵,m 和 C 是向量范数,计算方式为 C= |
且 m = (m1, m2,……, mn )。
#### 在 R 中的实现
为了执行 Shapiro-Wilk 检验,R 提供了 shapiro.test() 函数。
> 语法:
>
>
> shapiro.test(x)
>
>
> 参数:
>
>
> x : 一个包含数据值的数值向量。它允许包含缺失值,但缺失值的数量应控制在 3 到 5000 之间。
让我们一步步来看看如何进行 Shapiro-Wilk 检验。
- 步骤 1: 首先,安装所需的包。执行此检验需要两个包,分别是 dplyr。dplyr 包用于进行高效的数据操作。我们可以通过以下方式在 R 控制台中安装这些包:
install.packages("dplyr")
- 步骤 2: 现在,将安装的包加载到 R 脚本中。这可以通过使用 library() 函数来完成,如下所示:
R
CODEBLOCK_7e0adc57
- 步骤 3: 最重要的是选择一个合适的数据集。在这里,我们将使用 ToothGrowth 数据集。它是 R 库中的一个内置数据集。
R
CODEBLOCK_3357128e
我们也可以创建自己的数据集。为此,首先需要准备好数据,然后保存文件,最后将数据集导入到脚本中。可以使用以下语法包含文件:
data <- read.delim(file.choose()) ,if the format of the file is .txt
data <- read.csv(file.choose()), if the format of the file is .csv
- 步骤 4: 现在使用 set.seed() 函数选择一个随机数。随后,我们使用 dplyr 包中的 sample_n() 函数开始显示随机选择的 10 行输出样本。这就是我们检查数据的方式。
R
CODEBLOCK_3330b788
输出:
len supp dose
1 11.2 VC 0.5
2 8.2 OJ 0.5
3 10.0 OJ 0.5
4 27.3 OJ 2.0
5 14.5 OJ 1.0
6 26.4 OJ 2.0
7 4.2 VC 0.5
8 15.2 VC 1.0
9 14.5 OJ 0.5
10 26.7 VC 2.0
- 步骤 5: 最后,使用 shapiro.test() 函数执行 Shapiro Wilk 检验。
R
CODEBLOCK_389b9279
输出:
> dplyr::sample_n(my_data, 10)
len supp dose
1 11.2 VC 0.5
2 8.2 OJ 0.5
3 10.0 OJ 0.5
4 27.3 OJ 2.0
5 14.5 OJ 1.0
6 26.4 OJ 2.0
7 4.2 VC 0.5
8 15.2 VC 1.0
9 14.5 OJ 0.5
10 26.7 VC 2.0
> shapiro.test(my_data$len)
Shapiro-Wilk normality test
data: my_data$len
W = 0.96743, p-value = 0.1091
根据获得的输出结果,我们可以假设数据服从正态分布。因为 p 值大于 0.05。因此,给定数据的分布与正态分布没有显著差异。