Bagaimana saya bisa menguji kewajaran d20?

29

Bagaimana saya bisa menguji keadilan dadu dua sisi (d20)? Jelas saya akan membandingkan distribusi nilai dengan distribusi yang seragam. Samar-samar saya ingat menggunakan tes Chi-square di perguruan tinggi. Bagaimana saya bisa menerapkan ini untuk melihat apakah mati itu adil?

C. Ross
sumber
Saya sudah memikirkan tes untuk d6 (enam sisi mati). Ini termasuk menemukan jumlah gulungan yang perlu diuji. Ini sangat mendasar tetapi tetap membutuhkan waktu lama untuk menghitung. Lihat localtrainbeplac.bplaced.net/die.php .

Jawaban:

15

Berikut ini contoh dengan kode R. Output didahului oleh # 's. Die fair:

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

Die bias - angka 1 hingga 10 masing-masing memiliki probabilitas 0,045; mereka 11-20 memiliki probabilitas 0,055 - 200 lemparan:

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

Kami memiliki bukti bias yang tidak memadai (p = 0,64).

Sebuah mati bias, 1000 lemparan:

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

Sekarang p <0,05 dan kami mulai melihat bukti bias. Anda dapat menggunakan simulasi serupa untuk memperkirakan tingkat bias yang dapat Anda harapkan untuk mendeteksi dan jumlah lemparan yang diperlukan untuk mendeteksinya dengan tingkat-p yang diberikan.

Wow, 2 jawaban lain bahkan sebelum saya selesai mengetik.

Thylacoleo
sumber
Semua jawaban serupa, tetapi sedikit berbeda. Saya pikir itu tidak penting.
csgillespie
Terima kasih atas jawabannya. Saya menerima ini karena itu termasuk semua hal pemula tentang nilai p dan menolak.
C. Ross
10

Apakah Anda ingin melakukannya dengan tangan, atau unggul?

Jika Anda ingin melakukannya di R , Anda dapat melakukannya dengan cara ini:

Langkah 1: putar mati Anda (katakanlah) 100 kali.

Langkah 2: hitung berapa kali Anda mendapatkan masing-masing nomor Anda

Langkah 3: letakkan di R seperti ini (tulis berapa kali setiap die roll yang Anda dapatkan, bukan angka yang saya tulis):

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

Langkah 4: jalankan saja perintah ini:

chisq.test(x)

Jika nilai P rendah (misalnya: di bawah 0,05) - dadu Anda tidak seimbang.

Perintah ini mensimulasikan mati seimbang (P = ~ .5):

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

Dan ini mensimulasikan dadu yang tidak seimbang:

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

(Ini menjadi tentang P = ~ .005)

Sekarang pertanyaan sebenarnya adalah berapa banyak yang mati harus digulung ke tingkat kekuatan deteksi. Jika seseorang ingin menyelesaikannya, dia disambut ...

Pembaruan: Ada juga artikel bagus tentang topik ini di sini .

Tal Galili
sumber
5
+1 untuk referensi: ini adalah risalah yang panjang pada pengujian die praktis. Setengah jalan penulis menyarankan menggunakan tes KS dan kemudian pergi ke cara untuk mengidentifikasi bentuk-bentuk tertentu penyimpangan dari keadilan. Dia juga sangat sadar bahwa chi-square adalah perkiraan untuk sejumlah kecil gulungan per wajah (misalnya, untuk 100 gulungan dadu bersisi 20), bahwa daya bervariasi, dll., Dll. Singkatnya, apa pun yang mungkin ingin dilakukan OP tahu jelas ditata.
whuber
8

n=37

Pertama, sesuai dengan apa yang dikatakan @Glen_b, bayesian sebenarnya tidak tertarik apakah die itu benar - benar adil - tidak. Apa yang dia pedulikan adalah apakah itu cukup dekat , apa pun "cukup" artinya dalam konteks, katakanlah, dalam 5% dari adil untuk masing-masing pihak.

hal1hal2hal3hal=(hal1,hal2,hal3)hal1+hal2+hal3=1α0=(1,1,1)

X=(X1,X2,X3)Xhal=(hal1,hal2,hal3)α=(x1+1,x2+1,x3+1)

hal

Bagaimanapun, begini caranya (dengan R):

Pertama, dapatkan beberapa data. Kami melempar dadu 500 kali.

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

(kami mulai dengan die adil; dalam praktiknya data ini akan diamati.)

hal

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

Akhirnya, mari kita perkirakan probabilitas posterior kita (setelah mengamati data) bahwa dadu berada dalam 0,05 dari wajar di setiap koordinat.

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

Hasilnya sekitar 0,9486 di komputer saya. (Tidak mengherankan, sungguh. Bagaimanapun juga, kita mulai dengan dadu yang adil.)

