查看数据是否在R中正常分布

时间:2011-10-16 01:35:33

标签: r normal-distribution

有人可以帮我填写R中的以下功能:

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

8 个答案:

答案 0 :(得分:178)

正常性测试并不像大多数人认为的那样做。夏皮罗的测试,安德森达林和其他人都是零假设检验,反对正常假设。这些不应该用于确定是否使用正常的理论统计程序。事实上,它们对数据分析师几乎没有任何价值。在什么条件下我们有兴趣拒绝数据正态分布的零假设?我从未遇到过正常测试是正确的事情。当样本量很小时,甚至没有检测到与正常性的偏差,当样本量很大时,即使与正常性的最小偏差也会导致被拒绝的空值。

例如:

> 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)

enter image description here enter image description here

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

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

答案 1 :(得分:22)

我还强烈推荐SnowsPenultimateNormalityTest包中的TeachingDemos。不过,documentation of the function对你来说比测试本身更有用。在使用测试之前请仔细阅读。

答案 2 :(得分:12)

SnowsPenultimateNormalityTest当然有其优点,但您可能还想看qqnorm

X <- rlnorm(100)
qqnorm(X)
qqnorm(rnorm(100))

答案 3 :(得分:4)

考虑使用函数shapiro.test,它执行Shapiro-Wilks测试的正态性。我很高兴。

答案 4 :(得分:2)

Anderson-Darling测试也很有用。

library(nortest)
ad.test(data)

答案 5 :(得分:2)

库(DNE)

X&LT; -rnorm(1000,0,1)

is.norm(X,10,0.05)

答案 6 :(得分: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错误)

答案 7 :(得分:0)

除qqplots和Shapiro-Wilk测试外,以下方法可能有用。

定性:

  • 直方图与正常
  • 相比较
  • 与普通
  • 相比较的cdf
  • ggdensity plot
  • ggqqplot

定量:

可以使用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)

谨慎一点 - 不要盲目地进行测试。对统计数据有充分的了解将有助于您了解何时使用哪些测试以及假设检验中假设的重要性。