Shapiro – Wilk é o melhor teste de normalidade? Por que poderia ser melhor do que outros testes como o Anderson-Darling?

24

Li em algum lugar na literatura que o teste de Shapiro-Wilk é considerado o melhor teste de normalidade porque, para um dado nível de significância, α , a probabilidade de rejeitar a hipótese nula se falsa é maior do que no caso da outra normalidade testes.

Você poderia me explicar, usando argumentos matemáticos, se possível, como exatamente funciona em comparação com alguns dos outros testes de normalidade (por exemplo, o teste de Anderson-Darling)?

sintagma
fonte
4
Observe que o poder depende da maneira pela qual a hipótese nula é falsa, que para um teste de qualidade do ajuste de uso geral pode ser uma das inúmeras maneiras. Sem ter verificado, eu ainda apostaria que cada um dos testes de normalidade comuns é mais poderoso contra certas alternativas.
Scortchi - Restabelece Monica
5
Talvez não seja a resposta que você procura, mas eu diria que o melhor teste de normalidade é um gráfico de probabilidade normal, ou seja, um gráfico quantil-quantil de valores observados versus quantis normais. O teste Shapiro-Wilk é de fato frequentemente recomendado, mas não pode dizer exatamente como seus dados diferem do normal. Frequentemente, diferenças sem importância são sinalizadas pelo teste, porque se qualificam como significativas para amostras de tamanho grande, e o problema oposto também pode incomodá-lo.
Nick Cox

Respostas:

17

Primeiro um comentário geral: observe que o teste de Anderson-Darling é para distribuições completamente especificadas, enquanto o Shapiro-Wilk é para normais com qualquer média e variação. No entanto, como observado em D'Agostino & Stephens [ 1 ], o Anderson-Darling se adapta de maneira muito conveniente ao caso de estimativa, semelhante a (mas converge mais rapidamente e é modificado de uma maneira mais simples de lidar do que o teste de Lilliefors para o caso Kolmogorov-Smirnov). Especificamente, no normal, por n = 5 , tabelas do valor assintótico de A = A 2 ( 1 + 4[1]n=5A=A2(1+4n25n2) pode ser usado (não teste a qualidade do ajuste para n <5).

Li em algum lugar na literatura que o teste de Shapiro-Wilk é considerado o melhor teste de normalidade porque, para um dado nível de significância, α, a probabilidade de rejeitar a hipótese nula se falsa é maior do que no caso da outra normalidade testes.

Como uma declaração geral, isso é falso.

Quais testes de normalidade são "melhores" dependem de quais classes de alternativas você está interessado. Uma das razões pelas quais o Shapiro-Wilk é popular é que ele tende a ter um poder muito bom sob uma ampla variedade de alternativas úteis. Ele aparece em muitos estudos de poder e geralmente funciona muito bem, mas não é universalmente melhor.

É muito fácil encontrar alternativas sob as quais é menos poderoso.

Por exemplo, contra alternativas de cauda leve, geralmente tem menos potência do que o intervalo estudado (compare-os em um teste de normalidade em dados uniformes, por exemplo - emn=30, um teste baseado emutem poder de cerca de 63% em comparação com pouco mais de 38% para o Shapiro Wilk).você=max(x)-min(x)sd(x)n=30você

O Anderson-Darling (ajustado para estimativa de parâmetros) se sai melhor no exponencial duplo. A inclinação do momento é melhor em relação a algumas alternativas de inclinação.

Você poderia me explicar, usando argumentos matemáticos, se possível, como exatamente funciona em comparação com alguns dos outros testes de normalidade (por exemplo, o teste de Anderson-Darling)?

Explicarei em termos gerais (se você quiser detalhes mais específicos, os trabalhos originais e alguns dos trabalhos posteriores que os discutem seriam sua melhor aposta):

Considere um teste mais simples, mas estreitamente relacionado, o Shapiro-Francia; é efetivamente uma função da correlação entre as estatísticas da ordem e as estatísticas da ordem esperada sob normalidade (e, como tal, uma medida bastante direta de "quão reta é a linha" no gráfico QQ normal). Pelo que me lembro, o Shapiro-Wilk é mais poderoso porque também leva em consideração as covariâncias entre as estatísticas da ordem, produzindo um melhor estimador linear de partir do gráfico QQ, que é então escalado por s . Quando a distribuição está longe do normal, a proporção não é próxima de 1.σs

Em comparação, o Anderson-Darling, como o Kolmogorov-Smirnov e o Cramér-von Mises, baseia-se no CDF empírico. Especificamente, ele se baseia em desvios ponderados entre o ECDF e o ECDF teórico (a ponderação por variação torna mais sensível aos desvios na cauda).

