การทดสอบข้อมูลที่สร้างแบบสุ่มกับการกระจายที่ต้องการ


17

ฉันได้เขียนโปรแกรมที่สร้างข้อมูลแบบสุ่ม หากโปรแกรมทำงานอย่างถูกต้องข้อมูลนั้นควรเป็นไปตามการแจกแจงความน่าจะเป็นที่ทราบ ฉันต้องการรันโปรแกรมทำการคำนวณผลและคิดค่า p

ก่อนใครบอกว่า: ฉันเข้าใจว่าการทดสอบสมมติฐานไม่สามารถตรวจพบเมื่อโปรแกรมทำงานอย่างถูกต้อง สามารถตรวจพบได้เมื่อทำงานไม่ถูกต้องในวิธีเฉพาะ (และถึงตอนนั้นการทดสอบ "ควร" ล้มเหลว X% ของเวลาขึ้นอยู่กับระดับความสำคัญที่คุณเลือก ... )

ดังนั้นฉันพยายามทำความเข้าใจว่าเครื่องมือใดที่เหมาะสม โดยเฉพาะอย่างยิ่ง:

  • ฉันสามารถสร้างข้อมูลสุ่มได้มากเท่าที่ต้องการ สิ่งที่ฉันต้องทำก็คือปล่อยให้โปรแกรมทำงานนานพอ ดังนั้นฉันจึงไม่ จำกัด ขนาดตัวอย่างเฉพาะใด ๆ

  • ฉันสนใจในเทคนิคที่สร้างค่า p ดังนั้นการจ้องมองที่กราฟและพูดว่า "ใช่ที่ดูเหมือนเชิงเส้นเชิงเส้น" ไม่ใช่ตัวเลือกที่น่าสนใจ เว้นแต่จะมีวิธีการใส่ตัวเลขจำนวนมากลงใน "ความไร้ประโยชน์" ของกราฟ ;-)

สิ่งที่ฉันรู้จนถึงตอนนี้:

  • ฉันได้เห็นสามประเภทหลักของการทดสอบที่กล่าวถึงซึ่งดูเหมือนว่าพวกเขาจะสามารถใช้งานได้: [เพียร์สัน] การทดสอบไคสแควร์, การทดสอบ Kolmogorov-Smirnov และการทดสอบ Anderson-Darling

  • ปรากฏว่าการทดสอบไคสแควร์เป็นที่เหมาะสมสำหรับต่อเนื่องกระจายในขณะที่อีกสองคนที่มีความเหมาะสมมากขึ้นสำหรับการอย่างต่อเนื่องกระจาย (?)

  • แหล่งข้อมูลหลายแห่งระบุว่าการทดสอบโฆษณานั้น "ดีกว่า" กว่าการทดสอบ KS แต่ไม่สามารถระบุรายละเอียดเพิ่มเติมได้

ในที่สุดการทดสอบทั้งหมดเหล่านี้น่าจะตรวจพบ "วิธีที่แตกต่าง" ของการเบี่ยงเบนจากการแจกแจงโมฆะที่ระบุ แต่ฉันไม่รู้จริง ๆ ว่าความแตกต่างยังเป็นอย่างไร ... โดยสรุปฉันกำลังมองหาคำอธิบายทั่วไปที่ใช้กับการทดสอบแต่ละประเภทได้ดีที่สุดและปัญหาที่ตรวจพบได้ดีที่สุด


หากคุณเขียนของคุณเองมันเกือบจะเป็น 'ล้มเหลว' เมื่อคุณผ่านขีดจำกัดความรู้ของคุณ (ซึ่งคุณได้ฝังไว้ในการออกแบบ) มีลักษณะที่random.org/analysisซึ่งรายการบางส่วนของวิธีการตรวจสอบและเห็นได้ชัดstackoverflow.com/q/2130621/717355 ในทางปรัชญาหากโปรแกรมกำหนดขึ้นมาแล้วมันไม่สามารถสุ่มได้เลย ;-) มันเป็นเรื่องที่คุ้มค่าที่จะเรียนรู้
Philip Oakley

คำตอบ:


21

นี่คือคำอธิบายทั่วไปเกี่ยวกับวิธีการทำงานของ 3 วิธีที่กล่าวถึง

