执行Shapiro-Wilk正态性检验

33

我想进行一次Shapiro-Wilk正态性检验。我的数据格式是csv。它看起来像这样:

 heisenberg
    HWWIchg
1    -15.60
2    -21.60
3    -19.50
4    -19.10
5    -20.90
6    -20.70
7    -19.30
8    -18.30
9    -15.10

然而,当我进行测试时,我收到了:

 shapiro.test(heisenberg)

Error in [.data.frame(x, complete.cases(x)) : undefined columns selected

为什么R没有选择正确的列,我该怎么做?

4个回答

131

shapiro.test是做什么的?

shapiro.test检验"样本来自于正态分布"的零假设样本不来自于正态分布的备择假设

如何在R中执行shapiro.test?

R的帮助页面?shapiro.test给出:

x - a numeric vector of data values. Missing values are allowed, 
    but the number of non-missing values must be between 3 and 5000.

也就是说,shapiro.test 函数需要一个数值向量作为输入,该向量对应要测试的样本,并且这是唯一必需的输入。由于您有一个数据框,因此必须按以下方式将所需列作为输入传递给函数:

> shapiro.test(heisenberg$HWWIchg)
#   Shapiro-Wilk normality test

# data:  heisenberg$HWWIchg 
# W = 0.9001, p-value = 0.2528

解释 shapiro.test 结果:

首先,我强烈建议您阅读Ian Fellows在testing for normality上的精彩回答

如上所示,shapiro.test测试了样本来自正态分布的NULL假设。这意味着如果您的p值≤0.05,那么您将拒绝样本来自正态分布的NULL假设。正如Ian Fellows所说,您正在测试反对正态性假设。换句话说(如果我错了,请纠正我),如果测试空假设为样本来自正态分布,则会更好。为什么?因为拒绝一个空假设并不等于接受备择假设。

shapiro.test的空假设情况下,p值≤0.05将拒绝样本来自正态分布的零假设。简单来说,存在很小的可能性样本来自正态分布。这种假设检验的副作用是这种罕见的可能性很少发生。举个例子,比如:

set.seed(450)
x <- runif(50, min=2, max=4)
shapiro.test(x)
#   Shapiro-Wilk normality test
# data:  runif(50, min = 2, max = 4) 
# W = 0.9601, p-value = 0.08995
因此,这个(特定的)样本 runif(50, min=2, max=4) 来自正态分布,根据这个测试。我的意思是,在许多情况下,“极端”要求(p < 0.05)不满足,这导致大多数时候接受“NULL假设”,这可能会误导。
我想引用@PaulHiemstra在评论中提到的大样本量效应的另一个问题:
“Shapiro-Wilk's测试的另一个问题是,当你输入更多数据时,零假设被拒绝的机会变得更大。因此,对于大量数据甚至可以检测到非常小的偏离正常性,导致拒绝零假设,即使对于实际目的而言,数据已足够正常。”
尽管他还指出R的数据大小限制有些保护:
“幸运的是,shapiro.test通过将数据大小限制为5000来保护用户免受上述描述的影响。”
如果零假设相反,意味着样本来自正态分布,并且您获得p值<0.05,则可以得出结论,这些样本通常不来自正态分布(拒绝零假设)。简单地说,样本很可能是正态分布的(尽管一些统计学家可能不喜欢这种解释方式)。我认为这也是Ian Fellows在他的帖子中试图解释的内容。如果我错了,请纠正我!
@PaulHiemstra还评论了实际情况(例如回归)中遇到这个测试正态性问题时的情况:
“实际上,如果分析假设正态性,例如lm,我不会进行Shapiro-Wilk's测试,而是进行分析并查看分析结果的诊断图来判断是否违反了分析的任何假设。对于使用lm的线性回归,可以通过查看使用plot(lm())获得的一些诊断图来完成这项工作。统计学不是一系列咳嗽几个数字(嘿p <0.05!),而需要大量经验和技能来判断如何正确分析数据。”
在这里,我发现Ian Fellows回复Ben Bolker在同一问题下的评论的回复同样(如果不是更加)有信息价值:
“对于线性回归,”
  1. 不要太担心正态性。 CLT很快接管,如果您具有除最小样本大小以外的所有样本大小和一个看起来合理的直方图,那么您就可以放心了。

  2. 担心不等方差(异方差性)。我担心这一点,以至于(几乎)默认使用HCCM测试。比例位置图将给出一些关于是否破坏的想法,但并不总是如此。此外,在大多数情况下没有先验理由假定平等的变异性。

  3. 异常值。烹饪距离> 1是令人担忧的充分理由。 "这些是我的想法(FWIW)。

    希望这可以澄清一些事情。

4
Shapiro-Wilks检验的另一个问题是,当您输入更多数据时,零假设被拒绝的概率会变得更大。因此,对于大量数据,即使存在非常微小的偏差,也可以检测到正态性,并导致零假设被拒绝,尽管从实际目的来看,数据已经足够接近正态分布。 - Paul Hiemstra
3
在实践中,如果一个分析假设正态性,比如使用lm,我不会进行Shapiro-Wilks检验,而是进行分析并查看分析结果的诊断图,以判断是否违反了任何分析假设。对于使用lm进行线性回归,可以通过查看使用plot(lm())得到的一些诊断图来完成此操作。统计学不仅仅是一系列步骤,可以得出一些数字(嘿,p < 0.05!),而需要许多经验和技能来判断如何正确地分析数据。 - Paul Hiemstra
@Arun如果你同意我的评论,你可以将它们编辑到你的答案中,现在看起来有点凌乱 :)。 - Paul Hiemstra
幸运的是,shapiro.test通过将数据大小限制为5000来保护用户免受上述描述的影响。 - Paul Hiemstra
p <= 0.05远非“极其罕见的机会”。 - Rodrigo
@Arun,关于解释结果我有点困惑。我看到如果W < W@=0.5,则拒绝零假设。输出中的“p值”是否与95% CI处的W统计量相同? - derelict

10

你正在对一个 data.frame 应用 shapiro.test(),而不是对列进行操作。请尝试以下内容:

shapiro.test(heisenberg$HWWIchg)

1
您未能指定要测试正态性的确切列(数据)。请改用以下内容。
shapiro.test(heisenberg$HWWIchg)

-2
将数据设置为向量,然后放入函数中。

1
让我们尽可能地保持礼貌。 - Jennifer Goncalves

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接