ฉันจะทดสอบความเป็นธรรมของ d20 ได้อย่างไร?


29

ฉันจะทดสอบความเป็นธรรมของผู้ตายยี่สิบคน (d20) ได้อย่างไร? เห็นได้ชัดว่าฉันจะเปรียบเทียบการกระจายตัวของค่าเทียบกับการกระจายตัวแบบสม่ำเสมอ ฉันจำไม่ได้ว่าใช้การทดสอบ Chi-Square ในวิทยาลัย ฉันจะใช้สิ่งนี้เพื่อดูว่าผู้ตายมีความยุติธรรมได้อย่างไร


ฉันคิดเกี่ยวกับการทดสอบสำหรับ d6 (หกด้านตาย) รวมถึงการหาจำนวนม้วนที่จำเป็นในการทดสอบ มันเป็นพื้นฐานมาก แต่อย่างไรก็ตามใช้เวลานานในการคำนวณ มีลักษณะที่localtrainbeplac.bplaced.net/die.php

คำตอบ:


15

นี่คือตัวอย่างที่มีรหัส R เอาต์พุตจะถูกนำหน้าด้วย # 's ยุติธรรมตาย:

rolls <- sample(1:20, 200, replace = T)
table(rolls)
#rolls
# 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 
# 7  8 11  9 12 14  9 14 11  7 11 10 13  8  8  5 13  9 10 11 
 chisq.test(table(rolls), p = rep(0.05, 20))

#         Chi-squared test for given probabilities
#
# data:  table(rolls) 
# X-squared = 11.6, df = 19, p-value = 0.902

ลำเอียงตาย - หมายเลข 1 ถึง 10 แต่ละตัวมีความน่าจะเป็น 0.045 ผู้ที่ 11-20 มีความน่าจะเป็น 0.055 - 200 ทุ่ม:

rolls <- sample(1:20, 200, replace = T, prob=cbind(rep(0.045,10), rep(0.055,10)))
table(rolls)
#rolls
# 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 
# 8  9  7 12  9  7 14  5 10 12 11 13 14 16  6 10 10  7  9 11 
chisq.test(table(rolls), p = rep(0.05, 20))

#        Chi-squared test for given probabilities
#
# data:  table(rolls) 
# X-squared = 16.2, df = 19, p-value = 0.6439

เรามีหลักฐานการอคติไม่เพียงพอ (p = 0.64)

ผู้มีอคติตาย 1,000 โยน:

rolls <- sample(1:20, 1000, replace = T, prob=cbind(rep(0.045,10), rep(0.055,10)))
table(rolls)
#rolls
# 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 
# 42 47 34 42 47 45 48 43 42 45 52 50 57 57 60 68 49 67 42 63 
chisq.test(table(rolls), p = rep(0.05, 20))

#        Chi-squared test for given probabilities
#
# data:  table(rolls) 
# X-squared = 32.36, df = 19, p-value = 0.02846

ตอนนี้ p <0.05 และเราเริ่มเห็นหลักฐานการมีอคติ คุณสามารถใช้แบบจำลองที่คล้ายกันเพื่อประเมินระดับความลำเอียงที่คุณคาดว่าจะตรวจพบและจำนวนการโยนที่จำเป็นในการตรวจจับด้วยระดับ p ที่กำหนด

ว้าวอีก 2 คำตอบก่อนที่ฉันจะพิมพ์เสร็จ


คำตอบทั้งหมดคล้ายกัน แต่แตกต่างกันเล็กน้อย ฉันไม่คิดว่ามันสำคัญจริงๆ
csgillespie

ขอบคุณสำหรับคำตอบ. ฉันยอมรับสิ่งนี้เพราะมันรวมสิ่งใหม่ ๆ เกี่ยวกับค่า p และการปฏิเสธ
C. Ross

10

คุณต้องการที่จะทำมันด้วยมือหรือใน excel?

หากคุณต้องการทำในRคุณสามารถทำได้ด้วยวิธีนี้:

ขั้นตอนที่ 1: กลิ้งตายของคุณ (สมมติว่า) 100 ครั้ง

