Aynı dağılımdan iki numune alınırsa parametrik olmayan test


19

Örneklerin veya popülasyonun dağılımları hakkında herhangi bir varsayımda bulunmadan iki popülasyonun aynı popülasyondan alındığı hipotezini test etmek istiyorum. Bunu nasıl yapmalıyım?

Wikipedia'dan izlenimim, Mann Whitney U testinin uygun olması gerektiğidir, ancak pratikte benim için işe yaramıyor gibi görünüyor.

Somutluk için, büyük (n = 10000) ve normal olmayan (bimodal), benzer (aynı ortalama), ancak farklı (standart sapma) iki popülasyondan alınan iki örnek (a, b) içeren bir veri kümesi oluşturdum. Bu örneklerin aynı popülasyondan olmadığını tanıyacak bir test arıyorum.

Histogram görünümü:

bimodal örnekleri

R kodu:

a <- tibble(group = "a",
            n = c(rnorm(1e4, mean=50, sd=10),
                  rnorm(1e4, mean=100, sd=10)))
b <- tibble(group = "b",
            n = c(rnorm(1e4, mean=50, sd=3),
                  rnorm(1e4, mean=100, sd=3)))
ggplot(rbind(a,b), aes(x=n, fill=group)) +
  geom_histogram(position='dodge', bins=100)

Mann Whitney testi şaşırtıcı bir şekilde (?) Numunelerin aynı popülasyondan geldiğine dair sıfır hipotezini reddetmekte başarısız oluyor:

> wilcox.test(n ~ group, rbind(a,b))

        Wilcoxon rank sum test with continuity correction

data:  n by group
W = 199990000, p-value = 0.9932
alternative hypothesis: true location shift is not equal to 0

Yardım! Farklı dağıtımları algılamak için kodu nasıl güncellemeliyim? (Özellikle varsa genel rastgele / yeniden örnekleme dayalı bir yöntem istiyorum.)

DÜZENLE:

Cevaplar için herkese teşekkürler! Heyecanla, amaçlarım için çok uygun görünen Kolmogorov-Smirnov hakkında daha fazla şey öğreniyorum.

KS testinin iki örneğin bu ECDF'lerini karşılaştırdığını anlıyorum:

ECDFs

Burada görsel olarak üç ilginç özellik görebiliyorum. (1) Örnekler farklı dağılımlardan alınmıştır. (2) A, belirli noktalarda açıkça B'nin üzerindedir. (3) A diğer bazı noktalarda açıkça B'nin altındadır.

KS testi, bu özelliklerin her birini hipotez olarak kontrol edebiliyor gibi görünüyor:

> ks.test(a$n, b$n)

        Two-sample Kolmogorov-Smirnov test

data:  a$n and b$n
D = 0.1364, p-value < 2.2e-16
alternative hypothesis: two-sided

> ks.test(a$n, b$n, alternative="greater")

        Two-sample Kolmogorov-Smirnov test

data:  a$n and b$n
D^+ = 0.1364, p-value < 2.2e-16
alternative hypothesis: the CDF of x lies above that of y

> ks.test(a$n, b$n, alternative="less")

        Two-sample Kolmogorov-Smirnov test

data:  a$n and b$n
D^- = 0.1322, p-value < 2.2e-16
alternative hypothesis: the CDF of x lies below that of y

Gerçekten temiz! Bu özelliklerin her birine pratik bir ilgim var ve bu yüzden KS testinin her birini kontrol edebilmesi harika.


MW'nin reddetmemesi çok şaşırtıcı değil. Tek taraflı bir test için Pr (a> b) <0.05 olup olmadığını test eder; burada a ve b popülasyonlarınızın rastgele seçilmiş üyeleri olup olmadığını test eder.
mdewey

1
Mann-Whitney hipotezinin bazen iki grubun "yerini" veya sistematik stokastik fark çizgileri boyunca bir şeyi ilgilendirdiği söylenir. Verilerinizde, her iki grup da 75 civarında simetrik olarak dağıtılır, bu nedenle MW kesinlikle bir fark bulamamalıdır.
Sal Mangiafico

4
Bu, bir test için hipotez hakkında net olmadığımızda ektiğimiz karışıklığa iyi bir örnektir. Ne yazık ki, insanlar bir kullanımı öğretilir t gerçekten bu test iki karşılaştırır düşünmeden, iki grubu karşılaştırmak için -test aracı iki karşılaştırmak için bir medyan test var oysa medyanları başka bir şey karşılaştırır, Mann-Whitney, diğer yüzdelik karşılaştırmak dilim regresyon , varyansları karşılaştırmak için testler, dağılımları karşılaştırmak için Kolmogorov-Smirnov vb.
Sal Mangiafico

