Rastgele üretilen verilerin amaçlanan dağıtımına karşı test edilmesi


17

Rastgele veri üreten bir program yazdım. Program düzgün çalışıyorsa, bu veriler bilinen, belirli bir olasılık dağılımını izlemelidir. Programı çalıştırmak, sonuç üzerinde bazı hesaplamalar yapmak ve bir p değeri bulmak istiyorum.

Başkası söylemeden önce: Hipotez testinin programın ne zaman düzgün çalıştığını tespit edemediğini anlıyorum. Sadece belirli bir şekilde yanlış çalıştığını tespit edebilir . (Ve o zaman bile, seçtiğiniz önem seviyesine bağlı olarak test% X oranında başarısız olmalıdır.)

Bu yüzden, hangi araçların uygun olabileceğini anlamaya çalışıyorum. Özellikle:

  • İstediğim kadar rastgele veri oluşturabilirim. Tek yapmam gereken programı yeterince uzun süre çalışır durumda bırakmak. Bu yüzden belirli bir numune boyutuyla sınırlı değilim.

  • P değeri üreten tekniklerle ilgileniyorum. Bu yüzden bir grafiğe bakıp "evet, biraz doğrusal görünüyor" demek ilginç bir seçenek değil. Bir grafiğin "kazanma zorluğu" üzerine sert bir sayı koymanın bir yolu olmadığı sürece. ;-)

Şimdiye kadar bildiklerim:

  • Uygulanabilir gibi görünen üç ana test türünden bahsetmiştim: [Pearson] ki kare testi, Kolmogorov-Smirnov testi ve Anderson-Darling testi.

  • Kesik dağılımlar için ki-kare testi uygunken , diğer ikisi sürekli dağılımlar için daha uygundur . (?)

  • Çeşitli kaynaklar, AD testinin KS testinden "daha iyi" olduğunu ima eder, ancak daha fazla ayrıntıya giremez.

Nihayetinde, bu testlerin tümü, belirtilen boş dağıtımdan sapmanın "farklı yollarını" muhtemelen tespit eder. Ancak farkların ne olduğunu henüz bilmiyorum ... Özet olarak, her test türünün en uygun olduğu yer ve en iyi ne tür sorunları tespit ettiği hakkında genel bir açıklama arıyorum.


Kendi yazdıysanız, bilginizin sınırlarını aştığınızda (tasarımın içine yerleştirdiğiniz) neredeyse 'başarısızlığa' bağlıdır. Bazı kontrol yöntemlerini listeleyen random.org/analysis'e ve açıkça stackoverflow.com/q/2130621/717355 adresine bir göz atın . Felsefi olarak, program deterministik ise yine de rastgele olamaz ;-) Bu kesinlikle çalışmaya değer bir konu (ve şifre kesmek crypo tartışmalarını unutma).
Philip Oakley

Yanıtlar:


21

Bahsedilen 3 yöntemin nasıl çalıştığının genel bir açıklaması.

Chi-Squared yöntemi, bir kutudaki gözlem sayısını, dağıtıma bağlı olarak depoda olması beklenen sayı ile karşılaştırarak çalışır. Kesikli dağılımlar için kutular genellikle bunların ayrı olasılıkları veya kombinasyonlarıdır. Sürekli dağıtımlar için bölmeleri oluşturmak üzere kesme noktaları seçebilirsiniz. Bunu uygulayan birçok işlev, bölmeleri otomatik olarak oluşturur, ancak belirli alanlarda karşılaştırma yapmak isterseniz kendi bölmelerinizi oluşturabilmeniz gerekir. Bu yöntemin dezavantajı, teorik dağılım ile değerleri aynı bölmeye koyan ampirik veriler arasındaki farkların tespit edilmeyeceğidir, eğer teorik olarak 2 ile 3 arasındaki sayılar aralık içine yayılsa, bir örnek yuvarlanır (2.34296 gibi değerleri görmeyi umuyoruz),

KS test istatistiği, karşılaştırılan 2 Kümülatif Dağıtım Fonksiyonu arasındaki maksimum mesafedir (genellikle teorik ve ampirik). 2 olasılık dağılımının sadece 1 kavşak noktası varsa, o zaman 1 eksi maksimum mesafe 2 olasılık dağılımı arasındaki çakışma alanıdır (bu, bazı kişilerin ölçülmekte olan şeyi görselleştirmesine yardımcı olur). Teorik dağılım fonksiyonu ve EDF aynı grafik üzerinde çizim düşünün sonra 2 "eğrileri" arasındaki mesafeyi ölçmek, en büyük fark test istatistik ve null doğru olduğunda bu değerlerin dağılımı ile karşılaştırılır. Bu, farklılıkları yakalayan dağılımın veya 1 dağılımın diğerine göre kaydırılmış veya gerilmiş şeklidir.1n