ขั้นตอนที่ 2: นับจำนวนครั้งที่คุณได้รับแต่ละหมายเลข

ขั้นตอนที่ 3: ใส่ไว้ใน R ดังนี้ (เขียนจำนวนครั้งที่คุณได้รับแต่ละม้วนตายแทนตัวเลขที่ฉันเขียน):

x <- as.table(c(1,2,3,4,5,6,7,80,9,10,11,12,13,14,15,16,17,18,19,20))

ขั้นตอนที่ 4: เรียกใช้คำสั่งนี้:

chisq.test(x)

หากค่า P ต่ำ (เช่น: bellow 0.05) - การตายของคุณไม่สมดุล

คำสั่งนี้จำลองสมดุลดาย (P = ~ .5):

chisq.test(table(sample(1:20, 100, T)))

และนี่เป็นการจำลองการตายแบบไม่สมดุลย์:

chisq.test(table(c(rep(20,10),sample(1:20, 100, T))))

(มันเป็นเรื่องเกี่ยวกับ P = ~ .005)

ตอนนี้คำถามที่แท้จริงคือจำนวนที่ควรรีดตายไปจนถึงระดับของการตรวจจับระดับใด หากมีคนต้องการที่จะแก้ปัญหานั้นเขายินดี ...

ปรับปรุง: นอกจากนี้ยังมีบทความที่ดีเกี่ยวกับหัวข้อนี้ที่นี่


5
+1 สำหรับการอ้างอิง: มันเป็นบทความที่ยาวเกี่ยวกับการทดสอบแม่พิมพ์ในทางปฏิบัติ ผู้เขียนเสนอครึ่งหนึ่งโดยใช้การทดสอบ KS และจากนั้นจะเข้าไปหาวิธีการระบุรูปแบบเฉพาะของการเบี่ยงเบนจากความยุติธรรม เขายังตระหนักดีว่าไคสแควร์เป็นตัวประมาณสำหรับม้วนเล็ก ๆ ต่อหน้า (เช่นสำหรับ 100 ม้วนของตาย 20 ด้าน), พลังนั้นแตกต่างกันไป ฯลฯ ในระยะสั้นอะไรที่ OP ต้องการ รู้ว่าวางไว้อย่างชัดเจน
whuber

8

n=37

ครั้งแรกในสอดคล้องกับสิ่งที่ @Glen_b กล่าวว่าคชกรรมไม่สนใจจริงหรือไม่ตายเป็นว่ายุติธรรม - มันไม่ได้ สิ่งที่เขาใส่ใจคือว่ามันใกล้พอหรือไม่อะไรก็ตามที่ "พอ" หมายถึงในบริบทนั้นพูดว่าภายใน 5% ของความยุติธรรมสำหรับแต่ละด้าน

พี1พี2พี3พี=(พี1,พี2,พี3)พี1+พี2+พี3=1α0=(1,1,1)

X=(X1,X2,X3)Xพี=(พี1,พี2,พี3)α=(x1+1,x2+1,x3+1)

พี

อย่างไรก็ตามนี่คือวิธี (กับ R):

ก่อนอื่นรับข้อมูล เรากลิ้งผู้ตาย 500 ครั้ง

set.seed(1)
y <- rmultinom(1, size = 500, prob = c(1,1,1))

(เราเริ่มต้นด้วยการตายอย่างยุติธรรมในทางปฏิบัติข้อมูลเหล่านี้จะถูกสังเกต)

พี

library(MCMCpack)
A <- MCmultinomdirichlet(y, alpha0 = c(1,1,1), mc = 5000)
plot(A)
summary(A)

ในที่สุดเรามาประเมินความน่าจะเป็นด้านหลังของเรา (หลังจากการสังเกตข้อมูล) ว่าคนตายอยู่ในระดับ 0.05 ของความยุติธรรมในแต่ละพิกัด

B <- as.matrix(A)
f <- function(x) all((x > 0.28)*(x < 0.38))
mean(apply(B, MARGIN = 1, FUN = f))

