【问题标题】:Perform a Shapiro-Wilk Normality Test执行 Shapiro-Wilk 正态性检验
【发布时间】:2013-03-03 21:20:37
【问题描述】:

我想执行夏皮罗-威尔克正态性检验。我的数据是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)) 中的错误: 选择了未定义的列

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

【问题讨论】:

    标签: r statistics normal-distribution


    【解决方案1】:

    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 的结果:

    首先,我强烈建议您 read this excellent answer 来自 Ian Fellows testing for normality

    如上所示,shapiro.test 测试样本来自正态分布的 NULL 假设。这意味着如果您的 p 值 ,那么您将拒绝样本来自正态分布的 NULL 假设。正如 Ian Fellows 所说,您正在测试反对常态假设“。换句话说(如果我错了,请纠正我),这将是 很多如果测试样本不来自正态分布的 NULL 假设会更好。为什么?因为,拒绝 NULL 假设与接受 不同备择假设。

    shapiro.test 的原假设的情况下,p 值 极少。这种假设检验的副作用是这种罕见的机会发生非常罕见。举例说明:

    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

    我想在这里引用来自 cmets 下的@PaulHiemstra 关于大样本量影响的另一个问题:

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

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

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

    如果 NULL 假设相反,即样本来自正态分布,并且您得到 p 值 ,那么您得出结论非常罕见这些样本来自正态分布(拒绝 NULL 假设)。这大致翻译为:样本很可能是正态分布的(尽管一些统计学家可能不喜欢这种解释方式)。我相信这也是 Ian Fellows 在他的帖子中试图解释的。如有错误请指正!

    @PaulHiemstra 还讨论了遇到此正态性测试问题时的实际情况(示例回归):

    在实践中,如果分析假设正态性,例如lm,我不会做这个夏皮罗-威尔克检验,而是做分析并查看分析结果的诊断图,以判断分析的任何假设是否违反了太多。对于使用 lm 的线性回归,这是通过查看使用 plot(lm()) 获得的一些诊断图来完成的。统计不是一连串的计算出几个数字的步骤(嘿 p

    在这里,我发现 Ian Fellows 对 Ben Bolker 在上面已经链接的同一问题下的评论的回复同样(如果不是更多)信息丰富:

    对于线性回归,

    1. 不要太担心正常性。 CLT 会很快接管,如果除了最小的样本量和看起来很合理的直方图之外,你还可以。

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

    3. 异常值。烹饪距离 > 1 是合理的担忧。

    这些是我的想法(FWIW)。

    希望这能把事情弄清楚一点。

    【讨论】:

    • Shapiro-Wilks 检验的另一个问题是,当您为其提供更多数据时,拒绝原假设的机会会变得更大。所以发生的情况是,对于大量数据,甚至可以检测到与正态性的极小偏差,从而导致拒绝零假设,即使出于实际目的,数据已经足够正常了。
    • 在实践中,如果分析假设正态性,例如lm,我不会做这个夏皮罗-威尔克斯检验,而是做分析并查看分析结果的诊断图,以判断分析的任何假设是否违反了太多。对于使用lm 的线性回归,这是通过查看使用plot(lm()) 获得的一些诊断图来完成的。统计数据不是一连串计算出几个数字的步骤(嘿,p
    • @Arun 如果你同意我的 cmets,你可以将它们编辑成你的答案,现在看起来有点乱 :)。
    • 幸运的是 shapiro.test 通过将数据大小限制为 5000 来保护用户免受上述影响。
    • p 极其罕见的机会”相差甚远。
    【解决方案2】:

    您将shapiro.test() 应用于data.frame 而不是列。请尝试以下操作:

    shapiro.test(heisenberg$HWWIchg)
    

    【讨论】:

      【解决方案3】:

      您未能指定准确的列(数据)来测试正态性。 改用这个

      shapiro.test(heisenberg$HWWIchg)
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 让我们尽量保持礼貌。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-28
        • 1970-01-01
        • 2020-09-30
        • 1970-01-01
        • 2019-11-25
        相关资源
        最近更新 更多