Yansıtma üzerine, MW testi için Wikipedia sayfası hipotezi çok açık bir şekilde ifade ediyor gibi görünüyor ve bu hipotezin örneklerin aynı dağıtımdan geldiğini ima ettiğini düşünmek benim tarafımdan yanlış anlaşıldı (temelsiz bir sıçrama). Gerçekten de, aynı merkezi nokta etrafında simetrik olan iki farklı dağılım karşılaştırılırken sorun belirginleşir.
Luke Gorrie

Yanıtlar:


17

Kolmogorov-Smirnov testi bunu yapmanın en yaygın yoludur, ancak başka seçenekler de vardır.

Testler ampirik kümülatif dağılım fonksiyonlarına dayanmaktadır. Temel prosedür:

  • Lp
  • Test istatistiğinin, numunelerin aynı dağıtımdan geldiği sıfır hipotezi altında dağılımını anlayın (şans eseri insanlar bunu en yaygın mesafeler için zaten yapmışlardır!)
  • αα%

L

ks.test(a,b)

p

L2dgofcvm.test()

DÜZENLE:

Varsayalım ki boyutlarında örneklerimiz var.nm hipotez testimizi uygulamak istediğimiz .

Bunu örnekleme tipi bir prosedüre dönüştürmek için aşağıdakileri yapabiliriz:

  1. nmnm
  2. Örnekler için mesafe metriğinizi hesaplayın. KS testi için, bu sadece maks. ampirik CDF'ler arasındaki fark.
  3. Sonucu saklayın ve 1. adıma geri dönün.

Sonunda, test istatistiğinin sıfır hipotez altında dağıtılmasından, niceliklerini hipotez testinizi istediğiniz önem düzeyinde yapmak için kullanabileceğiniz çok sayıda örnek oluşturacaksınız. KS test istatistiği için bu dağılıma Kolmogorov dağılımı denir.

KS testi için, bunun sadece hesaplama amaçlı bir çaba kaybı olduğuna dikkat edin, çünkü miktarlar teorik olarak çok basit bir şekilde karakterize edilir, ancak prosedür genellikle herhangi bir hipotez testine uygulanabilir.


Teşekkür ederim! Kolmogorov-Smirnov testi gerçekten de bu örneklerin aynı popülasyondan geldiğine dair sıfır hipotezini reddetmektedir. Ve sezgisel olarak ECDF'leri karşılaştırmak mantıklıdır, çünkü histogramla görsel olarak yaptığım az çok. Soru: Bu testi R gibi herhangi bir araç kullanmadan sıfırdan uygulamak zorunda olduğumu varsayalım. Yeterince basit bir yöntem var mı? (Belki de bootstrapping'e dayanıyor?) Soruyorum çünkü arka planım bilgisayar programlama ve simülasyon tabanlı yöntemleri gerçekten daha kolay anlıyorum.
Luke Gorrie

Rasgeleleştirmeye veya permütasyonlara bakmalısınız. Bunları normal olmayan testler için tercih ederim. Ayrıca istatistik yerine simülasyon olma kriterlerinizi karşılarlar
RTbecard

2
@ JamesAdamCampbell farklı bir cevapta biraz daha genişletebilir misiniz?
Will

1
@LukeGorrie, Kolmogorov-Smirnov testinin nasıl uygulanacağı ayrı bir sorudur - ve başka bir yerde daha iyi yayınlanabilecek bir sorudur (örneğin, Stack Overflow'da). Temel tarif şöyledir: (a) testin nasıl çalıştığını anlamak, (b) bunu uygulamak. Bu durumda özellikle basit görünüyor: 1. ECDF'leri hesaplayın (kolay, sadece önek toplamlarını alarak), 2.Lnorm (kolay, sadece maksimum farkı alarak). Oldukça basit görünüyor.
DW

1
Bununla ilgili bir sorun görmüyorum. Bunlardan bazılarını denerseniz sonuçları görmek isterim! CI yaklaşımı ve düz KS testinin size her zaman aynı cevabı verip vermediğini görmek harika olurdu. Ben :) yaptıkları şüpheli
Will
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.