วิธีการทดสอบโดยใช้ R เพื่อดูว่าข้อมูลเป็นไปตามการแจกแจงแบบปกติหรือไม่


44

ฉันมีชุดข้อมูลที่มีโครงสร้างต่อไปนี้:

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

ฉันจะทำการทดสอบสำหรับการแจกแจงแบบปกติใน R ได้อย่างไร? อาจเป็นคำถามง่าย ๆ แต่ฉันเป็นมือใหม่ R


5
@Skarab บางทีฉันอาจจะหมดไป แต่คุณจะไม่คาดหวังว่าความถี่ของคำใด ๆ จะแปรผกผันกับอันดับในตารางความถี่ของคำตามกฎของ Zipf ( j.mp/9er2lv )? ในกรณีนี้ให้ตรวจสอบzipfRแพ็คเกจ
chl

1
ฉันเห็นด้วยกับ @chl - จะเป็นเรื่องมหัศจรรย์เล็กน้อยหากข้อมูลของคุณได้รับการเผยแพร่ตามปกติ บางทีคำถามอื่นเกี่ยวกับสิ่งที่คุณต้องการทำกับข้อมูลจะคุ้มค่า อย่าประดิษฐ์ล้อใหม่!
csgillespie

3
ข้อมูลของคุณจะถูกกระจายอย่างไรตามตัวแบบที่ให้ความน่าจะเป็นแบบไม่เป็นศูนย์ต่อการเกิดเหตุการณ์ด้านลบ?
user603

1
เหตุผลในการทำแบบทดสอบนี้คืออะไร?
whuber

ฉันต้องการประเมินว่าผลลัพธ์ที่ได้จากการสกัดข้อมูลขนาดใหญ่นั้นถูกต้องหรือไม่ ฉันต้องการตรวจสอบว่าการกระจายของเอนทิตีที่พบในข้อความเป็นไปตามความคาดหวังของฉันหรือไม่ (ฉันรู้ว่าโดเมนและคลังข้อความ)
Skarab

คำตอบ:


47

ถ้าฉันเข้าใจคำถามของคุณถูกต้องแล้วเพื่อทดสอบว่าคำที่เกิดขึ้นในชุดเอกสารเป็นไปตามการแจกแจงแบบปกติคุณสามารถใช้การทดสอบ shapiro-Wilk และ qqplots ได้บ้าง ตัวอย่างเช่น,

## 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 ให้: ข้อความแสดงแทน

คุณจะเห็นว่าชุดข้อมูลที่สองไม่ชัดเจนว่าเป็นปกติโดยก้อยหนัก ( ข้อมูลเพิ่มเติม )

ในการทดสอบภาวะปกติของ Shapiro-Walk ค่า p มีขนาดใหญ่สำหรับชุดข้อมูลชุดแรก (> .9) แต่มีขนาดเล็กมากสำหรับชุดข้อมูลชุดที่สอง (<.01) สิ่งนี้จะนำคุณไปสู่การปฏิเสธสมมติฐานว่างสำหรับวินาที


7
ทำไมมันไม่ชัดเจนปกติ?
เฮอร์แมนทูตรอต

ฉันคิดว่าจุดที่วางแผนไว้ควรอยู่บนเส้นแบ่งครึ่ง Quadrant I-III ใกล้เคียงกับที่พวกเขาวาดการแจกแจงปกติ
Campa

โดยทั่วไป (หมายถึง! = 0) qqlineจะต้องมีการสกัดกั้น1 ความชันและmu
Campa

@ HermanToothrot มันไม่ปกติเมื่อมองไปที่พล็อตที่สองเนื่องจากมีความแตกต่างที่ใหญ่มากในค่าหาง พล็อต QQ เป็นกราฟของควอนตัมเชิงทฤษฎี (ถ้าเป็นเรื่องปกติ) ข้อตัวอย่างควอนตัมตัวอย่าง (จากข้อมูล) หากข้อมูลตัวอย่างเป็นเรื่องปกติเราคาดว่าการสังเกตจะใกล้เคียงกับเส้นตรงเนื่องจากเป็นส่วนแรก นอกจากนี้ให้สังเกตมาตราส่วนที่ต่างกันมากบนแกน y สำหรับแปลง
เชลดอน

15

สมมติว่าชุดข้อมูลของคุณถูกเรียกwordsและมีcountsคอลัมน์คุณสามารถพล็อตฮิสโตแกรมเพื่อให้เห็นภาพของการแจกแจง:

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

โดยที่ 100 คือจำนวนของช่องเก็บ

คุณสามารถทำพล็อต QQ ปกติโดยใช้