Anderson-Darling testi, KS testi gibi CDF eğrileri arasındaki farkı da kullanır, ancak maksimum farkı kullanmak yerine, 2 eğri arasındaki toplam alanın bir işlevini kullanır (aslında farklılıkları kareler, ağırlıklandırır, böylece kuyruklar daha fazla etki, daha sonra dağıtımların alanı üzerinde entegre olur). Bu, aykırı değerlere KS'den daha fazla ağırlık verir ve ayrıca birkaç küçük fark varsa (KS'nin vurgulayacağı 1 büyük farkla karşılaştırıldığında) daha fazla ağırlık verir. Bu, önemsiz olduğunu düşündüğünüz farklılıkları (hafif yuvarlama, vb.) Bulmak için teste güç verebilir. KS testi gibi bu da verilerden parametreleri tahmin etmediğinizi varsayar.

Son 2'nin genel fikirlerini gösteren bir grafik:

resim açıklamasını buraya girin

bu R koduna dayanarak:

set.seed(1)
tmp <- rnorm(25)
edf <- approxfun( sort(tmp), (0:24)/25, method='constant', 
    yleft=0, yright=1, f=1 )

par(mfrow=c(3,1), mar=c(4,4,0,0)+.1)
curve( edf, from=-3, to=3, n=1000, col='green' )
curve( pnorm, from=-3, to=3, col='blue', add=TRUE)

tmp.x <- seq(-3, 3, length=1000)
ediff <- function(x) pnorm(x) - edf(x)
m.x <- tmp.x[ which.max( abs( ediff(tmp.x) ) ) ]
ediff( m.x )  # KS stat
segments( m.x, edf(m.x), m.x, pnorm(m.x), col='red' )  # KS stat

curve( ediff, from=-3, to=3, n=1000 )
abline(h=0, col='lightgrey')    

ediff2 <- function(x) (pnorm(x) - edf(x))^2/( pnorm(x)*(1-pnorm(x)) )*dnorm(x)
curve( ediff2, from=-3, to=3, n=1000 )
abline(h=0)

Üst grafik, standart normalin CDF'sine kıyasla standart normalden alınan bir numunenin EDF'sini KS statüsünü gösteren bir çizgi ile gösterir. Orta grafik daha sonra 2 eğrideki farkı gösterir (KS statüsünün nerede oluştuğunu görebilirsiniz). Alt, daha sonra kare, ağırlıklı farktır, AD testi bu eğrinin altındaki alana dayanır (her şeyi doğru bulduğumu varsayarsak).

Diğer testler bir qqplot'taki korelasyona, qqplot'taki eğime bakar, ortalamaları, var ve diğer istatistikleri momentlere göre karşılaştırır.


+1, bu asıl soruya iyi bir cevap (benimkinin aksine ...). Paragraf 3'ün ortasından geçen açıklama sadece bir açıklama yapmak için yalvarır.
gung - Monica'yı eski durumuna getirin

Bu gerçekten hoş bir cevap. Tam olarak anladığımdan emin olmak için: KS testi CDF ve EDF arasındaki en büyük sapmayı döndürürken, AD iki eğri arasındaki toplam [ağırlıklı] alanı döndürüyor mu?
Matematiksel

@MathematicalOrchid, çoğunlukla doğru, AD mesafeyi, sonra ağırlıkları kareler, sonra bütünleşir, bu yüzden alandan biraz farklıdır (anlamak için, bir alan olarak düşünmek muhtemelen tamam ve daha basittir).
Greg Snow