วิธี Chi-Squared ทำงานโดยเปรียบเทียบจำนวนการสังเกตในถังขยะกับจำนวนที่คาดว่าจะอยู่ในถังขยะตามการกระจาย สำหรับการกระจายแบบไม่ต่อเนื่องถังขยะมักจะมีความเป็นไปได้โดยสิ้นเชิงหรือการรวมกันของสิ่งเหล่านั้น สำหรับการกระจายอย่างต่อเนื่องคุณสามารถเลือกจุดตัดเพื่อสร้างถังขยะ ฟังก์ชั่นมากมายที่ใช้สิ่งนี้จะสร้างถังขยะโดยอัตโนมัติ แต่คุณควรจะสร้างถังขยะของคุณเองถ้าคุณต้องการเปรียบเทียบในพื้นที่เฉพาะ ข้อเสียของวิธีนี้คือความแตกต่างระหว่างการแจกแจงเชิงทฤษฎีและข้อมูลเชิงประจักษ์ที่ยังคงใส่ค่าในถังขยะเดียวกันจะไม่ถูกตรวจพบตัวอย่างจะปัดเศษหากในทางทฤษฎีตัวเลขระหว่าง 2 ถึง 3 ควรกระจายไปทั่วช่วง (เราคาดว่าจะเห็นค่าเช่น 2.34296)

สถิติการทดสอบ KS คือระยะทางสูงสุดระหว่าง 2 ฟังก์ชันการแจกแจงสะสมที่ถูกเปรียบเทียบ (มักเป็นทฤษฎีและเชิงประจักษ์) หากการแจกแจงความน่าจะเป็น 2 มีเพียงจุดตัด 1 จุดดังนั้น 1 ลบระยะทางสูงสุดคือพื้นที่ของการทับซ้อนระหว่างการแจกแจงความน่าจะเป็น 2 (สิ่งนี้จะช่วยให้บางคนมองเห็นสิ่งที่กำลังวัด) นึกถึงการพล็อตบนพล็อตเดียวกันกับฟังก์ชั่นการแจกแจงเชิงทฤษฎีและ EDF จากนั้นวัดระยะห่างระหว่าง 2 "ส่วนโค้ง" ความแตกต่างที่ใหญ่ที่สุดคือสถิติการทดสอบและเปรียบเทียบกับการกระจายของค่าสำหรับกรณีนี้ ความแตกต่างนี้คือรูปร่างของการแจกแจงหรือการกระจาย 1 การขยับหรือยืดเมื่อเทียบกับการกระจายอื่น ๆ1n

การทดสอบแอนเดอร์สัน - ดาร์ลิ่งยังใช้ความแตกต่างระหว่างเส้นโค้ง CDF เช่นการทดสอบ KS แต่แทนที่จะใช้ความแตกต่างสูงสุดมันใช้ฟังก์ชั่นของพื้นที่ทั้งหมดระหว่าง 2 เส้นโค้ง (จริง ๆ แล้วมันยกกำลังสองให้แตกต่างกัน มีอิทธิพลมากขึ้นแล้วรวมเข้ากับโดเมนของการแจกแจง) สิ่งนี้ให้น้ำหนักมากกว่าค่าผิดปกติกว่า KS และยังให้น้ำหนักมากกว่าถ้ามีความแตกต่างเล็ก ๆ น้อย ๆ หลายประการ (เทียบกับ 1 ความแตกต่างใหญ่ที่ KS จะเน้น) สิ่งนี้อาจสิ้นสุดการทดสอบเพื่อเอาชนะความแตกต่างที่คุณจะพิจารณาว่าไม่สำคัญ (การปัดเศษแบบไม่รุนแรงเป็นต้น) เช่นเดียวกับการทดสอบของ KS นี่ถือว่าคุณไม่ได้ประมาณค่าพารามิเตอร์จากข้อมูล

นี่คือกราฟเพื่อแสดงแนวคิดทั่วไปของ 2 ตัวสุดท้าย:

ป้อนคำอธิบายรูปภาพที่นี่

ตามรหัส R นี้:

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)

กราฟด้านบนแสดง EDF ของตัวอย่างจากมาตรฐานปกติเปรียบเทียบกับ CDF ของมาตรฐานปกติด้วยเส้นที่แสดงสถิติ KS กราฟกลางจะแสดงความแตกต่างใน 2 เส้นโค้ง (คุณสามารถดูได้ว่าเกิดสถิติ KS) ด้านล่างคือความแตกต่างยกกำลังสองน้ำหนักทดสอบโฆษณาขึ้นอยู่กับพื้นที่ใต้เส้นโค้งนี้ (สมมติว่าฉันได้ทุกอย่างถูกต้อง)

การทดสอบอื่น ๆ ดูที่สหสัมพันธ์ใน qqplot ดูที่ความชันใน qqplot เปรียบเทียบค่าเฉลี่ย, var และสถิติอื่น ๆ ตามช่วงเวลา


+1 นี่เป็นคำตอบที่ดีสำหรับคำถามจริง (ต่างจากของฉัน ... ) คำอธิบายที่ทำงานกลางย่อหน้าที่ 3 เพียงแค่ขอให้มีภาพตัวอย่างหากคุณรู้สึกอยากจะทำมัน
gung - Reinstate Monica