ผลลัพธ์ประมาณ 0.9486 ในเครื่องของฉัน (ไม่แปลกใจจริง ๆ เราเริ่มต้นด้วยความตายอย่างยุติธรรมหลังจากทั้งหมด)

คำพูดด่วน: มันอาจจะไม่สมเหตุสมผลที่เราจะใช้แบบไม่ให้ข้อมูลมาก่อนในตัวอย่างนี้ เนื่องจากมีแม้แต่คำถามที่น่าจะเป็นไปได้แม่พิมพ์นั้นดูสมดุลกันตั้งแต่แรกดังนั้นจึงเป็นการดีกว่าถ้าคุณเลือกรุ่นก่อนที่มีความเข้มข้นใกล้กับ 1/3 ในทุกพิกัด เหนือสิ่งนี้จะทำให้ความน่าจะเป็นด้านหลังของเราที่ "ใกล้ยุติธรรม" สูงขึ้น


8

การทดสอบความฟิตแบบไคสแควร์มีจุดมุ่งหมายเพื่อค้นหาความเบี่ยงเบนทุกประเภทที่เป็นไปได้จากความสม่ำเสมอที่เข้มงวด สิ่งนี้สมเหตุสมผลกับ d4 หรือ d6 แต่ด้วย d20 คุณอาจสนใจในการตรวจสอบว่าความน่าจะเป็นที่คุณหมุน (หรืออาจเกิน) แต่ละผลลัพธ์นั้นใกล้เคียงกับที่ควรจะเป็น

สิ่งที่ฉันได้รับคือมีความเบี่ยงเบนบางอย่างจากความเป็นธรรมที่จะส่งผลกระทบอย่างหนักกับสิ่งที่คุณใช้ d20 และความเบี่ยงเบนประเภทอื่น ๆ ที่แทบไม่มีความสำคัญเลยและการทดสอบไคสแควร์จะแบ่งอำนาจระหว่างสิ่งที่น่าสนใจมากขึ้น และทางเลือกที่น่าสนใจน้อยกว่า ผลที่ตามมาก็คือว่าจะมีพลังมากพอที่จะรับแม้กระทั่งการเบี่ยงเบนค่อนข้างปานกลางจากความเป็นธรรม, คุณจำเป็นต้องมีขนาดใหญ่จำนวนม้วน - ไกลมากขึ้นกว่าที่คุณเคยต้องการที่จะนั่งและสร้าง

(คำแนะนำ: หาค่าความน่าจะเป็นแบบไม่สม่ำเสมอสองสามชุดสำหรับ d20 ของคุณที่จะส่งผลกระทบอย่างหนักกับผลลัพธ์ที่คุณใช้กับ d20 และใช้การจำลองและการทดสอบไคสแควร์เพื่อหาพลังที่คุณมีต่อพวกเขาสำหรับ จำนวนม้วนต่าง ๆ ดังนั้นคุณจะได้ทราบจำนวนม้วนที่คุณต้องการ)

มีหลากหลายวิธีในการตรวจสอบการเบี่ยงเบนที่ "น่าสนใจ" (วิธีที่มีแนวโน้มที่จะส่งผลกระทบอย่างมากต่อการใช้งานทั่วไปของ d20)

คำแนะนำของฉันคือทำการทดสอบ ECDF (การทดสอบประเภท Kolmogorov-Smirnov / Anderson-Darling) - แต่คุณอาจต้องการปรับเพื่อการอนุรักษ์ที่เป็นผลมาจากการกระจายแบบไม่ต่อเนื่อง - อย่างน้อยก็ยกระดับอัลฟาเล็กน้อย ดีกว่าโดยการจำลองการแจกแจงเพื่อดูว่าการกระจายตัวของสถิติทดสอบเป็นอย่างไรสำหรับ d20)

สิ่งเหล่านี้ยังคงสามารถรับความเบี่ยงเบนใด ๆ ได้ แต่พวกมันให้น้ำหนักที่มากกว่าสำหรับการเบี่ยงเบนที่สำคัญกว่า

