Comment puis-je tester l'équité d'un d20?


29

Comment puis-je tester l'équité d'un dé à vingt faces (d20)? Évidemment, je comparerais la distribution des valeurs à une distribution uniforme. Je me souviens vaguement d'avoir utilisé un test du chi carré au collège. Comment puis-je appliquer cela pour voir si un dé est juste?


J'ai pensé à un test pour un d6 (dé à six faces). Cela comprenait la recherche du nombre de rouleaux nécessaires pour tester. Il est très basique mais prend néanmoins beaucoup de temps à calculer. Jetez un œil à localtrainbeplac.bplaced.net/die.php .

Réponses:


15

Voici un exemple avec le code R. La sortie est précédée de #. Un dé juste:

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

Un dé biaisé - les nombres 1 à 10 ont chacun une probabilité de 0,045; ces 11-20 ont une probabilité de 0,055 - 200 lancers:

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

Nous avons des preuves insuffisantes de biais (p = 0,64).

Un dé biaisé, 1000 lancers:

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

Maintenant p <0,05 et nous commençons à voir des preuves de biais. Vous pouvez utiliser des simulations similaires pour estimer le niveau de biais que vous pouvez vous attendre à détecter et le nombre de lancers nécessaires pour le détecter avec un niveau de p donné.

Wow, 2 autres réponses avant même d'avoir fini de taper.


Toutes les réponses sont similaires, mais légèrement différentes. Je ne pense pas que cela compte vraiment.
csgillespie

Merci d'avoir répondu. J'ai accepté cela, car il comprenait toutes les informations sur les valeurs p et le rejet.
C. Ross

10

Voulez-vous le faire à la main ou en excel?

Si vous voulez le faire en R , vous pouvez le faire de cette façon:

Étape 1: lancez votre dé (disons) 100 fois.

Étape 2: comptez combien de fois vous avez obtenu chacun de vos numéros