นั่นเป็นคำตอบที่ดีจริงๆ เพื่อให้แน่ใจว่าฉันเข้าใจอย่างถ่องแท้: การทดสอบ KS คืนค่าเบี่ยงเบนที่ใหญ่ที่สุดระหว่าง CDF และ EDF ในขณะที่ AD ส่งคืนค่าพื้นที่ถ่วงน้ำหนักรวมระหว่างเส้นโค้งทั้งสอง
ทางคณิตศาสตร์

@ MathematicalOrchid ส่วนใหญ่ถูกต้องโฆษณากำลังสองระยะทางจากนั้นน้ำหนักแล้วรวมเข้าด้วยกันดังนั้นมันจึงค่อนข้างแตกต่างจากพื้นที่ (แต่สำหรับการทำความเข้าใจคิดว่ามันเป็นพื้นที่อาจจะโอเคและง่ายกว่ามาก)
เกร็กสโนว์

1
ฉันคาดหวังว่าหากการกระจายทางทฤษฎีของคุณมีจุดมวล (กระโดดในแนวดิ่งใน CDF ณ จุดที่กำหนด) และการกระจายข้อมูลที่แท้จริงของคุณมีมวลเป็นจุดที่เกือบ แต่ไม่มากสถานที่เดียวกันการทดสอบ KS อาจดีกว่า เพื่อทดสอบโฆษณา แต่กรณีนั้นน่าจะเป็นเรื่องเล็กน้อย การทดสอบ KS อนุญาตสำหรับการทดสอบแบบ 1 ด้านที่โฆษณานั้นเป็นแบบ 2 ด้านเสมอดังนั้นมันจะเป็นความแตกต่างอื่น (ไม่ใช่เรื่องธรรมดา)
Greg Snow

2
ฉันไม่ชอบการกำหนดลักษณะทางคณิตศาสตร์คณิตศาสตร์ @ ที่สถิติ KS ขึ้นอยู่กับ "หนึ่งจุดสุดยอด" ตำแหน่งของ "จุดหนึ่ง" (มักจะอยู่ตรงกลางของการกระจาย) ใน CDF ขึ้นอยู่กับค่าของจุดอื่น ๆ ในชุดและดังนั้นจึงไม่โดดเดี่ยวหรือโดดเดี่ยวเหมือนภาษาที่จะแนะนำให้ฟังไร้เดียงสา
DWIN

12

+1 สำหรับการเขียนคำถามที่ชัดเจนและละเอียด ฉันหวังว่าคำตอบของฉันจะไม่หงุดหงิดเกินไป ฉันเชื่อว่าการทดสอบสมมติฐานไม่ใช่วิธีการที่เหมาะสมในกรณีของคุณ การทดสอบสมมติฐานอย่างมีนัยสำคัญเป็นสิ่งที่เหมาะสมที่จะทำอย่างไรเมื่อคำตอบอาจจะใช่หรือไม่, แต่คุณไม่ทราบว่า (น่าเสียดายที่มันไม่ได้บอกคุณจริงๆ แต่นี่เป็นปัญหาอื่น) ในกรณีของคุณฉันรวบรวมคุณต้องการทราบว่าอัลกอริทึมของคุณดีหรือไม่ อย่างไรก็ตามเป็นที่รู้จักกัน (อย่างแน่นอน) ว่าไม่มีโปรแกรมคอมพิวเตอร์ใดที่สามารถสร้างข้อมูลแบบสุ่มอย่างแท้จริงจากการแจกแจงความน่าจะเป็นใด ๆ นี่เป็นความจริงประการแรกเนื่องจากคอมพิวเตอร์ทุกเครื่องเป็นเครื่องสถานะ จำกัดและทำให้สามารถผลิตตัวเลขหลอกเทียมเท่านั้น. นอกจากนี้ (การตั้งค่าการขาดแบบแผนที่แท้จริงกัน) เป็นไปไม่ได้ที่ค่าที่สร้างขึ้นจะเป็นไปตามการกระจายอย่างต่อเนื่อง มีหลายวิธีที่จะเข้าใจสิ่งนี้ แต่บางทีสิ่งที่ง่ายที่สุดคือจะมี 'ช่องว่าง' ในบรรทัดตัวเลขซึ่งไม่เป็นความจริงของตัวแปรสุ่มแบบต่อเนื่อง ยิ่งไปกว่านั้นช่องว่างเหล่านี้ไม่ได้กว้างเท่ากันอย่างสมบูรณ์หรือเว้นระยะเท่ากันอย่างสมบูรณ์ ในบรรดานักวิทยาศาสตร์คอมพิวเตอร์ที่ทำงานเกี่ยวกับการสร้างตัวเลขหลอกเทียมชื่อของเกมคือการปรับปรุงอัลกอริธึมที่ทำให้ช่องว่างมีขนาดเล็กมากยิ่งขึ้นด้วยระยะเวลาที่ยาวนานขึ้น ข้อเท็จจริงเหล่านี้พิสูจน์ว่าการทดสอบสมมติฐานเป็นวิธีการที่ไม่ถูกต้องในการพิจารณาว่าอัลกอริทึมของคุณติดตาม "การกระจายความน่าจะเป็นที่เฉพาะเจาะจงหรือไม่" เพราะมันไม่ใช่ (ขออภัย.)