แนวทางที่มีประสิทธิภาพยิ่งขึ้นคือการสร้างสถิติการทดสอบที่เฉพาะเจาะจงกับทางเลือกที่สำคัญที่สุดสำหรับคุณโดยเฉพาะ แต่มันเกี่ยวข้องกับการทำงานอีกเล็กน้อย


ในคำตอบนี้ฉันขอแนะนำวิธีกราฟิกสำหรับการทดสอบแม่พิมพ์ตามขนาดของการเบี่ยงเบนของแต่ละบุคคล เช่นเดียวกับการทดสอบไคสแควร์ทำให้มีความเหมาะสมมากขึ้นสำหรับลูกเต๋าที่มีด้านน้อยเช่น d4 หรือ d6


7

หากคุณสนใจเพียงแค่ตรวจสอบจำนวนครั้งที่แต่ละหมายเลขปรากฏขึ้นการทดสอบ Chi-squared จะเหมาะสม สมมติว่าคุณหมุนตาย N ครั้ง คุณคาดว่าแต่ละค่าจะเกิดขึ้น N / 20 ครั้ง การทดสอบไคสแควร์ทั้งหมดเป็นการเปรียบเทียบสิ่งที่คุณสังเกตเห็นกับสิ่งที่คุณได้รับ หากความแตกต่างนี้มีขนาดใหญ่เกินไปก็จะบ่งบอกถึงปัญหา

การทดสอบอื่น ๆ

หากคุณมีความสนใจในด้านอื่น ๆ ของความแรนด์เช่นถ้าคุณให้ลูกเต๋าต่อไปนี้:

1, 2, 3, 4...., 20,1,2,..

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

การทดสอบไคสแควร์ใน R

ใน R นี้จะเป็น

##Roll 200 times
> rolls = sample(1:20, 200, replace=TRUE)
> chisq.test(table(rolls), p = rep(0.05, 20))
    Chi-squared test for given probabilities
data:  table(rolls) 
X-squared = 16.2, df = 19, p-value = 0.6439

## Too many 1's in the sample
> badrolls = cbind(rolls, rep(1, 10))   
> chisq.test(table(badrolls), p = rep(0.05, 20))

    Chi-squared test for given probabilities

data:  table(badrolls) 
X-squared = 1848.1, df = 19, p-value < 2.2e-16

0

บางทีหนึ่งไม่ควรมุ่งเน้นมากในชุดม้วนหนึ่ง

ลองกลิ้ง 6 ข้างตาย 10 ครั้งและทำซ้ำกระบวนการ 8 ครั้ง

> xy <- rmultinom(10, n = N, prob = rep(1, K)/K)
> xy
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    3    1    0    0    1    1    2    1
[2,]    0    0    1    2    1    1    0    1
[3,]    1    3    6    0    1    3    2    4
[4,]    2    1    0    5    2    0    2    1
[5,]    3    2    0    2    1    3    3    0
[6,]    1    3    3    1    4    2    1    3

คุณสามารถตรวจสอบว่ายอดรวมของการทำซ้ำแต่ละครั้งจะเท่ากับ 10

> apply(xy, MARGIN = 2, FUN = sum)
[1] 10 10 10 10 10 10 10 10

สำหรับการทำซ้ำแต่ละครั้ง (คอลัมน์ฉลาด) คุณสามารถคำนวณความดีของความพอดีโดยใช้การทดสอบ Chi ^ 2

unlist(unname(sapply(apply(xy, MARGIN = 2, FUN = chisq.test), "[", "p.value")))
[1] 0.493373524 0.493373524 0.003491841 0.064663031 0.493373524 0.493373524 0.669182902
[8] 0.235944538

ยิ่งคุณทำมากเท่าไหร่คุณก็จะเห็นอคติน้อยลงเท่านั้น มาทำสิ่งนี้กันเป็นจำนวนมาก

K <- 20
N <- 10000

xy <- rmultinom(100, n = N, prob = rep(1, K)/K)
hist(unlist(unname(sapply(apply(xy, MARGIN = 2, FUN = chisq.test), "[", "p.value"))))

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

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