Verilerin normal dağılıma uyup uymadığını görmek için R kullanarak bir test nasıl yapılır


44

Aşağıdaki yapıya sahip bir veri kümem var:

a word | number of occurrence of a word in a document | a document id 

R'de normal dağılım için nasıl bir test yapabilirim? Muhtemelen bu kolay bir soru ama ben bir R acemiyim.


5
@Skarab Belki de tamamen kapalıyım, ancak Zipf yasasına göre ( j.mp/9er2lv ) herhangi bir kelimenin sıklığının, kelime sıklığı tablosundaki sıralamasıyla ters orantılı olacağını beklemiyor musunuz? Bu durumda, zipfRpaketi kontrol edin .
chl

1
@Chl ile aynı fikirdeyim - verileriniz normal şekilde dağıtılmışsa bu küçük bir mucize olur. Belki de verilerle ne yapmak istediğinizi başka bir soruya değecektir. Tekerleği yeniden icat etme!
csgillespie

3
Olumsuz oluşuma sıfır olasılık vermeyen bir modele göre verileriniz nasıl dağıtılabilir?
kullanici603

1
Bu testi yapmanın sebebi nedir?
whuber

Bilgi Çıkarma işleminin büyük sonucunun doğru olup olmadığını tahmin etmek istiyorum. Metinde bulunan varlıkların dağılımının beklentilerimi takip edip etmediğini kontrol etmek istiyorum (etki alanını ve metin kurumunu biliyorum).
Skarab

Yanıtlar:


47

Sorunuzu doğru anlarsam, o zaman bir belge kümesindeki sözcüklerin bir Normal dağılım izlediğini test etmek için sadece bir shapiro-Wilk testi ve bazı qqplot kullanabilirsiniz. Örneğin,

## Generate two data sets
## First Normal, second from a t-distribution
words1 = rnorm(100); words2 = rt(100, df=3)

## Have a look at the densities
plot(density(words1));plot(density(words2))

## Perform the test
shapiro.test(words1); shapiro.test(words2)

## Plot using a qqplot
qqnorm(words1);qqline(words1, col = 2)
qqnorm(words2);qqline(words2, col = 2)

Qqplot komutları şunları verir: alt metin

İkinci veri setinin ağır yazılar tarafından açıkça Normal olmadığını görebilirsiniz ( Daha Fazla Bilgi ).

Shapiro-Walk normallik testinde p değeri ilk veri seti için büyük (> .9), ikinci veri seti için ise çok küçüktür (<.01). Bu, ikinci için boş hipotezi reddetmenize yol açacaktır.


7
Neden açıkça Normal değil?
Herman Toothrot

Bence, çizilen noktalar I-III kadran bisektörün üzerinde normal bir dağılım çizdikleri kadar yakın olmalıdır.
Campa

Daha genel olarak (ortalama! = 0), qqline1 eğim ve mu kesişimine sahip olacaktır .
Campa

@HermanToothrot kuyruk değerlerinde çok büyük bir sapma olduğu için ikinci arsaya bakarken Normal değildir. QQ grafiği teorik kuantilin (normal ise) numune kuantilini (verilerden) ayet eden bir grafiğidir. Örnek veriler normalse, gözlemlerin ilk çizim için olduğu gibi çizgiye yakın olmasını bekliyoruz. Ayrıca, bu araziler için y eksenindeki çok fark ölçeğine dikkat edin.
Sheldon 18

15

Veri kümenizin çağrıldığını wordsve bir countssütunu olduğunu varsayarsak , dağıtımın görselleştirmesini görmek için histogramı çizebilirsiniz:

hist(words$counts, 100, col="black")

100 bidon sayısı

Normal bir QQ grafiği kullanarak da yapabilirsiniz.

qqnorm(words$counts)

Son olarak, normallik için Shapiro-Wilk testini de kullanabilirsiniz.

shapiro.test(word$counts)

Yine de şu tartışmaya bakın: Normallik Testi: 'Esasen Yararsız?'


14

Hiçbir test size verilerinizin normal bir dağılıma sahip olduğunu göstermez - yalnızca verileri null'u reddedeceğiniz normalle yeterince tutarsız olduğunda gösterebilir.

Fakat sayılar her durumda normal değildir, pozitif tamsayılardır - normal bir dağılıma ait bir gözlemin tamsayı olmayan bir değer alma olasılığı nedir? (... bu bir olasılık olayı 1).

Bu durumda neden normalliği test ettin? Belli ki doğru değil.

[Bazı durumlarda verilerinizin gerçekten normal olmadığını söyleyebilmeniz önemli olmayabilir. Gerçek veriler hiçbir zaman (ya da neredeyse hiç) aslında normal bir dağılımdan çekilmeyecektir.]

Gerçekten bir test yapmanız gerekiyorsa, Shapiro-Wilk testi ( ?shapiro.test) yaygın olarak kullanılan iyi bir genel normallik testidir.


9

Normalliğe bakmanın daha resmi bir yolu, kurtosis ve eğriltmenin sıfırdan önemli ölçüde farklı olup olmadığını test etmektir.

Bunu yapmak için, almamız gereken:

kurtosis.test <- function (x) {
m4 <- sum((x-mean(x))^4)/length(x)
s4 <- var(x)^2
kurt <- (m4/s4) - 3
sek <- sqrt(24/length(x))
totest <- kurt/sek
pvalue <- pt(totest,(length(x)-1))
pvalue 
}

kurtosis için ve

skew.test <- function (x) {
m3 <- sum((x-mean(x))^3)/length(x)
s3 <- sqrt(var(x))^3
skew <- m3/s3
ses <- sqrt(6/length(x))
totest <- skew/ses
pt(totest,(length(x)-1))
pval <- pt(totest,(length(x)-1))
pval
}

Skewness için.

Her iki test de bir kuyrukludur, bu yüzden iki kuyruklu olmak için p değerini 2 ile çarpmanız gerekir. P-değeriniz birden büyükse, kurtosis.test yerine 1-kurtosis.test () kullanmanız gerekir.

Başka sorularınız varsa, bana j.bredman@gmail.com adresinden e-posta gönderebilirsiniz.


Moment paketindeki kurtosis()ve skewness()fonksiyonlarına ilişkin yukarıdaki iki fonksiyonun farklılıkları nelerdir ? Numunelerin kullanıldığı sonuçlar farklıdır. rnorm()
Nikos Alexandris

5

İstatistik paketinin Shapiro-Wilk testine ek olarak, en kuzeydeki paket (CRAN'da bulunur) diğer normal testler sunar.


4

nortestR paketi kullanılarak bu testler yapılabilir:

  • Anderson-Darling normallik testi yapın

    ad.test(data1)
  • Normallik için Cramér-von Mises testi uygulayın

    cvm.test(data1)
  • Normallik için Pearson ki-kare testi yapın

    pearson.test(data1)
  • Normallik için Shapiro-Francia testi yapın

    sf.test(data1)

normtestPaket kullanılarak başka birçok test yapılabilir . Https://cran.r-project.org/web/packages/normtest/normtest.pdf adresindeki açıklamaya bakın.


@Nick; Bu testi burada bulunan 'en kuzey' paketinden söz ettim : ( cran.r-project.org/web/packages/nortest/nortest.pdf ). Diğer faydalı paket yukarıda belirtildiği gibi 'normtest'tir .
Dr Nisha Arora,

Tamam teşekkürler. Benim cehaletimde bir ismin yazım hatası olduğunu varsaydım.
Nick Cox,
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.