Проверка, нормально ли распределяются данные в R

#r #normal-distribution

#r #нормальное распределение

Вопрос:

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

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

Комментарии:

1. Не совсем понятно, о чем вы спрашиваете. Вы ищете функцию для оценки того, выглядит ли вектор чисел как случайные выборки из нормального распределения? Если да, то почему бы просто не сказать это?

Ответ №1:

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

Например:

 > 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, что приводит к невозможности отклонения значения null (что данные являются нормальными). Означает ли это, что мы должны заключить, что данные являются нормальными? (подсказка: ответ отрицательный). Отказ отклонить — это не то же самое, что принять. Это проверка гипотезы 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)
  

введите описание изображения здесь
введите описание изображения здесь

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

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

Комментарии:

1. Очень приятно. Большой последующий вопрос (на который мне еще предстоит найти удовлетворительный ответ, и я хотел бы получить простой ответ для своих студентов, но я сомневаюсь, что он есть) заключается в следующем: если кто-то использует графическую диагностику регрессии, как ( кроме подбора модели / следования процедуре, устойчивой к определенному классу нарушений [например, надежные модели, обобщенные наименьшие квадраты] и показывает, что ее результаты не отличаются интересным образом) решить, следует ли беспокоиться о конкретном типе нарушения?

2. Для линейной регрессии … 1. Не беспокойтесь о нормальности. CLT работает быстро, и если у вас есть все выборки, кроме самых маленьких, и даже отдаленно приемлемая гистограмма, то все в порядке. 2. Беспокоиться о неравных отклонениях (гетероскедастичности). Я беспокоюсь об этом до такой степени, что (почти) использую тесты HCCM по умолчанию. График местоположения масштаба даст некоторое представление о том, нарушено ли это, но не всегда. Кроме того, нет априорной причины предполагать равные отклонения в большинстве случаев. 3. Выбросы. Расстояние приготовления > 1 является разумной причиной для беспокойства. Это мои мысли (FWIW).

3. @IanFellows: вы, конечно, много написали, но вы не ответили на вопрос OP. Существует ли единственная функция, которая возвращает значение TRUE или FALSE для определения того, являются ли данные нормальными или нет?

4. @stackoverflowuser2010, вот два окончательных ответа на ваш простой вопрос: (1) Вы никогда не сможете, независимо от того, сколько данных вы собираете, окончательно определить, что они были сгенерированы из абсолютно нормального распределения. (2) Ваши данные не генерируются из точно нормального распределения (реальных данных нет).

5. @stackoverflowuser2010, это восхитительно. Мне особенно нравится личный снимок. Возможно, вы хотели попробовать поискать меня в Google, прежде чем использовать его.

Ответ №2:

Я бы также настоятельно рекомендовал SnowsPenultimateNormalityTest в TeachingDemos пакете. Однако документация функции гораздо полезнее для вас, чем сам тест. Внимательно прочитайте его перед использованием теста.

Комментарии:

1. SnowsPenultimateNormalityTest напоминает мне о комиксе thix XKCD 🙂

Ответ №3:

SnowsPenultimateNormalityTest конечно, есть свои достоинства, но вы также можете захотеть взглянуть на qqnorm .

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

Ответ №4:

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

Комментарии:

1. Обычно это зарезервировано для небольших выборок (n < 50), но может использоваться с выборками до ~ 2000, что я бы счел относительно небольшим размером выборки.

Ответ №5:

 library(DnE)
x<-rnorm(1000,0,1)
is.norm(x,10,0.05)
  

Комментарии:

1. Я не хочу быть слишком негативным, но (игнорируя все ответы более широкого контекста здесь о том, почему тестирование нормальности может быть плохой идеей), я беспокоюсь об этом пакете — тесты, которые он использует, недокументированы. Чем это отличается от тестов в базе R и в пакетах nortest и normtest (Шапиро-Уилк, Андерсон-Дарлинг, Джарк-Бера, …), все из которых очень тщательно описаны в статистической литературе?

2. потратив еще несколько секунд на просмотр пакета, я думаю, что могу сказать, что он довольно грубый. Он разделяет данные на ячейки и выполняет тест хи-квадрат; в целом, этот подход почти наверняка менее эффективен, чем более известные тесты.

Ответ №6:

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

 library(nortest)
ad.test(data)
  

Комментарии:

1. Если значение p меньше 0,05, означает ли это, что данные распределены нормально?

Ответ №7:

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

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

  • гистограмма по сравнению с нормальной
  • 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)
  

Предостережение — не применяйте тесты вслепую. Глубокое понимание статистики поможет вам понять, когда использовать какие тесты и важность допущений при проверке гипотез.

Ответ №8:

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

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