Cara melakukan tes menggunakan R untuk melihat apakah data mengikuti distribusi normal

44

Saya memiliki kumpulan data dengan struktur berikut:

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

Bagaimana saya bisa melakukan tes untuk distribusi normal di R? Mungkin ini pertanyaan yang mudah, tetapi saya seorang pemula.

Skarab
sumber
5
@ Skarab Mungkin saya benar-benar tidak aktif, tetapi tidakkah Anda berharap frekuensi kata apa pun akan berbanding terbalik dengan peringkatnya di tabel frekuensi kata, menurut hukum Zipf ( j.mp/9er2lv )? Dalam hal ini, periksa zipfRpaketnya.
chl
1
Saya setuju dengan @chl - itu akan menjadi keajaiban kecil jika data Anda didistribusikan secara normal. Mungkin pertanyaan lain tentang apa yang ingin Anda lakukan dengan data akan bermanfaat. Jangan menemukan kembali roda!
csgillespie
3
Bagaimana data Anda dapat didistribusikan sesuai dengan model yang memberikan kemungkinan nol untuk kejadian negatif?
user603
1
Apa alasan melakukan tes ini?
whuber
Saya ingin memperkirakan apakah hasil besar Ekstraksi Informasi sudah benar. Saya ingin memeriksa apakah distribusi entitas yang ditemukan dalam teks mengikuti harapan saya (saya tahu domain dan corpus teks).
Skarab

Jawaban:

47

Jika saya memahami pertanyaan Anda dengan benar, maka untuk menguji apakah kemunculan kata dalam satu set dokumen mengikuti distribusi Normal, Anda cukup menggunakan tes shapiro-Wilk dan beberapa qqplot. Sebagai contoh,

## 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)

Perintah qqplot memberi: teks alternatif

Anda dapat melihat bahwa kumpulan data kedua jelas tidak Normal oleh ekor yang berat ( Info Lebih Lanjut ).

Dalam uji normalitas Shapiro-Walk, nilai-p besar untuk set data pertama (> 0,9) tetapi sangat kecil untuk set data kedua (<0,01). Ini akan mengarahkan Anda untuk menolak hipotesis nol untuk yang kedua.

csgillespie
sumber
7
Mengapa itu jelas bukan Normal?
Herman Toothrot
Saya pikir titik-titik yang direncanakan harus terletak pada kuadran kuadrat I-III sedekat ketika mereka menarik distribusi normal.
Campa
Lebih umum (rata-rata! = 0), qqlinelereng harus memiliki 1 kemiringan dan mu .
Campa
@HermanToothrot bukan Normal ketika melihat plot kedua karena ada perbedaan yang sangat besar dalam nilai-nilai ekor. Plot QQ adalah grafik dari quantile teoretis (jika itu normal) dari sampel quantlie (dari data). Jika data sampel normal, kami berharap pengamatannya dekat dengan garis, seperti untuk plot pertama. Perhatikan juga skala perbedaan pada sumbu y untuk plot tersebut.
Sheldon
15

Dengan asumsi dataset Anda dipanggil wordsdan memiliki countskolom, Anda dapat memplot histogram untuk memiliki visualisasi distribusi:

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

di mana 100 adalah jumlah tempat sampah

Anda juga dapat melakukan plot QQ normal menggunakan

qqnorm(words$counts)

Terakhir, Anda juga dapat menggunakan tes Shapiro-Wilk untuk normalitas

shapiro.test(word$counts)

Meskipun, lihat diskusi ini: Pengujian Normalitas: 'Pada dasarnya tidak berguna?'

nico
sumber
14

Tidak ada tes yang akan menunjukkan kepada Anda bahwa data Anda memiliki distribusi normal - itu hanya akan dapat menunjukkan kepada Anda ketika data cukup tidak konsisten dengan normal sehingga Anda akan menolak nol.

Tetapi jumlah tidak normal dalam hal apapun, mereka bilangan bulat positif - berapa probabilitas bahwa pengamatan dari distribusi normal akan mengambil nilai yang bukan bilangan bulat? (... itu kejadian probabilitas 1).

Mengapa Anda menguji normalitas dalam kasus ini? Jelas tidak benar.

[Dalam beberapa kasus mungkin tidak masalah bahwa Anda dapat memberi tahu data Anda sebenarnya tidak normal. Data nyata tidak pernah (atau hampir tidak pernah) akan benar-benar diambil dari distribusi normal.]

Jika Anda benar-benar perlu melakukan tes, tes Shapiro-Wilk ( ?shapiro.test) adalah tes umum normal yang baik, tes yang banyak digunakan.

Glen_b
sumber
9

Cara yang lebih formal untuk melihat normalitas adalah dengan menguji apakah kurtosis dan skewness berbeda secara signifikan dari nol.

Untuk melakukan ini, kita perlu:

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 
}

untuk kurtosis, dan:

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
}

untuk Skewness.

Kedua tes ini satu sisi, jadi Anda harus mengalikan nilai-p dengan 2 menjadi dua sisi. Jika nilai p Anda menjadi lebih besar dari satu, Anda harus menggunakan 1-kurtosis.test () alih-alih kurtosis.test.

Jika Anda memiliki pertanyaan lain, Anda dapat mengirim email kepada saya di [email protected]

Joren Bredman
sumber
Apa perbedaan, dari dua fungsi di atas, mengenai kurtosis()dan skewness()fungsi dari paket saat ? Hasil menggunakan rnorm()sampel berbeda.
Nikos Alexandris
5

Selain tes Shapiro-Wilk dari paket statistik, paket nortest (tersedia di CRAN) menyediakan tes normalitas lainnya.

Laurent
sumber
4

Dengan menggunakan nortestpaket R, tes ini dapat dilakukan:

  • Lakukan tes normalitas Anderson-Darling

    ad.test(data1)
  • Lakukan tes Cramér-von Mises untuk normalitas

    cvm.test(data1)
  • Lakukan uji chi-square Pearson untuk normalitas

    pearson.test(data1)
  • Lakukan uji Shapiro-Francia untuk normalitas

    sf.test(data1)

Banyak tes lain dapat dilakukan dengan menggunakan normtestpaket. Lihat deskripsi di https://cran.r-project.org/web/packages/normtest/normtest.pdf

Dr Nisha Arora
sumber
@Nick; Saya telah menyebutkan tes ini dari paket 'nortest' yang ditemukan di sini: ( cran.r-project.org/web/packages/nortest/nortest.pdf ). Paket bermanfaat lainnya adalah 'normtest' seperti yang disebutkan di atas.
Dr Nisha Arora
Ok terima kasih. Dalam ketidaktahuan saya, saya berasumsi bahwa satu nama adalah kesalahan ketik.
Nick Cox