O teste de Shapiro e Chen [ 2 ] (1995) (baseado em espaçamentos entre estatísticas de ordens) geralmente exibe um pouco mais de poder do que o Shapiro-Wilk (mas nem sempre); eles costumam ter um desempenho muito semelhante.[2]

-

Use o Shapiro Wilk porque ele é frequentemente poderoso, amplamente disponível e muitas pessoas estão familiarizadas com ele (removendo a necessidade de explicar em detalhes o que é se você o usar em um artigo) - apenas não o use com a ilusão de que é "o melhor teste de normalidade". Não há um melhor teste de normalidade.

[1]: D'Agostino, RB e Stephens, MA (1986)
Técnicas de ajuste de qualidade ,
Marcel Dekker, Nova York.

[2]: Chen, L. e Shapiro, S. (1995)
"Um teste alternativo de normalidade com base em espaçamentos normalizados".
Jornal de Computação Estatística e Simulação 53 , 269-287.

Glen_b -Reinstate Monica
fonte
Meu colega me disse: "Se o tamanho da amostra for> 50, você deve usar Kolmogorov-Smirnov". Isso está correto?
kittygirl 4/04
umaEuσn50.
Em suma, houve um breve período de alguns anos após 1967 (a publicação inicial do trabalho de Lilliefors) em que poderia ter sido um conselho justificável, mas não faz muito tempo desde então
Glen_b -Reinstate Monica
Quando o tamanho da amostra for superior a 5000, a execução shapiro.testem R receberá um erro. sample size must be between 3 and 5000Então, qual outro teste deve ser usado?
kittygirl 4/04
1. Em geral, você quase sempre rejeita qualquer modelo distributivo simples (mesmo quando é uma aproximação bastante adequada); pode ser mais aconselhável fazer outra coisa (por que você está testando a normalidade?) 2. Não é realmente uma questão de "deveria"; não existe um único teste que seja sempre melhor que qualquer outro. Acontece que o Shapiro Wilk é razoavelmente bom. No entanto, uma alternativa adequada em geral n é o teste de Shapiro-Francia. Se você puder encontrar uma implementação do teste de Chen-Shapiro em geral n (assumindo que haja um bom motivo para testar), considere isso.
Glen_b -Reinstate Monica 04/04
12