1
Teorik dağılımınız bir nokta kütlesine (belirli bir noktada CDF'de dikey sıçrama) sahipse ve verilerinizin gerçek dağılımının neredeyse aynı yerde değil, aynı yerde bir nokta kütlesine sahip olmasını bekliyorum, o zaman KS testi daha iyi olabilir AD testine. Ancak bu dava muhtemelen biraz tartışmalı. KS testi, AD'nin her zaman 2 taraflı olduğu 1 taraflı testlere izin verir, bu da başka bir fark olacaktır (sadece yaygın değildir).
Greg Snow

2
KS istatistik sadece "bir uç nokta" bağlıdır @MathematicalOrchid karakterizasyonu sevmiyorum. Bu "bir noktanın" (genellikle dağıtımın ortasında) bir CDF'deki yeri setteki diğer noktaların değerlerine bağlıdır ve bu nedenle bu dil saf dinleyiciye önereceği kadar izole veya yalnız değildir.
12'de

12

Net ve ayrıntılı bir soru yazmak için +1. Umarım cevabım çok sinir bozucu değildir. Hipotez testinin sizin durumunuzda uygun bir yaklaşım olmadığına inanıyorum. Boş hipotez anlamlılık testleri cevap zaman yapılacak makul bir şeydir olabilir , evet ya da hayır olacak ancak hangisini bilmiyorsanız . (Ne yazık ki, aslında hangisi olduğunu söylemez, ancak bu farklı bir konudur.) Sizin durumunuzda, topladım, algoritmanızın iyi olup olmadığını bilmek istiyorsunuz. Bununla birlikte, hiçbir bilgisayar programının herhangi bir olasılık dağılımından gerçekten rasgele veri üretemeyeceği (kesin olarak) bilinmektedir. Bu ilk olarak doğrudur, çünkü tüm bilgisayarlar sonlu durumlu makinelerdir ve bu nedenle sadece sahte numaralar üretebilirler. Ayrıca (gerçek rastgelelik eksikliğini bir kenara bırakarak), üretilen değerlerin sürekli bir dağılımı mükemmel şekilde takip etmesi mümkün değildir. Bunu anlamanın birkaç yolu vardır, ancak belki de en kolayı, sayı satırında herhangi bir sürekli rastgele değişken için doğru olmayan 'boşluklar' olmasıdır. Dahası, bu boşlukların hepsi eşit derecede geniş veya mükemmel şekilde eşit aralıklı değildir. Yalancı sayı üretimi üzerinde çalışan bilgisayar bilimcileri arasında oyunun adı, boşlukların daha küçük, daha eşit, daha uzun periyotlarla (ve daha fazla değer daha hızlı üretebileceği) algoritmaları geliştirmektir. Her halükarda, bu gerçekler, hipotez testinin algoritmanızın "bilinen, belirli bir olasılık dağılımını" doğru bir şekilde takip edip etmediğini belirlemek için yanlış bir yaklaşım olduğunu, çünkü değil. (Afedersiniz.)

Bunun yerine, daha uygun bir çerçeve, verilerinizin teorik dağılıma ne kadar yakın olduğunu belirlemektir . Bunun için parselleri, özellikle qq-parselleri ve pp-parselleri. (Yine, bunun sinir bozucu olması gerektiğinin farkındayım ve bunun için özür dilerim.) Ancak, arazileri yapmak ya da onlara bakmak gibi garip gelmek zorunda değilsiniz. Bunun yerine, verilerinizi çizim için uygun bir şekilde dönüştürdükten ve söz konusu teorik dağılımdan karşılık gelen değerleri hesapladıktan sonra ilişkilendirebilirsiniz. Bu size istediğiniz gibi bir sayı, özellikle de bir r puanı verir. Dahası, sayı size algoritmanızın ne kadar iyi olduğuna dair uygun bir ölçü verir. Bu işlem için istediğiniz kadar veri oluşturabilirsiniz; daha fazla veri size ölçüm konusunda daha fazla hassasiyet verecektir. Yani, güç anlayışımızı kaydırdık1-β , gerçekten yanlış bir boşluğu (garanti edilen) reddetme olasılığınır=1

Bir diğer notta, algoritmanızın kalitesini değerlendirmeyle ilgili olarak, diğer standart pRNG'lere göre zamanlamak isteyebilirsiniz.

Bu yardımcı olur umarım.


Kesinlikle ne istediğimi değil, ama anlayışlı hiçbiri az. Ben "sürekli değil" ile temelde bilgisayarların sonsuz hassasiyetli aritmetik uygulamak değil söz kastediyorum?
Matematiksel

Bu onun büyük bir parçası, ama sorunun tamamı değil. Bu son derece karmaşık bir konudur.
gung - Monica'yı eski durumuna getirin

1
@ Gung'un ilk paragrafının fikirlerinden bazıları R SnowsPenultimateNormalityTestiçin TeachingDemospaketteki işlevde uygulanır. @ Gung'un bir p-değerine odaklanmak yerine bir yakınlık ölçüsüne bakma fikrine katılıyorum. Bunun için qq grafiğinde korelasyonu kullanmanın bir sorunu, verileriniz doğru şekle sahipse, ancak farklı ortalama, varyans vb.Gibi gerçekten çok yüksek korelasyon elde edebilmenizdir. Alternatif olarak KS istatistiğini veya AD istatistiğini teorik olandan farklı ölçüler olarak kullanmaktır.
Greg Snow

@gung, cevap için teşekkürler. “Verilerinizi çizmek için uygun bir şekilde dönüştürdükten ve söz konusu teorik dağılımdan karşılık gelen değerleri hesapladıktan sonra, bunları ilişkilendirebilirsiniz” konusunda biraz daha ayrıntılı bilgi verebilir misiniz? Pp- veya qq-plotlama için verileri hesapladıysanız, bahsettiğiniz r-skorunu elde etmek için bir sonraki adım ne olurdu? İyi bilinen bir test mi? Bir referans verebilir misiniz? Teşekkür ederim!
Ivan

1

Bütün cevapları tam olarak okumadım ama oldukça titiz ve doğru olduklarını görüyorum. Uzun cevaplara gömülü bir şeyi tekrarlama riskini taşıyarak sadece v = ki kare testinin sürekli veriler için kullanılabileceğini söylemek istiyorum. En iyi test olmayabilir ve birçok test gibi asimptotik teoriye dayanır ve bu nedenle seyrek hücreli küçük numunelerde doğru olmayabilir (bu da binmeyi nasıl yaptığınıza bağlıdır). Anderson-Darling, normallik testi için KS testinden daha güçlüdür, ancak KS diğer sürekli dağılımlar için daha iyi olabilir. Lillefors'un üstel dağılımlar için tasarlanmış bir testi vardır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.