¿Cómo puedo probar la equidad de un d20?

29

¿Cómo puedo probar la equidad de un dado de veinte lados (d20)? Obviamente estaría comparando la distribución de valores con una distribución uniforme. Recuerdo vagamente usar una prueba de Chi-cuadrado en la universidad. ¿Cómo puedo aplicar esto para ver si un dado es justo?

Cruzar
fuente
He pensado en una prueba para un d6 (dado de seis caras). Esto incluyó encontrar el número de rollos necesarios para la prueba. Es muy básico pero, no obstante, lleva mucho tiempo calcularlo. Echa un vistazo a localtrainbeplac.bplaced.net/die.php .

Respuestas:

15

Aquí hay un ejemplo con código R. La salida está precedida por # 's. Un dado justo:

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 dado sesgado: los números del 1 al 10 tienen una probabilidad de 0.045; esos 11-20 tienen una probabilidad de 0.055 - 200 tiros:

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

Tenemos evidencia insuficiente de sesgo (p = 0,64).

Un dado sesgado, 1000 lanzamientos:

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

Ahora p <0.05 y estamos comenzando a ver evidencia de sesgo. Puede usar simulaciones similares para estimar el nivel de sesgo que puede esperar detectar y la cantidad de lanzamientos necesarios para detectarlo con un nivel p dado.

Wow, otras 2 respuestas incluso antes de que termine de escribir.

Thylacoleo
fuente
Todas las respuestas son similares, pero ligeramente diferentes. No creo que realmente importe.
csgillespie
Gracias por la respuesta. Acepté esto porque incluía todas las cosas de novato sobre los valores p y el rechazo.
C. Ross
10

¿Quieres hacerlo a mano o en Excel?

Si quieres hacerlo en R , puedes hacerlo de esta manera:

Paso 1: tira tu dado (digamos) 100 veces.

Paso 2: cuenta cuántas veces obtuviste cada uno de tus números

Paso 3: colóquelos en R de esta manera (escriba la cantidad de veces que obtuvo cada dado, en lugar de los números que escribí):

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

Paso 4: simplemente ejecuta este comando:

chisq.test(x)

Si el valor P es bajo (p. Ej., Debajo de 0.05), su dado no está equilibrado.

Este comando simula un dado equilibrado (P = ~ .5):

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

Y esto simula un dado desequilibrado:

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

(Se trata de P = ~ .005)

Ahora la verdadera pregunta es cuántos dados se deben tirar a qué nivel de poder de detección. Si alguien quiere resolver eso, es bienvenido ...

Actualización: También hay un buen artículo sobre este tema aquí .

Tal Galili
fuente
55
+1 para la referencia: es un extenso tratado sobre pruebas prácticas de troqueles. A mitad de camino, el autor sugiere usar una prueba de KS y luego analiza formas específicas de desviación de la equidad. También es consciente de que el chi-cuadrado es una aproximación para un pequeño número de tiradas por cara (por ejemplo, para 100 tiradas de un dado de 20 lados), que el poder varía, etc., etc. En resumen, cualquier cosa que el OP pueda desear saber está claramente establecido.
whuber
8

norte=37

Primero, en línea con lo que dijo @Glen_b, un bayesiano no está realmente interesado en si el dado es exactamente justo o no, no lo es. Lo que le importa es si está lo suficientemente cerca , sea lo que sea "suficiente" en el contexto, digamos, dentro del 5% de lo justo para cada lado.

pags1pags2pags3pags=(pags1,pags2,pags3)pags1+pags2+pags3=1α0 0=(1,1,1)

X=(X1,X2,X3)Xpags=(pags1,pags2,pags3)α=(X1+1,X2+1,X3+1)

pags

De todos modos, así es como (con R):

Primero, obtenga algunos datos. Tiramos el dado 500 veces.

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

(Estamos comenzando con un dado justo; en la práctica, estos datos serían observados).

pags

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

Finalmente, calculemos nuestra probabilidad posterior (después de observar los datos) de que el dado está dentro de 0.05 de justo en cada coordenada.

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

