私は与えられた有意水準、のためので、シャピロ-ウィルク検定は、最高の正規のテストと見なされることが文献でどこかで読んだ、帰無仮説を棄却する確率は、それの偽は他の場合よりも高い場合正常性テスト。
可能であれば数学的な議論を使用して、他の正常性テスト(アンダーソン-ダーリングテストなど)と比較してどのように機能するかを説明してください。
私は与えられた有意水準、のためので、シャピロ-ウィルク検定は、最高の正規のテストと見なされることが文献でどこかで読んだ、帰無仮説を棄却する確率は、それの偽は他の場合よりも高い場合正常性テスト。
可能であれば数学的な議論を使用して、他の正常性テスト(アンダーソン-ダーリングテストなど)と比較してどのように機能するかを説明してください。
回答:
最初に一般的なコメント:Anderson-Darling検定は完全に指定された分布用であり、Shapiro-Wilkは任意の平均と分散を持つ正規分布用です。ただし、D'Agostino&Stephens ^ {[1]}で述べたように、Anderson-Darlingは非常に便利な方法で推定の場合に適応します。コルモゴロフ-スミルノフの場合のリリーフォーステスト)。具体的には、n = 5の法線では、A ^ * = A ^ 2 \ left(1+ \ frac {4} {n}-\ frac {25} {n ^ 2} \ rightの漸近値の表)を使用できます(n <5の適合度をテストしないでください)。
文献のどこかで、シャピロ・ウィルク検定が最良の正規性検定と見なされていることを読んだことがあります。テスト。
一般的なステートメントとして、これは誤りです。
どの正規性テストが「より良い」かは、興味のある選択肢のクラスに依存します。シャピロウィルクが人気がある理由の1つは、広範囲の有用な選択肢の下で非常に優れたパワーを持つ傾向があることです。それは権力の多くの研究で登場し、通常非常によく機能しますが、普遍的に最高ではありません。
強力ではない代替案を見つけるのは非常に簡単です。
たとえば、尾が薄い代替に対しては、スチューデント化された範囲よりも電力が少ないことがよくあります(均一なデータの正規性のテストで比較してください、たとえばで、基づくテストは、シャピロウィルクの38%を少し上回るのに対して、約63%の検出力を持ちます)。
Anderson-Darling(パラメーター推定用に調整)は、二重指数関数でより良くなります。モーメントスキューネスは、スキューの代替案に対して優れています。
可能であれば数学的な議論を使用して、他の正常性テスト(アンダーソン-ダーリングテストなど)と比較してどのように機能するかを説明してください。
一般的な用語で説明します(より具体的な詳細が必要な場合は、元の論文と、それらを議論する後の論文のいくつかが最善の策です)。
よりシンプルだが密接に関連するテスト、シャピロフランシアを考えてみましょう。これは、事実上、正規性の下での順序統計量と期待される順序統計量の間の相関の関数です(したがって、通常のQQプロットでの「直線の直線性」の非常に直接的な尺度)。私が思い出すように、シャピロ-ウィルクは次数統計間の共分散も考慮に入れ、QQプロットから最良の線形推定量を生成し、その後スケーリングされるため、より強力です。分布が正規から遠く離れている場合、比率は1に近くありません。S
比較すると、コルモゴロフ・スミルノフやクラメル・フォン・ミーゼスのようなアンダーソン・ダーリングは、経験的CDFに基づいています。具体的には、ECDFと理論上のECDFの間の加重偏差に基づいています(分散の加重により、尾部の偏差に対してより敏感になります)。
Shapiro and Chen(1995)による検定(次数統計間の間隔に基づく)は、Shapiro-Wilkよりもわずかに大きいパワーを示すことがあります(常にではありません)。多くの場合、非常によく似ています。
-
Shapiro Wilkを使用するのは、パワフルで広く利用可能であり、多くの人が使い慣れているためです(論文で使用する場合、それを詳細に説明する必要がなくなります)。 「最高の正常性テスト」。最良の正規性テストはありません。
[1]:ダゴスティーノ、RB、スティーブンス、マサチューセッツ(1986)
Goodness of Fit Techniques、
Marcel Dekker、ニューヨーク。
[2]:Chen、L.およびShapiro、S.(1995)
"正規化された間隔に基づく正規性の代替テスト。"
統計計算とシミュレーションのジャーナル 53、269から287まで。
shapiro.test
、R で実行するとエラーが発生します。sample size must be between 3 and 5000
次に、他にどのテストを使用する必要がありますか。
明らかに、あなたが読んだ比較にはSnowsPenultimateNormalityTest
(http://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.test
RのTeachingDemosパッケージの関数です(と同じパッケージSnowsPenultimateNormalityTest
)。
私はパーティーに遅れていますが、公開された査読済みの研究への言及で答えます。OPの質問に「はい/いいえ」と答えない理由は、見た目よりも複雑だからです。外れ値の有無にかかわらず、あらゆる分布からのサンプルに対して最も強力なテストはありません。外れ値は、あるテストの能力を著しく低下させ、別のテストでは増加する場合があります。サンプルが対称分布などから得られる場合、一部のテストはよりうまく機能します。
セクション7.1.5から:パワーに基づいて、テストの選択は、利用可能な情報または代替案に関して行われた仮定に直接関連しています。選択肢が具体的であればあるほど、テストは通常、より具体的で強力になります。これにより、最も信頼性の高い推奨事項も得られます。
そして
Anderson-Darling同様に、などの関節の歪度と尖度のテストは、幅広い選択肢に対して高い出力を提供します 。Wilk-Shapiro Wは、他のテストと比較した場合、歪んだ対称形と短い尾形の対称形の選択肢の中で比較的高いパワーを示し、長い尾形の対称形の選択肢のかなりのパワーを示しました。 A 2
この研究は、いくつかの有意水準と、対称、非対称、および修正正規分布の数を考慮して、さまざまなサンプルサイズの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問題の一般的な良さで見つけることができます。
さて、これはすべて単変量テストについてでした。Thode(2002)には、多変量検定、打ち切りデータ、通常の混合、外れ値の存在下での検定などもあります。
この質問をさらに進めるためのより深刻な回答、特に@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