Komentar cepat: mungkin tidak masuk akal bagi kita untuk menggunakan informasi sebelumnya yang tidak informatif dalam contoh ini. Karena bahkan ada pertanyaan, mungkin die muncul kira-kira seimbang di tempat pertama, jadi mungkin lebih baik untuk memilih sebelum yang terkonsentrasi lebih dekat ke 1/3 di semua koordinat. Di atas ini hanya akan membuat perkiraan probabilitas posterior kita "hampir adil" bahkan lebih tinggi.


sumber
8

Tes good-of-square chi-squared bertujuan untuk menemukan semua jenis penyimpangan yang mungkin dari keseragaman yang ketat. Ini masuk akal dengan d4 atau d6, tetapi dengan d20, Anda mungkin lebih tertarik untuk memeriksa bahwa probabilitas bahwa Anda berada di bawah (atau mungkin melebihi) setiap hasil mendekati apa yang seharusnya.

Apa yang saya maksudkan adalah bahwa ada beberapa jenis penyimpangan dari keadilan yang akan sangat berdampak pada apa pun yang Anda gunakan untuk d20 dan jenis penyimpangan lainnya yang hampir tidak berarti sama sekali, dan uji chi-kuadrat akan membagi kekuasaan antara yang lebih menarik dan alternatif yang kurang menarik. Konsekuensinya adalah bahwa untuk memiliki kekuatan yang cukup untuk mengambil penyimpangan yang bahkan cukup dari keadilan, Anda memerlukan sejumlah besar gulungan - jauh lebih banyak daripada yang Anda inginkan untuk duduk dan menghasilkan.

(Petunjuk: berikan beberapa set probabilitas tidak seragam untuk d20 Anda yang akan sangat memengaruhi hasil yang Anda gunakan untuk d20 dan gunakan simulasi dan uji chi-squared untuk mengetahui kekuatan apa yang Anda miliki terhadap mereka untuk berbagai jumlah gulungan, sehingga Anda mendapatkan beberapa gagasan tentang jumlah gulungan yang Anda perlukan.)

Ada berbagai cara untuk memeriksa penyimpangan "menarik" (yang akan lebih besar kemungkinannya memengaruhi penggunaan d20 secara khas)

Rekomendasi saya adalah untuk melakukan tes ECDF (Kolmogorov-Smirnov / Anderson-Darling-type test - tetapi Anda mungkin ingin menyesuaikan konservatif yang dihasilkan dari distribusi yang terpisah - setidaknya dengan mengangkat level alpha nominal, tetapi bahkan lebih baik dengan hanya mensimulasikan distribusi untuk melihat bagaimana distribusi statistik uji berlaku untuk D20).

Ini masih dapat mengambil segala jenis penyimpangan, tetapi mereka relatif lebih berat pada jenis penyimpangan yang lebih penting.

Pendekatan yang bahkan lebih kuat adalah untuk secara khusus membangun statistik uji yang secara khusus sensitif terhadap alternatif paling penting bagi Anda, tetapi itu melibatkan pekerjaan yang lebih sedikit.


Dalam jawaban ini saya menyarankan metode grafis untuk menguji mati berdasarkan ukuran penyimpangan individu. Seperti uji chi-squared ini lebih masuk akal untuk dadu dengan beberapa sisi seperti d4 atau d6.

Glen_b -Reinstate Monica
sumber
7

Jika Anda tertarik hanya memeriksa berapa kali setiap angka muncul, maka uji Chi-squared akan cocok. Misalkan Anda melempar mati N kali. Anda akan mengharapkan setiap nilai muncul N / 20 kali. Semua tes chi-square lakukan adalah membandingkan apa yang Anda amati dengan apa yang Anda dapatkan. Jika perbedaan ini terlalu besar, maka ini akan menunjukkan masalah.

Tes lainnya

Jika Anda tertarik pada aspek randonness lainnya, misalnya, jika Anda dadu memberikan hasil berikut:

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

Kemudian meskipun output ini memiliki jumlah yang benar dari setiap nilai individu, itu jelas tidak acak. Dalam hal ini, lihat pertanyaan ini . Ini mungkin hanya masuk akal untuk dadu elektronik.

Tes Chi-squared di R

Dalam R, ini akan menjadi

##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
csgillespie
sumber
0

Mungkin seseorang seharusnya tidak terlalu fokus pada satu set gulungan.

Cobalah menggulung 6 sisi mati 10 kali dan ulangi proses 8 kali.

> 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

Anda dapat memeriksa bahwa jumlah untuk setiap jumlah berulang sampai 10.

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

Untuk setiap pengulangan (berdasarkan kolom) Anda dapat menghitung goodness of fit menggunakan uji 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

Semakin banyak lemparan yang Anda buat, semakin sedikit bias yang Anda lihat. Mari kita lakukan ini untuk sejumlah besar.

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

masukkan deskripsi gambar di sini

Roman Luštrik
sumber