qqnorm(words$counts)

ในที่สุดคุณสามารถใช้การทดสอบ Shapiro-Wilk เพื่อความปกติ

shapiro.test(word$counts)

แม้ว่าให้ดูที่การสนทนานี้: การทดสอบตามปกติ: 'ไร้ประโยชน์เป็นหลัก?'


14

ไม่มีการทดสอบจะแสดงให้คุณเห็นว่าข้อมูลของคุณมีการแจกแจงแบบปกติ - มันจะสามารถแสดงให้คุณเห็นได้เมื่อข้อมูลนั้นไม่สอดคล้องกับปกติที่คุณจะปฏิเสธการเป็นโมฆะ

แต่การนับไม่ปกติในกรณีใด ๆ พวกเขาเป็นจำนวนเต็มบวก - ความน่าจะเป็นที่การสังเกตจากการแจกแจงแบบปกติจะใช้ค่าที่ไม่ใช่จำนวนเต็มคืออะไร (... นั่นเป็นเหตุการณ์ที่น่าจะเป็น 1)

ทำไมคุณต้องทดสอบความเป็นปกติในกรณีนี้ เห็นได้ชัดว่าไม่จริง

[ในบางกรณีอาจไม่จำเป็นว่าคุณสามารถบอกได้ว่าข้อมูลของคุณไม่ปกติ ข้อมูลจริงจะไม่ถูกดึงออกมาจากการแจกแจงแบบปกติ

หากคุณจำเป็นต้องทำการทดสอบจริง ๆ การทดสอบชาปิโร - วิลค์ ( ?shapiro.test) เป็นการทดสอบทั่วไปที่ดีเกี่ยวกับกฎเกณฑ์ทั่วไปที่ใช้กันอย่างแพร่หลาย


9

วิธีที่เป็นทางการมากขึ้นในการดูบรรทัดฐานคือการทดสอบว่าความโด่งและความเบ้แตกต่างจากศูนย์อย่างมีนัยสำคัญหรือไม่

ในการทำเช่นนี้เราจำเป็นต้องได้รับ:

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 และ:

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
}

สำหรับความเบ้

การทดสอบทั้งสองนี้เป็นแบบทางด้านเดียวดังนั้นคุณจะต้องคูณค่า p ด้วย 2 เพื่อให้เป็นแบบสองด้าน หากค่า p ของคุณมากกว่าหนึ่งคุณจะต้องใช้ 1-kurtosis.test () แทน kurtosis.test

หากคุณมีคำถามอื่น ๆ คุณสามารถส่งอีเมลฉันที่ j.bredman@gmail.com


อะไรคือความแตกต่างของฟังก์ชั่นทั้งสองข้างต้นเกี่ยวกับkurtosis()และskewness()ฟังก์ชั่นจากแพ็คเกจช่วงเวลาคืออะไร? ผลลัพธ์ที่ใช้rnorm()ตัวอย่างแตกต่างกัน
Nikos Alexandris

5

นอกจากการทดสอบ Shapiro-Wilk ของแพ็คเกจสถิติแล้วแพ็คเกจ nortest (มีให้ใน CRAN) ยังมีการทดสอบตามปกติอื่น ๆ


4

โดยใช้nortestแพ็คเกจของ R การทดสอบเหล่านี้สามารถทำได้:

  • ดำเนินการทดสอบความเป็นบรรทัดฐานของ Anderson-Darling

    ad.test(data1)
  • ทำการทดสอบCramér-von Mises เพื่อความเป็นมาตรฐาน

    cvm.test(data1)
  • ดำเนินการทดสอบ Chi-Square ของ Pearson เพื่อความปกติ

    pearson.test(data1)
  • ทำการทดสอบ Shapiro-Francia เพื่อความปกติ

    sf.test(data1)

การทดสอบอื่น ๆ สามารถทำได้โดยใช้normtestแพ็คเกจ ดูคำอธิบายได้ที่ https://cran.r-project.org/web/packages/normtest/normtest.pdf


@ Nick; ฉันได้กล่าวถึงการทดสอบเหล่านี้จากแพ็คเกจ'nortest'ที่นี่: ( cran.r-project.org/web/packages/nortest/nortest.pdf ) แพ็คเกจที่มีประโยชน์อื่น ๆ คือ'normtest'ตามที่กล่าวไว้ข้างต้น
ดร. Nisha Arora

โอเคขอบคุณ. ในความไม่รู้ของฉันฉันคิดว่าชื่อหนึ่งเป็นตัวพิมพ์ผิด
Nick Cox
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.