Видя, если данные нормально распределены в R - PullRequest
55 голосов
/ 16 октября 2011

Может кто-нибудь помочь мне заполнить следующую функцию в R:

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

Ответы [ 8 ]

180 голосов
/ 17 октября 2011

Нормальные тесты не делают то, что думают большинство. Тест Шапиро, Андерсон Дарлинг и другие являются тестами нулевой гипотезы ПРОТИВ предположения о нормальности. Они не должны использоваться, чтобы определить, следует ли использовать нормальные теории статистических процедур. На самом деле они практически не представляют ценности для аналитика данных. При каких условиях мы заинтересованы в том, чтобы отвергнуть нулевую гипотезу о том, что данные обычно распределяются? Я никогда не сталкивался с ситуацией, когда нормальный тест - это то, что нужно делать. Когда размер выборки небольшой, даже большие отклонения от нормальности не обнаруживаются, а когда размер вашей выборки большой, даже самое маленькое отклонение от нормальности приведет к отклоненному нулю.

Например:

> 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

Здесь мы используем t-распределение с 200 степенями свободы. Qq-plot показывает, что распределение ближе к нормальному, чем любое распределение, которое вы, вероятно, увидите в реальном мире, но тест отклоняет нормальность с очень высокой степенью достоверности.

Означает ли значительный тест против нормальности, что мы не должны использовать статистику нормальной теории в этом случае? (еще один намек: ответ нет :))

22 голосов
/ 16 октября 2011

Я также очень рекомендую SnowsPenultimateNormalityTest в пакете TeachingDemos.Тем не менее, документация для функции *1003* гораздо полезнее, чем сам тест.Внимательно прочтите его перед использованием теста.

12 голосов
/ 16 октября 2011

SnowsPenultimateNormalityTest, безусловно, имеет свои достоинства, но вы также можете посмотреть на qqnorm.

X <- rlnorm(100)
qqnorm(X)
qqnorm(rnorm(100))
4 голосов
/ 16 октября 2011

Рассмотрите возможность использования функции shapiro.test, которая выполняет тест Шапиро-Уилкса на нормальность.Я был счастлив с этим.

2 голосов
/ 16 ноября 2014

библиотека (DNe)

х <-rnorm (1000,0,1) </p>

is.norm (х, 10,0.05)

2 голосов
/ 16 октября 2011

Также полезен тест Андерсона-Дарлинга.

library(nortest)
ad.test(data)
0 голосов
/ 14 марта 2018

В дополнение к qqplots и тесту Шапиро-Уилка могут быть полезны следующие методы.

Качественная:

  • гистограмма по сравнению с нормальной
  • cdf по сравнению с обычным
  • Большой участок
  • 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)

Слово предостережения - не применяйте тесты вслепую. Точное понимание статистики поможет вам понять, когда использовать какие тесты и насколько важны предположения при проверке гипотез.

0 голосов
/ 11 октября 2016

когда вы выполняете тест, у вас всегда есть вероятность отклонить нулевую гипотезу, когда она верна.

См. Следующий код 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)

...