Shapiro–Wilkは最高の正規性テストですか?Anderson-Darlingのような他のテストよりも優れているのはなぜですか?


24

私は与えられた有意水準、のためので、シャピロ-ウィルク検定は、最高の正規のテストと見なされることが文献でどこかで読んだ、帰無仮説を棄却する確率は、それの偽は他の場合よりも高い場合正常性テスト。α

可能であれば数学的な議論を使用して、他の正常性テスト(アンダーソン-ダーリングテストなど)と比較してどのように機能するかを説明してください。


4
検出力は帰無仮説が偽である方法に依存することに注意してください。これは汎用の適合度テストでは無数の方法のいずれかです。チェックしなくても、一般的な正規性テストのそれぞれが特定の選択肢に対して最も強力であることに変わりはありません。
Scortchi -復活モニカ

5
おそらくあなたが求める答えではありませんが、最良の正規性検定は、通常の確率プロット、つまり、観測値と通常の分位点の分位点-分位点プロットです。Shapiro-Wilkテストは確かに称賛されることがよくありますが、データが通常とどのように異なるかを正確に伝えることはできません。多くの場合、重要でない差異は、大きなサンプルサイズに対して重要であると見なされるため、テストによってフラグが立てられます。反対の問題もあなたに噛みつく可能性があります。
ニックコックス14年

回答:


17

最初に一般的なコメント:Anderson-Darling検定は完全に指定された分布用であり、Shapiro-Wilkは任意の平均と分散を持つ正規分布用です。ただし、D'Agostino&Stephens ^ {[1]}で述べたように[1]、Anderson-Darlingは非常に便利な方法で推定の場合に適応します。コルモゴロフ-スミルノフの場合のリリーフォーステスト)。具体的には、n = 5の法線でn=5は、A ^ * = A ^ 2 \ left(1+ \ frac {4} {n}-\ frac {25} {n ^ 2} \ rightの漸近値の表A=A21+4n25n2を使用できます(n <5の適合度をテストしないでください)。

文献のどこかで、シャピロ・ウィルク検定が最良の正規性検定と見なされていることを読んだことがあります。テスト。

一般的なステートメントとして、これは誤りです。

どの正規性テストが「より良い」かは、興味のある選択肢のクラスに依存します。シャピロウィルクが人気がある理由の1つは、広範囲の有用な選択肢の下で非常に優れたパワーを持つ傾向があることです。それは権力の多くの研究で登場し、通常非常によく機能しますが、普遍的に最高ではありません。

強力ではない代替案を見つけるのは非常に簡単です。

たとえば、尾が薄い代替に対しては、スチューデント化された範囲よりも電力が少ないことがよくあります(均一なデータの正規性のテストで比較してください、たとえばで、基づくテストは、シャピロウィルクの38%を少し上回るのに対して、約63%の検出力を持ちます)。あなたは=最大バツバツsdバツn=30あなたは

Anderson-Darling(パラメーター推定用に調整)は、二重指数関数でより良くなります。モーメントスキューネスは、スキューの代替案に対して優れています。

可能であれば数学的な議論を使用して、他の正常性テスト(アンダーソン-ダーリングテストなど)と比較してどのように機能するかを説明してください。

一般的な用語で説明します(より具体的な詳細が必要な場合は、元の論文と、それらを議論する後の論文のいくつかが最善の策です)。

よりシンプルだが密接に関連するテスト、シャピロフランシアを考えてみましょう。これは、事実上、正規性の下での順序統計量と期待される順序統計量の間の相関の関数です(したがって、通常のQQプロットでの「直線の直線性」の非常に直接的な尺度)。私が思い出すように、シャピロ-ウィルクは次数統計間の共分散も考慮に入れ、QQプロットから最良の線形推定量を生成し、その後スケーリングされるため、より強力です。分布が正規から遠く離れている場合、比率は1に近くありません。Sσs

比較すると、コルモゴロフ・スミルノフやクラメル・フォン・ミーゼスのようなアンダーソン・ダーリングは、経験的CDFに基づいています。具体的には、ECDFと理論上のECDFの間の加重偏差に基づいています(分散の加重により、尾部の偏差に対してより敏感になります)。

Shapiro and Chen(1995)による検定(次数統計間の間隔に基づく)は、Shapiro-Wilkよりもわずかに大きいパワーを示すことがあります(常にではありません)。多くの場合、非常によく似ています。[2]

-

