Является ли Шапиро-Уилк лучшим тестом на нормальность? Почему это может быть лучше, чем другие тесты, такие как Андерсон-Дарлинг?

24

Я читал где-то в литературе, что тест Шапиро – Вилка считается лучшим тестом нормальности, потому что для данного уровня значимости, , вероятность отклонения нулевой гипотезы, если она ложна, выше, чем в случае другого тесты на нормальность.α

Не могли бы вы объяснить мне, используя математические аргументы, если это возможно, как именно это работает по сравнению с некоторыми другими тестами нормальности (скажем, тест Андерсона – Дарлинга)?

синтагма
источник
4
Обратите внимание, что мощность зависит от того, как нулевая гипотеза ложна, что для общего теста соответствия пригодности может быть любым из бесчисленных способов. Не проверив, я бы поспорил, что каждый из общих тестов нормальности наиболее эффективен против определенных альтернатив.
Scortchi - Восстановить Монику
5
Возможно, это не тот ответ, который вы ищете, но я бы сказал, что лучшим тестом нормальности является график нормальной вероятности, то есть график квантиль-квантиль наблюдаемых значений по сравнению с нормальными квантилями. Тест Шапиро-Уилка действительно часто рекомендуется, но он не может точно сказать, чем ваши данные отличаются от нормальных. Часто несущественные различия отмечаются тестом, потому что они квалифицируются как значимые для больших размеров выборки, и противоположная проблема также может укусить вас.
Ник Кокс

Ответы:

17

Сначала общее замечание: обратите внимание, что критерий Андерсона-Дарлинга предназначен для полностью определенных распределений, а критерий Шапиро-Уилка для нормалей с любым средним и дисперсией. Однако, как отмечалось в D'Agostino & Stephens Андерсон-Дарлинг очень удобно приспосабливается к случаю оценки, сродни (но сходится быстрее и изменяется таким образом, что с ним проще работать, чем с Критерий Лилифорса для случая Колмогорова-Смирнова). В частности, по нормали, при , таблицы асимптотического значения может быть использован (не проверяйте пригодность для n <5). n=5 A = A 2 ( 1 + 4[1]Nзнак равно5A*знак равноA2(1+4N-25N2)

Я читал где-то в литературе, что тест Шапиро – Вилка считается лучшим тестом нормальности, потому что для данного уровня значимости α вероятность отклонения нулевой гипотезы, если она ложна, выше, чем в случае другой нормальности. тесты.

Как общее утверждение, это неверно.

Какие тесты нормальности «лучше», зависит от того, какие классы альтернатив интересуют вас. Одна из причин популярности Шапиро-Уилка состоит в том, что он имеет очень хорошую силу при широком диапазоне полезных альтернатив. Это встречается во многих исследованиях силы, и обычно работает очень хорошо, но это не всегда лучше.

Это довольно легко найти альтернативы, под которыми он менее мощный.

Например, по сравнению с альтернативами с легкими хвостами он часто имеет меньшую мощность, чем изучаемый диапазон (сравните их в тесте нормальности на единообразных данных Например, при тест, основанный на имеет мощность около 63% по сравнению с чуть более 38% для Shapiro Wilk). n=30ед.Uзнак равноМаксимум(Икс)-мин(Икс)sd(Икс)Nзнак равно30U

Андерсон-Дарлинг (с поправкой на оценку параметров) работает лучше по двойной экспоненте. Момент асимметрии лучше против некоторых косых альтернатив.

Не могли бы вы объяснить мне, используя математические аргументы, если это возможно, как именно это работает по сравнению с некоторыми другими тестами нормальности (скажем, тест Андерсона – Дарлинга)?

Я объясню в общих чертах (если вы хотите получить более конкретные подробности, оригинальными статьями и некоторыми из последующих статей, в которых они обсуждаются, будет лучшим выбором):

Рассмотрим более простой, но тесно связанный тест - Shapiro-Francia; фактически это функция корреляции между статистикой заказа и ожидаемой статистикой заказа при нормальности (и, как таковая, довольно прямая мера «насколько прямая линия» в нормальном графике QQ). Насколько я помню, Shapiro-Wilk является более мощным, потому что он также учитывает ковариации между статистикой порядка, создавая лучшую линейную оценку из графика QQ, который затем масштабируется на . Когда распределение далеко от нормального, отношение не близко к 1.сσs

Для сравнения, Андерсон-Дарлинг, как и Колмогоров-Смирнов и Крамер-фон Мизес, основан на эмпирическом CDF. В частности, он основан на взвешенных отклонениях между ECDF и теоретическим ECDF (взвешивание для дисперсии делает его более чувствительным к отклонениям в хвосте).

