59

有人可以帮我在R中填写以下函数:

#data is a single vector of decimal values
normally.distributed <- function(data) {
if(data is normal)
return(TRUE)
else
return(NO)
}
4

8 回答 8

187

正态性测试并没有做大多数人认为他们做的事情。Shapiro 检验、Anderson Darling 和其他检验是针对正态假设的零假设检验。这些不应用于确定是否使用正常的理论统计程序。事实上,它们对数据分析师几乎没有价值。在什么情况下,我们有兴趣拒绝数据呈正态分布的原假设?我从来没有遇到过正常测试是正确的事情的情况。当样本量较小时,即使是与正态性的大偏差也不会被检测到,而当您的样本量很大时,即使是与正态性的最小偏差也会导致被拒绝的空值。

例如:

> set.seed(100)
> x <- rbinom(15,5,.6)
> shapiro.test(x)

    Shapiro-Wilk normality test

data:  x 
W = 0.8816, p-value = 0.0502

> x <- rlnorm(20,0,.4)
> shapiro.test(x)

    Shapiro-Wilk normality test

data:  x 
W = 0.9405, p-value = 0.2453

因此,在这两种情况下(二项式和对数正态变量),p 值 > 0.05 导致无法拒绝空值(数据正常)。这是否意味着我们要得出数据正常的结论?(提示:答案是否定的)。不拒绝不等于接受。这是假设检验 101。

但是更大的样本量呢?让我们以分布非常接近正常的情况为例。

> library(nortest)
> x <- rt(500000,200)
> ad.test(x)

    Anderson-Darling normality test

data:  x 
A = 1.1003, p-value = 0.006975

> qqnorm(x)

在此处输入图像描述 在此处输入图像描述

在这里,我们使用具有 200 个自由度的 t 分布。qq 图显示该分布比您在现实世界中可能看到的任何分布都更接近正态,但该测试以非常高的置信度拒绝正态性。

对正态性的显着检验是否意味着在这种情况下我们不应该使用正态理论统计?(另一个提示:答案是否定的:))

于 2011-10-17T00:58:07.830 回答
25

我也强烈推荐包装SnowsPenultimateNormalityTest中的。TeachingDemos不过,函数的文档对您来说比测试本身有用得多。使用测试前请仔细阅读。

于 2011-10-16T02:53:06.390 回答
13

SnowsPenultimateNormalityTest当然有它的优点,但你可能也想看看qqnorm

X <- rlnorm(100)
qqnorm(X)
qqnorm(rnorm(100))
于 2011-10-16T03:49:09.740 回答
5

考虑使用shapiro.test执行 Shapiro-Wilks 正态性检验的函数。我对此很满意。

于 2011-10-16T01:39:20.413 回答
3
library(DnE)
x<-rnorm(1000,0,1)
is.norm(x,10,0.05)
于 2014-11-16T03:23:34.500 回答
2

Anderson-Darling 检验也很有用。

library(nortest)
ad.test(data)
于 2011-10-16T19:07:58.017 回答
1

除了 qqplots 和 Shapiro-Wilk 检验,以下方法可能有用。

定性:

  • 直方图与正常比较
  • cdf与正常相比
  • gg密度图
  • ggqq图

定量:

可以使用 R 中的以下内容生成定性方法:

library("ggpubr")
library("car")

h <- hist(data, breaks = 10, density = 10, col = "darkgray") 
xfit <- seq(min(data), max(data), length = 40) 
yfit <- dnorm(xfit, mean = mean(data), sd = sd(data)) 
yfit <- yfit * diff(h$mids[1:2]) * length(data) 
lines(xfit, yfit, col = "black", lwd = 2)

plot(ecdf(data), main="CDF")
lines(ecdf(rnorm(10000)),col="red")

ggdensity(data)

ggqqplot(data)

提醒一句——不要盲目地应用测试。对统计数据有深入的了解将帮助您了解何时使用哪些测试以及假设在假设测试中的重要性。

于 2018-03-13T23:13:18.470 回答
0

当您执行测试时,您有可能在零假设为真时拒绝它。

请参阅下一个 R 代码:

p=function(n){
  x=rnorm(n,0,1)
  s=shapiro.test(x)
  s$p.value
}

rep1=replicate(1000,p(5))
rep2=replicate(1000,p(100))
plot(density(rep1))
lines(density(rep2),col="blue")
abline(v=0.05,lty=3)

该图显示,无论您的样本量是小还是大,当原假设为真时,您有 5% 的机会拒绝原假设(I 类错误)

于 2016-10-11T03:32:48.927 回答