El resultado es aproximadamente 0.9486 en mi máquina. (Realmente no es una sorpresa. Después de todo, comenzamos con un dado justo).

Comentario rápido: probablemente no es razonable para nosotros haber usado un previo no informativo en este ejemplo. Dado que incluso hay una pregunta, presumiblemente, el dado parece aproximadamente equilibrado en primer lugar, por lo que puede ser mejor elegir un prior que se concentre más cerca de 1/3 en todas las coordenadas. Por encima de esto, simplemente habría aumentado aún más nuestra probabilidad posterior estimada de "casi justo".


fuente
8

Una prueba de bondad de ajuste chi-cuadrado tiene como objetivo encontrar todos los tipos posibles de desviaciones de la estricta uniformidad. Esto es razonable con un d4 o un d6, pero con un d20, es probable que esté más interesado en verificar que la probabilidad de obtener (o posiblemente superar) cada resultado esté cerca de lo que debería ser.

A lo que me estoy refiriendo es que hay algunos tipos de desviaciones de la equidad que afectarán en gran medida lo que sea que esté usando un d20 y otros tipos de desviaciones que apenas importan, y la prueba de chi-cuadrado dividirá el poder entre más interesantes y alternativas menos interesantes. La consecuencia es que para tener suficiente poder para detectar incluso desviaciones bastante moderadas de la equidad, necesita una gran cantidad de rollos, mucho más de lo que alguna vez desearía sentarse y generar.

(Sugerencia: invente algunos conjuntos de probabilidades no uniformes para su d20 que tendrán un mayor impacto en el resultado para el que está usando el d20 y use la simulación y las pruebas de chi-cuadrado para averiguar qué poder tiene contra ellos varios números de rollos, para que tenga una idea de la cantidad de rollos que necesitará).

Hay una variedad de formas de verificar las desviaciones "interesantes" (las que serán más propensas a afectar sustancialmente los usos típicos de un d20)

Mi recomendación es hacer una prueba de ECDF (prueba de tipo Kolmogorov-Smirnov / Anderson-Darling, pero es probable que desee ajustar la conservaduría que resulta de la distribución discreta, al menos levantando el nivel alfa nominal, pero incluso mejor simplemente simulando la distribución para ver cómo va la distribución de la estadística de prueba para un d20).

Estos todavía pueden detectar cualquier tipo de desviación, pero ponen relativamente más peso en los tipos más importantes de desviación.

Un enfoque aún más poderoso es construir específicamente una estadística de prueba que sea específicamente sensible a las alternativas más importantes para usted, pero implica un poco más de trabajo.


En esta respuesta sugiero un método gráfico para probar un dado basado en el tamaño de las desviaciones individuales. Al igual que la prueba de chi-cuadrado, esto tiene más sentido para dados con pocos lados como d4 o d6.

Glen_b -Reinstate a Monica
fuente
7

Si está interesado en verificar la cantidad de veces que aparece cada número, entonces una prueba de Chi-cuadrado sería adecuada. Supongamos que lanzas un dado N veces. Es de esperar que cada valor aparezca N / 20 veces. Todo lo que hace una prueba de chi-cuadrado es comparar lo que observaste con lo que obtienes. Si esta diferencia es demasiado grande, esto indicaría un problema.

Otras pruebas

Si estaba interesado en otros aspectos de la randonness, por ejemplo, si dados dio el siguiente resultado:

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

Entonces, aunque esta salida tiene el número correcto de cada valor individual, claramente no es aleatorio. En este caso, eche un vistazo a esta pregunta . Esto probablemente solo tiene sentido para los dados electrónicos.

Prueba de Chi-cuadrado en R

En R, esto sería

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

Quizás uno no debería enfocarse tanto en un conjunto de rollos.

Intenta lanzar un dado de 6 lados 10 veces y repite el proceso 8 veces.

> 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

Puede verificar que la suma de cada repetición sume a 10.

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

Para cada repetición (en columnas) puede calcular la bondad de ajuste utilizando la prueba 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

Cuantos más lanzamientos hagas, menos sesgado verás. Hagamos esto para un gran número.

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

ingrese la descripción de la imagen aquí

Roman Luštrik
fuente