กรอบงานที่เหมาะสมยิ่งขึ้นคือการพิจารณาว่าข้อมูลของคุณใกล้กับการกระจายเชิงทฤษฎีมากน้อยเพียงใด สำหรับเรื่องนี้ฉันจะแนะนำให้ทบทวนแปลงโดยเฉพาะqq-plotsและpp-plots1-βR=1

ในบันทึกอื่น ๆ เกี่ยวกับการประเมินคุณภาพของอัลกอริทึมของคุณคุณอาจต้องการเวลาที่สัมพันธ์กับ pRNG มาตรฐานอื่น ๆ

หวังว่านี่จะช่วยได้


ไม่ใช่สิ่งที่ฉันขออย่างแม่นยำ ฉันเข้าใจโดย "ไม่ต่อเนื่อง" โดยทั่วไปคุณอ้างถึงข้อเท็จจริงที่ว่าคอมพิวเตอร์ไม่ได้ใช้เลขคณิตความแม่นยำที่ไม่สิ้นสุด?
คณิตศาสตร์ออร์คิด

นั่นเป็นส่วนใหญ่ของมัน แต่ไม่ใช่ทั้งหมดของปัญหา นี่คือหัวข้อที่ซับซ้อนอย่างมาก
gung - Reinstate Monica

1
แนวคิดบางประการของย่อหน้าแรกของ @ gung ถูกนำไปใช้ในฟังก์ชันSnowsPenultimateNormalityTestในTeachingDemosแพ็คเกจสำหรับ R. ฉันเห็นด้วยกับความคิดของ @ gung ที่มองการวัดความใกล้ชิดแทนที่จะมุ่งเน้นที่ค่า p ปัญหาอย่างหนึ่งของการใช้สหสัมพันธ์ในพล็อต qq สำหรับเรื่องนี้ก็คือถ้าข้อมูลของคุณมีรูปร่างที่ถูกต้อง แต่ค่าเฉลี่ยความแปรปรวน ฯลฯ ที่แตกต่างกันคุณจะยังคงได้รับความสัมพันธ์ที่สูงมาก อีกทางเลือกหนึ่งคือการใช้สถิติ KS หรือสถิติโฆษณาเป็นมาตรการของความแตกต่างจากทฤษฎี
Greg Snow

@ gung ขอบคุณสำหรับคำตอบ คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับ“ การแปลงข้อมูลของคุณอย่างเหมาะสมสำหรับการพล็อตและการคำนวณค่าที่สอดคล้องกันจากการแจกแจงเชิงทฤษฎีที่เป็นปัญหาคุณสามารถสร้างความสัมพันธ์ได้” มีการคำนวณข้อมูลสำหรับ pp- หรือ qq-plotting แล้วขั้นตอนต่อไปที่จะได้คะแนน r ที่คุณพูดถึงคืออะไร? มันเป็นแบบทดสอบที่รู้จักกันดี? คุณช่วยอ้างอิงได้ไหม ขอขอบคุณ!
อีวาน

1

ฉันยังไม่ได้อ่านคำตอบทั้งหมด แต่ฉันเห็นว่ามันค่อนข้างละเอียดและแม่นยำ ใช้ความเสี่ยงที่ฉันทำซ้ำสิ่งที่ฝังอยู่ในคำตอบยาว ๆ ฉันแค่อยากจะบอกว่า v = การทดสอบไคสแควร์สามารถใช้สำหรับข้อมูลต่อเนื่อง มันอาจไม่ใช่การทดสอบที่ดีที่สุดและเหมือนกับการทดสอบหลายอย่างที่ต้องอาศัยทฤษฎีแบบอะซิมโทติคและอาจไม่แม่นยำในตัวอย่างขนาดเล็กที่มีเซลล์หร็อมแหร็ม แอนเดอร์สันดาร์ลิ่งมีประสิทธิภาพในการทดสอบความเป็นมาตรฐานมากกว่าการทดสอบ KS แต่แคนซัสอาจดีกว่าสำหรับการแจกแจงแบบต่อเนื่องอื่น ๆ Lillefors มีการทดสอบที่ออกแบบมาสำหรับการแจกแจงแบบเลขชี้กำลัง

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