Як я можу перевірити справність d20?


29

Як я можу перевірити справедливість двадцятигранного штампа (d20)? Очевидно, я б порівнював розподіл значень проти рівномірного розподілу. Я смутно пам’ятаю використання тесту Chi-квадрата в коледжі. Як я можу застосувати це, щоб зрозуміти, чи є штамп справедливим?


Я подумав про тест на 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,05 - 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).

Упереджений штамб, 1000 кидків:

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

Дякую за відповідь. Я прийняв це, тому що він включав усі новички про значення р і відхилення.
C. Ross

10

Ви хочете зробити це вручну чи у відмінності?

Якщо ви хочете зробити це в 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)

Якщо значення Р низьке (наприклад: нижче 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-ти стороннім штампом), що потужність змінюється і т. Д. І, коротше кажучи, все, що хотіла б ОП знати чітко викладено.
whuber

8

n=37

По- перше, відповідно до тим, що сказав @Glen_b, байесовский насправді не зацікавлені чи ні штамп точно справедливо - це не так . Що його хвилює, чи це досить близько , що б "достатньо" означало в контексті, скажімо, в межах 5% справедливості для кожної сторони.

p1p2p3p=(p1,p2,p3)p1+p2+p3=1α0=(1,1,1)

X=(X1,X2,X3)Xp=(p1,p2,p3)α=(x1+1,x2+1,x3+1)

p

У будь-якому випадку, ось як (з R):

Спочатку отримайте деякі дані. Котимо штамп 500 разів.

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

(ми починаємо з справедливої ​​смерті; на практиці ці дані будуть дотримані.)

p

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 (тест Колмогорова-Смирнова / Андерсона-Дарлінга), але ви, мабуть, захочете налаштувати консервативність, що є результатом розподілу, дискретного - принаймні, піднімаючи номінальний рівень альфа, але навіть краще просто імітувати розподіл, щоб побачити, як розподіл тестової статистики іде на d20).

Вони все ще можуть підбирати будь-які відхилення, але вони надають відносно більше ваги більш важливим видам відхилення.

Ще більш потужним підходом є спеціально побудувати тестову статистику, яка особливо чутлива до найважливіших альтернатив для вас, але вона передбачає трохи більше роботи.


У цій відповіді пропоную графічний метод випробування штампу на основі розміру окремих відхилень. Як і тест з квадратом чі, цей має більше сенсу для кубиків з кількома сторонами, як d4 або d6.


7

Якщо ви зацікавлені в тому, щоб перевірити кількість разів, коли кожне число з’явиться, то підходить тест Chi-квадрата. Припустимо, ви котите штампи 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"))))

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.