Claramente, a comparação que você leu não incluiu SnowsPenultimateNormalityTest ( http://cran.r-project.org/web/packages/TeachingDemos/TeachingDemos.pdf ), pois possui a maior potência possível em todas as alternativas. Portanto, deve ser considerado "Melhor" se o poder for a única consideração (observe que minhas opiniões são claramente tendenciosas, mas documentadas no link / documentação).

No entanto, concordo com o comentário de Nick Cox de que o melhor teste é um enredo, e não um teste formal, já que a pergunta "Normal o suficiente" é muito mais importante do que "Exatamente normal". Se você quiser um teste significativo, sugiro combinar o gráfico qq com a metodologia deste artigo:

Buja, A., Cook, D. Hofmann, H., Lawrence, M. Lee, E.-K., Swayne, DF e Wickham, H. (2009) Inferência Estatística para análise exploratória de dados e diagnóstico de modelos Phil. Trans. R. Soc. A 2009 367, 4361-4383 doi: 10.1098 / rsta.2009.0120

Uma implementação disso é a vis.testfunção no pacote TeachingDemos para R (mesmo pacote que SnowsPenultimateNormalityTest).

Greg Snow
fonte
11
Concordo com o sentimento, mas olhar para os gráficos de QQ não é uma solução muito grande se alguém quiser fazer muito de qualquer coisa com mais de 10 a 20 variáveis.
Andrew M
Imprimimos gráficos de QQ, além de testes de normalidade. Eles não são exclusivos, mas ferramentas complementares.
Aksakal
2
@ Andrew M Então, está olhando através dos resultados de 100 ou 1000 ou mais Shapiro-Wilk ou outros testes o que você prefere? Não é difícil automatizar a análise de gráficos de QQ, digamos 25 de cada vez. Muitas vezes, basta uma olhada para ver (literalmente) um problema real.
Nick Cox
10

Estou atrasado para a festa, mas responderei com referências à pesquisa publicada por pares. A razão pela qual eu não respondo Sim / Não à pergunta do OP é que ela é mais complicada do que parece. Não há um teste que seja o mais poderoso para amostras provenientes de qualquer distribuição com ou sem discrepâncias. Os valores discrepantes podem diminuir drasticamente o poder de um teste e aumentar para outro. Alguns testes funcionam melhor quando a amostra é proveniente de distribuição simétrica etc.

  • Henry C. Thode, Testing for Normality , 2002 - Este é o livro mais abrangente sobre o assunto. Se eu tivesse que confundir uma resposta simples, o SW não é mais poderoso que o AD em todos os casos. Aqui estão dois trechos para o seu prazer de ler.

Da seção 7.1.5: Com base no poder, a escolha do teste está diretamente relacionada às informações disponíveis ou às suposições feitas sobre a alternativa. Quanto mais específica a alternativa, mais específico e mais poderoso será o teste; isso também resultará nas recomendações mais confiáveis.

e

Um teste de assimetria e curtose das articulações, como Ks2 fornece alta potência contra uma ampla gama de alternativas, assim como a Anderson-Darling UMA2. Wilk-Shapiro W mostrou poder relativamente alto entre alternativas simétricas inclinadas e de cauda curta quando comparado a outros testes, e poder respeitável para alternativas simétricas de cauda longa.

  • Romão, Xavier, Raimundo Delgado e Anibal Costa. "Uma comparação empírica do poder de testes de qualidade de ajuste univariados para normalidade". Jornal de Computação Estatística e Simulação 80.5 (2010): 545-591. Esta é a pesquisa publicada mais recente sobre o assunto que eu conheço.

O estudo aborda o desempenho de 33 testes de normalidade, para vários tamanhos de amostra, considerando vários níveis de significância e para várias distribuições normais simétricas, assimétricas e modificadas. Recomendações gerais para testes de normalidade resultantes do estudo são definidas de acordo com a natureza da não normalidade

Se você realmente deseja resumir a pesquisa deles em sim / não, a resposta é SIM. O teste de Shapiro-Wilks parece ser um pouco mais poderoso na maioria dos casos do que Anderson-Darling. Eles recomendam o teste Shapiro Wilk quando você não tem uma distribuição alternativa específica em mente. No entanto, se você estiver interessado neste assunto, vale a pena ler o artigo. Pelo menos olhe para as mesas.

  • Edith Seier, Testes de Normalidade: Comparação de Potência , na Enciclopédia Internacional de Ciência Estatística, 2014 - Uma pesquisa de pesquisa publicada sobre o assunto. Novamente, a resposta depende da amostra e do seu conhecimento sobre a distribuição alternativa, mas a resposta trivial seria SIM, Shapiro-Wilk é geralmente mais poderoso, mas nem sempre.

  • Henry C. Thode, Testes de normalidade , na Enciclopédia Internacional de Ciência Estatística, 2014 - Descrição dos testes de normalidade populares. Sua recomendação:

Como indicado anteriormente, o número de testes de normalidade é grande, grande demais para que a maioria deles seja mencionada aqui. No geral, os melhores testes parecem ser os testes de momento, Shapiro – Wilk W, Anderson – DarlingUMA2(consulte Anderson-Darling Tests of Good-of-Fit) e o teste de Jarque-Bera. Informações específicas sobre esses e muitos outros testes de normalidade e suas características podem ser encontradas em Thode (2002) e em questões gerais sobre questões t, incluindo testes de normalidade, em D'Agostino e Stephens (1986).

Agora, isso era tudo sobre testes univariados. The Thode (2002) também possui teste multivariado, dados censurados, misturas normais, testes na presença de outliers e muito mais.

Aksakal
fonte
9

Uma resposta mais séria para aprofundar esta questão e especialmente o interesse contínuo do @ silverfish. Uma abordagem para responder a perguntas como essa é executar algumas simulações para comparar. Abaixo está um código R que simula dados sob várias alternativas e faz vários testes de normalidade e compara a potência (e um intervalo de confiança na potência, uma vez que a energia é estimada por simulação). Ajustei um pouco o tamanho da amostra porque não era interessante quando muitos dos poderes estavam perto de 100% ou 5%, encontrei números redondos que forneciam poderes perto de 80%. Qualquer pessoa interessada pode facilmente pegar esse código e modificá-lo para diferentes suposições, alternativas diferentes etc.

Você pode ver que existem alternativas para as quais alguns dos testes se saem melhor e outros onde eles se saem pior. A questão importante é, então, quais alternativas são mais realistas para suas questões / áreas científicas. Isso realmente deve ser seguido com uma simulação do efeito dos tipos de não normalidade de interesse em outros testes que estão sendo realizados. Alguns desses tipos de não normalidade afetam muito outros testes com base normal, outros não os afetam muito.

> 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
Greg Snow
fonte
Obrigado por adicionar esta resposta, que é um bom complemento para a sua resposta anterior. Nenhuma depreciação foi destinada à sua outra resposta, que é uma das minhas favoritas no SE!
precisa
11
Tomei a liberdade de editar seu código para adicionar formatação e ajustar tudo à janela, Greg. Acho que será mais fácil ler dessa maneira, mas se você não gostar, reverta-o com minhas desculpas.
gung - Restabelece Monica