Shapiro Wilkを使用するのは、パワフルで広く利用可能であり、多くの人が使い慣れているためです(論文で使用する場合、それを詳細に説明する必要がなくなります)。 「最高の正常性テスト」。最良の正規性テストはありません。

[1]:ダゴスティーノ、RB、スティーブンス、マサチューセッツ(1986)
Goodness of Fit Techniques
Marcel Dekker、ニューヨーク。

[2]:Chen、L.およびShapiro、S.(1995)
"正規化された間隔に基づく正規性の代替テスト。"
統計計算とシミュレーションのジャーナル 53、269から287まで。


私のクラスメートは、「サンプルサイズが50を超える場合は、コルモゴロフスミルノフを使用する必要があります」と言いました。あれは正しいですか?
キティガール

私の記憶の米国特許は、シャピロとウィルクによるオリジナル1965年論文では唯一の必要な定数(与えたの線形推定に使用される)ためにまでのが、それは半世紀以上前のことでした。それ以来、物事は少し動きました。それがなくても、Shapiro FranciaまたはAnderson-Darling(パラメータ推定のために調整されている)は通常、より良い選択です。これらは通常、一般的に興味深い代替手段に対してかなり低いパワーを持っています。(&サンプルから平均とsdを推定している場合、コルモゴロフ-スミルノフではなく、 σ nは50aσn50
Lilliefors

要するに、1967年(
リリーフォース

サンプルサイズが5000を超える場合shapiro.test、R で実行するとエラーが発生します。sample size must be between 3 and 5000次に、他にどのテストを使用する必要がありますか。
キティガール

1. nが大きい場合、ほとんどの場合、単純な分布モデルを拒否します(たとえ適切な近似であっても)。他の何かをすることをお勧めします(なぜ正常性をテストするのですか?)2.それは実際には「すべき」の問題ではありません。常に他のどの製品よりも優れている単一のテストの良さはありません。シャピロウィルクが適度に優れていることはたまたまあります。ただし、nが大きい場合の適切な代替は、シャピロ-フランシア検定です。大きいnでChen-Shapiroテストの実装を見つけることができる場合(テストする正当な理由があると仮定して)、代わりにそれを考慮してください。
Glen_b-モニカを

12

明らかに、あなたが読んだ比較にはSnowsPenultimateNormalityTesthttp://cran.r-project.org/web/packages/TeachingDemos/TeachingDemos.pdf)が含まれていませんでした。ですから、パワーが唯一の考慮事項である場合、「ベスト」と見なされるべきです(私の意見は明らかに偏っているが、リンク/文書に文書化されていることに注意してください)。

ただし、「十分に正常」という問題は「完全に正常」よりもはるかに重要であるため、最良のテストは正式なテストではなくプロットであるというニックコックスのコメントに同意します。意味のあるテストが必要な場合は、qqプロットをこのペーパーの方法論と組み合わせることをお勧めします。

ブジャ、A。、クック、D。ホフマン、H。、ローレンス、M。リー、E.-K。、スウェイン、DFおよびウィッカム、H。(2009)探索的データ分析およびモデル診断のための統計的推論Phil。トランス R. Soc。A 2009 367、4361-4383 doi:10.1098 / rsta.2009.0120

その実装の1つは、vis.testRのTeachingDemosパッケージの関数です(と同じパッケージSnowsPenultimateNormalityTest)。


1
私は感情に同意しますが、QQプロットを注視することは、10〜20を超える変数で多くのことを実行したい場合、あまり解決策ではありません。
アンドリューM 14

正規性テストに加えて、QQプロットを印刷します。それらは排他的ではなく、補完的なツールです。
アクサカル14

2
@Andrew Mそれでは、Shapiro-Wilkまたは他のテストの結果を100または1000程度調べていますか?QQプロットの表示を自動化するのは難しくありません(一度に25個など)。多くの場合、実際の問題を(文字通り)見るには一目で十分です。
ニックコックス14

10

私はパーティーに遅れていますが、公開された査読済みの研究への言及で答えます。OPの質問に「はい/いいえ」と答えない理由は、見た目よりも複雑だからです。外れ値の有無にかかわらず、あらゆる分布からのサンプルに対して最も強力なテストはありません。外れ値は、あるテストの能力を著しく低下させ、別のテストでは増加する場合があります。サンプルが対称分布などから得られる場合、一部のテストはよりうまく機能します。

  • Henry C. Thode、Testing for Normality、2002-これは、このテーマに関する最も包括的な本です。単純な答えにつなげなければならなかった場合、SWはすべての場合においてADより強力ではありません。ここにあなたの読書の喜びのための2つの抜粋があります。

セクション7.1.5から:パワーに基づいて、テストの選択は、利用可能な情報または代替案に関して行われた仮定に直接関連しています。選択肢が具体的であればあるほど、テストは通常​​、より具体的で強力になります。これにより、最も信頼性の高い推奨事項も得られます。

そして

Anderson-Darling同様に、などの関節の歪度と尖度のテストは、幅広い選択肢に対して高い出力を提供します 。Wilk-Shapiro Wは、他のテストと比較した場合、歪んだ対称形と短い尾形の対称形の選択肢の中で比較的高いパワーを示し、長い尾形の対称形の選択肢のかなりのパワーを示しました。 A 2Ks2A2

  • ロマオ、ザビエル、ライムンドデルガド、アニバルコスタ。「正規性に関する単変量適合度検定の経験的検出力の比較。」Journal of Statistics Computation and Simulation 80.5(2010):545-591。これは、私が知っている主題に関する最新の公開された研究です。

この研究は、いくつかの有意水準と、対称、非対称、および修正正規分布の数を考慮して、さまざまなサンプルサイズの33の正規性テストのパフォーマンスに対処します。研究から生じる正規性試験の一般的な推奨事項は、非正規性の性質に従って定義されます

本当に彼らの研究をyes / noに要約したいなら、答えはYESです。Shapiro-Wilksテストは、ほとんどの場合、Anderson-Darlingよりも少し強力なようです。特定の代替分布を考慮していない場合は、シャピロウィルクテストをお勧めします。ただし、このテーマに興味がある場合は、この論文を読む価値があります。少なくとも表を見てください。

  • Edith Seier、Normality Tests:Power Comparison、International Encyclopedia of Statistics Science、2014-主題に関する公開された研究の調査。繰り返しますが、答えはサンプルと代替分布に関する知識に依存しますが、簡単な答えはYESです。Shapiro-Wilkは通常より強力ですが、常にではありません。

  • Henry C. Thode、Normality Tests、International Encyclopedia of Statistics Science、2014-人気のある正規性テストの説明。彼の推薦:

前に示したように、正規性テストの数は多く、ここではそれらの大部分でさえ言及するには大きすぎます。全体的に、最良のテストは、モーメントテスト、シャピロ-ウィルクW、アンダーソン-ダーリング(アンダーソン-適合度のダーリングテストを参照)、およびジャーク-ベラテストのようです。これらおよび他の多くの正規性テストとその特性の詳細は、Thode(2002)およびD'Agostino and Stephens(1986)の正規性テストを含むt問題の一般的な良さで見つけることができます。A2

さて、これはすべて単変量テストについてでした。Thode(2002)には、多変量検定、打ち切りデータ、通常の混合、外れ値の存在下での検定などもあります。


9

この質問をさらに進めるためのより深刻な回答、特に@silverfishの継続的な関心。このような質問に答える1つのアプローチは、比較するシミュレーションを実行することです。以下は、さまざまな選択肢の下でデータをシミュレートし、いくつかの正規性テストを行い、パワー(およびシミュレーションを介してパワーが推定されるため、パワーの信頼区間)を比較するRコードです。多くのべき乗が100%または5%に近い場合は面白くなかったため、サンプルサイズを多少調整しました。興味のある人は誰でも簡単にこのコードを取得し、さまざまな仮定、さまざまな代替案などに合わせて修正できます。

いくつかのテストでより良い結果が得られ、他のテストではより悪い結果が得られる代替案があることがわかります。ここで重要な質問は、科学的な質問/領域にとってどの選択肢が最も現実的かということです。これに続いて、実行されている他のテストに対する対象の非正規性のタイプの影響のシミュレーションを行う必要があります。これらのタイプの非正規性のいくつかは、他の正規ベースのテストに大きな影響を与えますが、他のタイプはあまり影響しません。

> 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つである、あなたの他の回答に対する非難はありませんでした。
シルバーフィッシュ14

1
コードを自由に編集して、コードの書式設定を追加し、ウィンドウ内のすべてのものに合わせることができました、Greg。このように読みやすくなると思いますが、気に入らない場合は、謝罪してロールバックしてください。
GUNG -復活モニカ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.