Étape 3: mettez-les en R comme ceci (écrivez le nombre de fois que vous avez obtenu chaque jet de dé, au lieu des chiffres que j'ai écrits):

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

Étape 4: exécutez simplement cette commande:

chisq.test(x)

Si la valeur P est faible (par exemple: en dessous de 0,05) - votre dé n'est pas équilibré.

Cette commande simule un dé équilibré (P = ~ .5):

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

Et cela simule un dé déséquilibré:

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

(Il doit s'agir de P = ~ .005)

Maintenant, la vraie question est de savoir combien de dés doivent être lancés à quel niveau de puissance de détection. Si quelqu'un veut résoudre ce problème, il est le bienvenu ...

Mise à jour: Il y a aussi un bel article sur ce sujet ici .


5
+1 pour la référence: c'est un long traité sur le test pratique des matrices. À mi-chemin, l'auteur suggère d'utiliser un test KS, puis examine les moyens d'identifier des formes spécifiques d'écart par rapport à l'équité. Il sait également que le chi carré est une approximation pour un petit nombre de rouleaux par face (par exemple, pour 100 rouleaux d'un dé à 20 faces), que la puissance varie, etc., etc. En bref, tout ce que le PO peut aimer savoir est clairement présenté.
whuber

8

n=37

Tout d' abord, en ligne avec ce que @Glen_b dit, un bayésien n'est pas réellement intéressé si la filière ou non est exactement juste - il n'est pas. Ce qui l'intéresse, c'est de savoir s'il est suffisamment proche , quel que soit le terme «assez» dans le contexte, disons, à moins de 5% de la juste valeur pour chaque camp.

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

Quoi qu'il en soit, voici comment (avec R):

Tout d'abord, obtenez des données. Nous lançons le dé 500 fois.

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

(nous commençons par un dé équitable; en pratique, ces données seraient observées.)

p

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

Enfin, estimons notre probabilité postérieure (après avoir observé les données) que le dé se trouve à 0,05 de juste dans chaque coordonnée.

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

Le résultat est d'environ 0,9486 sur ma machine. (Pas une surprise, vraiment. Nous avons commencé avec un bon dé après tout.)

Remarque rapide: il n'est probablement pas raisonnable pour nous d'avoir utilisé un préalable non informatif dans cet exemple. Puisqu'il y a même une question vraisemblablement, le dé semble approximativement équilibré en premier lieu, il peut donc être préférable de choisir un a priori qui est concentré plus près de 1/3 dans toutes les coordonnées. Au-dessus de cela, cela aurait simplement rendu notre probabilité postérieure estimée de "proche de passable" encore plus élevée.


8

Un test de qualité d'ajustement du chi carré vise à trouver tous les types d'écarts possibles par rapport à l'uniformité stricte. C'est raisonnable avec un d4 ou un d6, mais avec un d20, vous êtes probablement plus intéressé à vérifier que la probabilité que vous tombiez sous (ou éventuellement dépassiez) chaque résultat soit proche de ce qu'elle devrait être.

Ce que je veux dire, c'est qu'il y a certains types d'écarts par rapport à l'équité qui auront un impact important sur tout ce que vous utilisez pour un d20 et d'autres types d'écarts qui importent peu du tout, et le test du chi carré divisera le pouvoir entre les plus intéressants et des alternatives moins intéressantes. La conséquence est que pour avoir suffisamment de puissance pour détecter des écarts même assez modérés de l'équité, vous avez besoin d'un grand nombre de rouleaux - bien plus que vous ne voudriez jamais vous asseoir et générer.

(Astuce: proposez quelques ensembles de probabilités non uniformes pour votre d20 qui auront le plus d'impact sur le résultat pour lequel vous utilisez le d20 et utilisez des tests de simulation et de chi carré pour savoir quelle puissance vous avez contre eux pour différents nombres de rouleaux, vous avez donc une idée du nombre de rouleaux dont vous aurez besoin.)

Il existe différentes manières de vérifier les écarts "intéressants" (ceux qui sont plus susceptibles d'affecter de manière substantielle les utilisations typiques d'un d20)

Ma recommandation est de faire un test ECDF (test de type Kolmogorov-Smirnov / Anderson-Darling - mais vous voudrez probablement ajuster la conservativité qui résulte de la discrétisation de la distribution - au moins en élevant le niveau alpha nominal, mais même mieux en simulant simplement la distribution pour voir comment la distribution de la statistique de test se passe pour un d20).

Ceux-ci peuvent encore capter tout type d'écart, mais ils accordent relativement plus de poids aux types d'écarts les plus importants.

Une approche encore plus puissante consiste à construire spécifiquement une statistique de test qui est spécifiquement sensible aux alternatives les plus importantes pour vous, mais cela implique un peu plus de travail.


Dans cette réponse, je suggère une méthode graphique pour tester une matrice en fonction de la taille des écarts individuels. Comme le test du chi carré, cela a plus de sens pour les dés avec peu de côtés comme d4 ou d6.


7

Si vous souhaitez simplement vérifier le nombre de fois que chaque nombre apparaît, un test du chi carré conviendrait. Supposons que vous lanciez un dé N fois. Vous vous attendriez à ce que chaque valeur monte N / 20 fois. Tout ce qu'un test chi carré fait est de comparer ce que vous avez observé avec ce que vous obtenez. Si cette différence est trop importante, cela indiquerait un problème.

Autres tests

Si vous étiez intéressé par d'autres aspects de la randonness, par exemple, si vous dés donniez la sortie suivante:

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

Bien que cette sortie ait le nombre correct de chaque valeur individuelle, elle n'est clairement pas aléatoire. Dans ce cas, jetez un œil à cette question . Cela n'a probablement de sens que pour les dés électroniques.

Test du chi carré en R

Dans R, ce serait

##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

Peut-être qu'on ne devrait pas se concentrer autant sur un seul jeu de rouleaux.

Essayez de lancer un dé à 6 faces 10 fois et répétez le processus 8 fois.

> 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

Vous pouvez vérifier que la somme pour chaque répétition est de 10.

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

Pour chaque répétition (colonne par colonne), vous pouvez calculer la qualité de l'ajustement à l'aide du test 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

Plus vous lancez, moins vous verrez de biais. Faisons cela pour un grand nombre.

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

entrez la description de l'image ici

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.