Тест Шапиро и Чена (1995 г.) (основанный на расстояниях между статистиками порядков) часто демонстрирует немного большую мощность, чем Шапиро-Уилк (но не всегда); они часто работают очень похожим образом.[2]

-

Используйте Shapiro Wilk, потому что он часто мощный, широко доступный, и многие знакомы с ним (избавляя от необходимости подробно объяснять, что это такое, если вы используете его в газете) - просто не используйте его в иллюзии, что он «лучший тест нормальности». Нет лучшего теста на нормальность.

[1]: Д'Агостино, Р.Б. и Стефенс, Массачусетс (1986),
«Методы совершенства» ,
Марсель Деккер, Нью-Йорк.

[2]: Чен Л. и Шапиро С. (1995)
«Альтернативный тест на нормальность, основанный на нормированных расстояниях».
Журнал статистических расчетов и моделирования 53 , 269-287.

Glen_b - Восстановить Монику
источник
Мой одноклассник сказал мне: «Если размер выборки> 50, вы должны использовать Колмогорова-Смирнова». Это верно?
Kittygirl
Нет. Насколько я помню, оригинальная работа Шапиро и Уилка 1965 года дала только требуемые константы ( ), используемые в линейной оценке для до но это было более полувека назад. С тех пор все немного изменилось. Даже без этого, Shapiro Francia или Anderson-Darling (также с поправкой на оценку параметров) обычно являются лучшим выбором; они часто имеют значительно меньшую мощность по сравнению с обычно интересными альтернативами. (& если вы оцениваете среднее значение и среднеквадратичное отклонение по выборке, вы не просто выполняете тест Колмогорова-Смирнова, а скорее тест σ н 50aяσN50
Лиллифорса
Короче говоря, был короткий период в несколько лет после 1967 года (первоначальная публикация работы Лиллифорса), где он мог быть оправданным советом, но не долгое время с тех пор
Glen_b -Reinstate Monica
Когда размер выборки> 5000, запуск shapiro.testв R приведет к ошибке. sample size must be between 3 and 5000Затем какой еще тест следует использовать?
Kittygirl
1. При больших значениях n вы почти всегда отклоняете любую простую модель распределения (даже если это вполне подходящее приближение); может быть более целесообразно сделать что-то еще (почему вы проверяете нормальность?) 2. На самом деле это не вопрос «следует»; нет единственного качества теста, который всегда лучше, чем любой другой. Просто так получилось, что Шапиро Вилк достаточно хорош. Однако подходящей альтернативой при больших n является тест Шапиро-Франсии. Если вы можете найти реализацию теста Чена-Шапиро при больших значениях n (при условии, что для проверки есть все основания), подумайте об этом.
Glen_b
12

Ясно, что сравнение, которое вы прочитали, не включало SnowsPenultimateNormalityTest ( http://cran.r-project.org/web/packages/TeachingDemos/TeachingDemos.pdf ), поскольку оно имеет максимально возможную мощность среди всех альтернатив. Таким образом, это должно считаться «Лучшим», если сила является единственным соображением (обратите внимание, что мои мнения явно предвзяты, но задокументированы в ссылке / документации).

Тем не менее, я согласен с замечанием Ника Кокса о том, что лучший тест - это скорее сюжет, чем формальный тест, поскольку вопрос «достаточно нормальный» гораздо важнее, чем «совершенно нормальный». Если вам нужен содержательный тест, я бы предложил объединить график qq с методологией, приведенной в этой статье:

Буя, А., Кук, Д. Хофманн, Х., Лоуренс, М. Ли, Э.-К., Суэйн, Д.Ф. и Уикхем, Х. (2009) Статистический вывод для анализа поисковых данных и диагностики моделей Фил. Сделка R. Soc. A 2009 367, 4361-4383 doi: 10.1098 / rsta.2009.0120

Одной из реализаций этого является vis.testфункция в пакете TeachingDemos для R (тот же пакет, что и SnowsPenultimateNormalityTest).

Грег Сноу
источник
1
Я согласен с мнением, но взгляд на графики QQ не является большим решением, если кто-то хочет делать что-то с более чем 10-20 переменными.
Эндрю М
Мы печатаем графики QQ в дополнение к тестам на нормальность. Они не эксклюзивные, а дополнительные инструменты.
Аксакал
2
@ Andrew M Итак, просматриваете результаты 100 или 1000 или около того Shapiro-Wilk или других тестов, что вы предпочитаете? Нетрудно автоматизировать просмотр графиков QQ, скажем, 25 за раз. Часто достаточно взгляда, чтобы увидеть (буквально) реальную проблему.
Ник Кокс
10

Я опаздываю на вечеринку, но отвечу ссылками на опубликованные рецензируемые исследования. Причина, по которой я не отвечаю «да» или «нет» на вопрос ОП, заключается в том, что он сложнее, чем может показаться. Не существует ни одного теста, который был бы самым мощным для образцов, поступающих из любого распределения с выбросами или без них. Выбросы могут сильно уменьшить мощность одного теста и увеличить для другого. Некоторые тесты работают лучше, когда образец имеет симметричное распределение и т. Д.

  • Генри С. Тод, Тестирование на нормальность , 2002 - Это самая полная книга на эту тему. Если бы мне пришлось придумать простой ответ, тогда SW не был бы сильнее, чем AD во всех случаях. Вот две выдержки для вашего удовольствия от чтения.

Из раздела 7.1.5: Исходя из мощности, выбор теста напрямую связан с доступной информацией или сделанными предположениями относительно альтернативы. Чем конкретнее альтернатива, тем более конкретным и более мощным будет тест; это также приведет к самым надежным рекомендациям.

а также

Кs2A2

  • Ромао, Ксавье, Раймундо Дельгадо и Анибал Коста. «Эмпирическое сравнение мощности одномерных тестов на соответствие нормам». Журнал статистических расчетов и моделирования 80,5 (2010): 545-591. Это самое последнее опубликованное исследование по теме, которую я знаю.

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

Если вы действительно хотите свести их исследования к да / нет, тогда ответ - ДА. Тест Шапиро-Уилкса в большинстве случаев выглядит несколько более мощным, чем тест Андерсона-Дарлинга. Они рекомендуют тест Шапиро Уилка, если вы не имеете в виду конкретный альтернативный дистрибутив. Однако, если вы заинтересованы в этом вопросе, статья стоит прочитать. По крайней мере, посмотрите на таблицы.

  • Эдит Сейер, Тесты нормальности: Сравнение мощности , в Международной энциклопедии статистической науки, 2014 - обзор опубликованных исследований по этому вопросу. Опять же, ответ зависит от образца и ваших знаний об альтернативном распределении, но тривиальным ответом будет ДА, Шапиро-Уилк, как правило, более мощный, но не всегда.

  • Генри С. Тод, Тесты нормальности , в Международной энциклопедии статистических наук, 2014 - Описание популярных тестов нормальности. Его рекомендация:

A2

Теперь, это было все об одномерных тестах. Thode (2002) также имеет многовариантный тест, данные с цензурой, нормальные смеси, тестирование в присутствии выбросов и многое другое.

Аксакал
источник
9

Более серьезный ответ на этот вопрос и особенно постоянный интерес @ silverfish. Один из подходов к ответам на подобные вопросы - провести несколько симуляций для сравнения. Ниже приведен некоторый R-код, который моделирует данные при различных альтернативах и выполняет несколько тестов нормальности и сравнивает мощность (и доверительный интервал для мощности, поскольку мощность оценивается посредством моделирования). Я несколько изменил размеры выборки, потому что было неинтересно, когда многие из степеней были близки к 100% или 5%, я нашел круглые числа, которые дали мощности около 80%. Любой желающий может легко взять этот код и изменить его для разных предположений, разных альтернатив и т. Д.

Вы можете видеть, что есть альтернативы, для которых некоторые тесты работают лучше, а другие - хуже. Важным вопросом является то, какие альтернативы являются наиболее реалистичными для ваших научных вопросов / области. Это действительно должно сопровождаться моделированием влияния типов ненормальностей, представляющих интерес, на другие выполняемые тесты. Некоторые из этих типов ненормальностей сильно влияют на другие обычные тесты, другие не сильно влияют на них.

> library(nortest)
> 
> simfun1 <- function(fun=function(n) rnorm(n), n=250) {
+   x <- fun(n)
+   c(sw=shapiro.test(x)$p.value, sf=sf.test(x)$p.value, ad=ad.test(x)$p.value,
+     cvm=cvm.test(x)$p.value, lillie=lillie.test(x)$p.value, 
+     pearson=pearson.test(x)$p.value, snow=0)
+ }
> 
> ### Test size using null hypothesis near true
> 
> out1 <- replicate(10000, simfun1())
> apply(out1, 1, function(x) mean(x<=0.05))
     sw      sf      ad     cvm  lillie pearson    snow 
 0.0490  0.0520  0.0521  0.0509  0.0531  0.0538  1.0000 
> apply(out1, 1, function(x) prop.test(sum(x<=0.05),length(x))$conf.int)  #$
             sw         sf         ad        cvm     lillie    pearson      snow
[1,] 0.04489158 0.04776981 0.04786582 0.04671398 0.04882619 0.04949870 0.9995213
[2,] 0.05345887 0.05657820 0.05668211 0.05543493 0.05772093 0.05844785 1.0000000
> 
> ### Test again with mean and sd different
> 
> out2 <- replicate(10000, simfun1(fun=function(n) rnorm(n,100,5)))
> apply(out2, 1, function(x) mean(x<=0.05))
     sw      sf      ad     cvm  lillie pearson    snow 
 0.0482  0.0513  0.0461  0.0477  0.0515  0.0506  1.0000 
> apply(out2, 1, function(x) prop.test(sum(x<=0.05),length(x))$conf.int)  #$
             sw         sf         ad        cvm     lillie    pearson      snow
[1,] 0.04412478 0.04709785 0.04211345 0.04364569 0.04728982 0.04642612 0.9995213
[2,] 0.05262633 0.05585073 0.05043938 0.05210583 0.05605860 0.05512303 1.0000000
> 
> #### now for the power under different forms of non-normality
> 
> ## heavy tails, t(3)
> rt3 <- function(n) rt(n, df=3)
> 
> out3 <- replicate(10000, simfun1(fun=rt3, n=75))
There were 50 or more warnings (use warnings() to see the first 50)
> round(apply(out3, 1, function(x) mean(x<=0.05, na.rm=TRUE)),3)
     sw      sf      ad     cvm  lillie pearson    snow 
  0.788   0.831   0.756   0.726   0.624   0.440   1.000 
> round(apply(out3, 1, function(x){ 
+ prop.test(sum(x<=0.05,na.rm=TRUE),sum(!is.na(x)))$conf.int),3) }  #$
        sw    sf    ad   cvm lillie pearson snow
[1,] 0.780 0.824 0.748 0.717  0.614   0.431    1
[2,] 0.796 0.838 0.765 0.734  0.633   0.450    1
> 
> 
> ## light tails, uniform
> u <- function(n) runif(n)
> 
> out4 <- replicate(10000, simfun1(fun=u, n=65))
> round(apply(out4, 1, function(x) mean(x<=0.05, na.rm=TRUE)),3)
     sw      sf      ad     cvm  lillie pearson    snow 
  0.906   0.712   0.745   0.591   0.362   0.270   1.000 
> round(apply(out4, 1, function(x){ 
+ prop.test(sum(x<=0.05,na.rm=TRUE),sum(!is.na(x)))$conf.int),3) }  #$
        sw    sf    ad   cvm lillie pearson snow
[1,] 0.900 0.703 0.737 0.581  0.353   0.261    1
[2,] 0.911 0.720 0.754 0.600  0.372   0.279    1
> 
> ## double exponential, Laplace
> de <- function(n) sample(c(-1,1), n, replace=TRUE) * rexp(n)
> 
> out5 <- replicate(10000, simfun1(fun=de, n=100))
> round(apply(out5, 1, function(x) mean(x<=0.05, na.rm=TRUE)),3)
     sw      sf      ad     cvm  lillie pearson    snow 
  0.796   0.844   0.824   0.820   0.706   0.477   1.000 
> round(apply(out5, 1, function(x){ 
+ prop.test(sum(x<=0.05,na.rm=TRUE),sum(!is.na(x)))$conf.int),3) }  #$
        sw    sf    ad   cvm lillie pearson snow
[1,] 0.788 0.837 0.817 0.813  0.697   0.467    1
[2,] 0.804 0.851 0.832 0.828  0.715   0.486    1
> 
> ## skewed, gamma(2,2)
> g22 <- function(n) rgamma(n,2,2)
> 
> out6 <- replicate(10000, simfun1(fun=g22, n=50))
Warning message:
In cvm.test(x) :
  p-value is smaller than 7.37e-10, cannot be computed more accurately
> round(apply(out6, 1, function(x) mean(x<=0.05, na.rm=TRUE)),3)
     sw      sf      ad     cvm  lillie pearson    snow 
  0.954   0.930   0.893   0.835   0.695   0.656   1.000 
> round(apply(out6, 1, function(x){ 
+ prop.test(sum(x<=0.05,na.rm=TRUE),sum(!is.na(x)))$conf.int),3) }  #$
        sw    sf    ad   cvm lillie pearson snow
[1,] 0.950 0.925 0.886 0.827  0.686   0.646    1
[2,] 0.958 0.935 0.899 0.842  0.704   0.665    1
> 
> ## skewed, gamma(2,2)
> g99 <- function(n) rgamma(n,9,9)
> 
> out7 <- replicate(10000, simfun1(fun=g99, n=150))
> round(apply(out7, 1, function(x) mean(x<=0.05, na.rm=TRUE)),3)
     sw      sf      ad     cvm  lillie pearson    snow 
  0.844   0.818   0.724   0.651   0.526   0.286   1.000 
> round(apply(out7, 1, function(x){ 
+ prop.test(sum(x<=0.05,na.rm=TRUE),sum(!is.na(x)))$conf.int),3) }  #$
        sw    sf    ad   cvm lillie pearson snow
[1,] 0.836 0.810 0.715 0.642  0.516   0.277    1
[2,] 0.851 0.826 0.732 0.660  0.536   0.294    1
> 
> ## tails normal, middle not
> mid <- function(n) {
+   x <- rnorm(n)
+   x[ x > -0.5 & x < 0.5 ] <- 0
+   x
+ }
> 
> out9 <- replicate(10000, simfun1(fun=mid, n=30))
Warning messages:
1: In cvm.test(x) :
  p-value is smaller than 7.37e-10, cannot be computed more accurately
2: In cvm.test(x) :
  p-value is smaller than 7.37e-10, cannot be computed more accurately
> round(apply(out9, 1, function(x) mean(x<=0.05, na.rm=TRUE)),3)
     sw      sf      ad     cvm  lillie pearson    snow 
  0.374   0.371   0.624   0.739   0.884   0.948   1.000 
> round(apply(out9, 1, function(x){ 
+ prop.test(sum(x<=0.05,na.rm=TRUE),sum(!is.na(x)))$conf.int),3) }  #$
        sw    sf    ad   cvm lillie pearson snow
[1,] 0.365 0.362 0.614 0.730  0.878   0.943    1
[2,] 0.384 0.381 0.633 0.747  0.890   0.952    1
> 
> ## mixture on variance
> mv <- function(n, p=0.1, sd=3) {
+   rnorm(n,0, ifelse(runif(n)<p, sd, 1))
+ }
> 
> out10 <- replicate(10000, simfun1(fun=mv, n=100))
Warning message:
In cvm.test(x) :
  p-value is smaller than 7.37e-10, cannot be computed more accurately
> round(apply(out10, 1, function(x) mean(x<=0.05, na.rm=TRUE)),3)
     sw      sf      ad     cvm  lillie pearson    snow 
  0.800   0.844   0.682   0.609   0.487   0.287   1.000 
> round(apply(out10, 1, function(x){ 
+ prop.test(sum(x<=0.05,na.rm=TRUE),sum(!is.na(x)))$conf.int),3) }  #$
        sw    sf    ad   cvm lillie pearson snow
[1,] 0.792 0.837 0.673 0.599  0.477   0.278    1
[2,] 0.808 0.851 0.691 0.619  0.497   0.296    1
> 
> ## mixture on mean
> mm <- function(n, p=0.3, mu=2) {
+   rnorm(n, ifelse(runif(n)<p, mu, 0), 1)
+ }
> 
> out11 <- replicate(10000, simfun1(fun=mm, n=400))
> round(apply(out11, 1, function(x) mean(x<=0.05, na.rm=TRUE)),3)
     sw      sf      ad     cvm  lillie pearson    snow 
  0.776   0.710   0.808   0.788   0.669   0.354   1.000 
> round(apply(out11, 1, function(x){ 
+ prop.test(sum(x<=0.05,na.rm=TRUE),sum(!is.na(x)))$conf.int),3) }  #$
        sw    sf    ad   cvm lillie pearson snow
[1,] 0.768 0.701 0.801 0.780  0.659   0.344    1
[2,] 0.784 0.719 0.816 0.796  0.678   0.363    1
Грег Сноу
источник
Спасибо за добавление этого ответа, который является хорошим дополнением к вашему предыдущему. Никакого унижения не было предназначено для вашего другого ответа, который является одним из моих любимых на SE!
Серебряная рыбка
1
Я позволил себе редактировать твой код, чтобы добавить форматирование кода и подогнать все под окно, Грег. Я думаю, что так будет легче читать, но если вам это не нравится, откатитесь назад с моими извинениями.
gung - Восстановить Монику