查看數據是否在R中正常分佈



normal-distribution (6)

有人可以幫我填寫R中的以下功能:

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

Anderson-Darling測試也很有用。

library(nortest)
ad.test(data)

SnowsPenultimateNormalityTest肯定有其優點,但你可能也想看看qqnorm

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

我還強烈推薦在TeachingDemos包中使用SnowsPenultimateNormalityTest 。 但是對於您來說, 函數文檔比測試本身更有用。 使用測試前請仔細閱讀。


正態性測試並不像大多數人認為的那樣做。 夏皮羅的測試,安德森達林和其他人都是零假設檢驗,反對正常假設。 這些不應用於確定是否使用正常的理論統計程序。 實際上,它們對數據分析師幾乎沒有任何價值。 在什麼條件下我們有興趣拒絕數據正態分佈的零假設? 我從未遇到過正常測試是正確的事情。 當樣本量很小時,甚至沒有檢測到與正常性的偏差,當樣本量很大時,即使與正常性的最小偏差也會導致被拒絕的空值。

例如:

> 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圖顯示分佈比您在現實世界中可能看到的任何分佈更接近正常,但是測試以非常高的置信度拒絕正態性。

對正態性的重大檢驗是否意味著在這種情況下我們不應該使用正態理論統計量? (另一個提示:答案是否:))


考慮使用函數shapiro.test ,它執行Shapiro-Wilks測試的正常性。 我很高興。


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

定性:

  • 直方圖與正常相比
  • cdf與正常相比
  • ggdensity情節
  • 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)

提醒一句 - 不要盲目地進行測試。 對統計數據有充分的了解將有助於您了解何時使用哪些測試以及假設檢驗中假設的重要性。





normal-distribution