执行Shapiro-Wilk常态测试

时间:2013-03-15 08:25:02

标签: r statistics normal-distribution

我想进行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)
  

[.data.frame(x,complete.cases(x))中的错误:     选择了未定义的列

为什么不选择正确的列,我该怎么做?

4 个答案:

答案 0 :(得分:122)

shapiro.test做了什么?

shapiro.test测试 Null假设"样本来自正态分布" 反对 替代假设"样本不是来自正态分布"。

如何在R中执行shapiro.test?

?shapiro.test的R帮助页面,

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期望数字向量作为输入,对应于您要测试的样本,它是唯一需要的输入。由于您拥有 data.frame ,因此您必须将所需的列作为输入传递给函数,如下所示:

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

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

解释shapiro.test的结果:

首先,我强烈testing for normality上向Ian Fellows建议你read this excellent answer

如上所示,shapiro.test测试样本来自正态分布的NULL假设。这意味着如果您的 p值<= 0.05 ,那么您将拒绝样本来自正态分布的NULL假设。正如Ian Fellows所说,你正在测试反对正常性假设&#34;。换句话说(如果我错了,请纠正我),如果测试样本来自正态分布的NULL假设,那么会好得多。为什么?因为,拒绝NULL假设与接受备选假设不一样

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)来自正态分布。我想说的是,在很多情况下,&#34;极端&#34;不满足要求(p <0.05),这导致接受&#34; NULL假设&#34;大多数时候,这可能会产生误导。

我想从@PaulHiemstra引用另一个问题来评论对大样本量的影响:

  

Shapiro-Wilk测试的另一个问题是,当您提供更多数据时,拒绝原假设的机会变得更大。所以会发生的是,对于大量数据,甚至可以检测到与正常性的非常小的偏差,导致拒绝零假设事件,尽管出于实际目的,数据足够正常。

虽然他也指出R的数据大小限制保护了这一点:

  

幸运的是,shapiro.test通过将数据大小限制为5000来保护用户免受上述影响。

如果NULL假设是相反的,意思是,样本来自正态分布,并且你得到 p值&lt; 0.05 ,然后您得出结论非常罕见这些样本来自正态分布(拒绝NULL假设)。这松散地转化为:样本很可能是正态分布的(尽管一些统计学家可能不喜欢这种解释方式)。我相信这是Ian Fellows在他的帖子中也试图解释的。如果我出错了,请纠正我!

@PaulHiemstra还会在遇到正常性测试问题时评论实际情况(例如回归):

  

在实践中,如果分析假设正常,例如嗯,我不会做这个Shapiro-Wilk的测试,但是做分析并查看分析结果的诊断图,以判断分析的任何假设是否被过度侵犯。对于使用lm的线性回归,可以通过查看使用plot(lm())获得的一些诊断图来完成。统计数据不是一系列咳出几个数字的步骤(嘿p <0.05!),但在判断如何正确分析数据方面需要大量的经验和技巧。

在这里,我发现Ian Fellows对Ben Bolker的回复在同一问题上的回复已经在上面同样(如果不是更多)提供了信息:

  

对于线性回归,

     
      
  1. 不要担心常态。 CLT快速接管,如果您拥有除最小样本之外的所有样本以及甚至是远程合理的直方图,您都可以。

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

  4.   
  5. 离群值。烹饪距离> 1是合理的理由引起关注。

  6.         

    这些是我的想法(FWIW)。

希望这可以解决一些问题。

答案 1 :(得分:8)

您正在将shapiro.test()应用于data.frame而不是列。请尝试以下方法:

shapiro.test(heisenberg$HWWIchg)

答案 2 :(得分:1)

您未能指定要测试其正常性的确切列(数据)。 请改用

shapiro.test(heisenberg$HWWIchg)

答案 3 :(得分:-1)

将数据设置为向量,然后放置在函数中。