Como posso testar a justiça de um d20?


29

Como posso testar a justiça de um dado de vinte lados (d20)? Obviamente, eu compararia a distribuição de valores com uma distribuição uniforme. Lembro-me vagamente de usar um teste de qui-quadrado na faculdade. Como posso aplicar isso para ver se um dado é justo?


Eu pensei em um teste para um d6 (dado de seis lados). Isso incluiu encontrar o número de rolos necessários para testar. É muito básico, mas, no entanto, leva muito tempo para calcular. Dê uma olhada em localtrainbeplac.bplaced.net/die.php .

Respostas:


15

Aqui está um exemplo com código R. A saída é precedida por # 's. Um 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

Um dado tendencioso - os números 1 a 10 têm uma probabilidade de 0,045; aqueles 11-20 têm uma probabilidade de 0,055 - 200 arremessos:

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

Temos evidências insuficientes de viés (p = 0,64).

Um dado tendencioso, 1000 joga:

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

Agora p <0,05 e estamos começando a ver evidências de viés. Você pode usar simulações semelhantes para estimar o nível de viés que você espera detectar e o número de jogadas necessárias para detectá-lo com um determinado nível p.

Uau, outras 2 respostas antes mesmo de terminar de digitar.


Todas as respostas são semelhantes, mas um pouco diferentes. Eu não acho que isso realmente importe.
csgillespie

Obrigado pela resposta. Aceitei isso porque incluía todo o material para iniciantes sobre valores de p e rejeição.
C. Ross

10

Deseja fazê-lo manualmente ou em excel?

Se você deseja fazer isso em R , pode fazê-lo desta maneira:

Etapa 1: jogue seu dado (digamos) 100 vezes.

Etapa 2: conte quantas vezes você obteve cada um dos seus números

Etapa 3: coloque-os em R desta maneira (escreva o número de vezes que cada dado que você obteve, em vez dos números que escrevi):

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

Etapa 4: basta executar este comando:

chisq.test(x)

Se o valor de P for baixo (por exemplo, abaixo de 0,05) - seu dado não será equilibrado.

Este comando simula um dado balanceado (P = ~ .5):

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

E isso simula um dado desequilibrado:

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

(É sobre P = ~ 0,005)

Agora, a verdadeira questão é quantos dados devem ser rolados para que nível de poder de detecção. Se alguém quer resolver isso, é bem-vindo ...

Atualização: Há também um bom artigo sobre este tópico aqui .


5
+1 para a referência: é um extenso tratado sobre testes práticos de matrizes. No meio do caminho, o autor sugere o uso de um teste KS e, em seguida, aborda formas de identificar formas específicas de desvio da justiça. Ele também está ciente de que o qui-quadrado é uma aproximação para um pequeno número de jogadas por face (por exemplo, para 100 jogadas de um dado de 20 lados), que o poder varia etc. etc. etc. Em resumo, qualquer coisa que o OP possa gostar O conhecimento está claramente definido.
whuber

8

n=37

Primeiro, de acordo com o que Glen_b disse, um bayesiano não está realmente interessado em saber se o dado é exatamente justo - não é. O que importa é se está próximo o suficiente , o que quer que "suficiente" signifique no contexto, digamos, dentro de 5% do justo para cada lado.

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

Enfim, aqui está como (com R):

Primeiro, obtenha alguns dados. Nós rolamos o dado 500 vezes.

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

(estamos começando com um dado justo; na prática, esses dados serão observados.)

p

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

Finalmente, vamos estimar nossa probabilidade posterior (depois de observar os dados) de que o dado esteja dentro de 0,05 da média em cada coordenada.

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

O resultado é de cerca de 0,9486 na minha máquina. (Não é realmente uma surpresa. Afinal, começamos com um dado justo.)

Observação rápida: provavelmente não é razoável termos utilizado um artigo não informativo antes neste exemplo. Como existe uma dúvida, presumivelmente, o dado parece aproximadamente equilibrado em primeiro lugar, portanto, é melhor escolher um prior que esteja concentrado mais próximo de 1/3 em todas as coordenadas. Acima disso, simplesmente aumentaria nossa probabilidade posterior estimada de "próximo ao justo".


8

Um teste qui-quadrado de qualidade de ajuste visa encontrar todos os tipos possíveis de desvios da uniformidade estrita. Isso é razoável com um d4 ou um d6, mas com um d20, você provavelmente está mais interessado em verificar se a probabilidade de rolar sob (ou possivelmente exceder) cada resultado está próxima do que deveria ser.

O que estou entendendo é que existem alguns tipos de desvios da justiça que impactarão fortemente o que você estiver usando para um d20 e outros tipos de desvios que pouco importam, e o teste do qui-quadrado dividirá o poder entre os mais interessantes. e alternativas menos interessantes. A conseqüência é que, para ter poder suficiente para captar desvios razoavelmente moderados da justiça, você precisa de um grande número de testes - muito mais do que você gostaria de sentar e gerar.

(Dica: crie alguns conjuntos de probabilidades não uniformes para o seu d20 que afetarão mais o resultado para o qual você está usando o d20 e use testes de simulação e qui-quadrado para descobrir que poder você tem contra eles vários números de rolos, para que você tenha uma idéia do número de rolos que precisará.)

Existem várias maneiras de verificar desvios "interessantes" (aqueles que provavelmente afetarão substancialmente os usos típicos de um d20)

Minha recomendação é fazer um teste ECDF (teste do tipo Kolmogorov-Smirnov / Anderson-Darling - mas você provavelmente desejará ajustar a conservatividade resultante da distribuição ser discreta - pelo menos, elevando o nível alfa nominal, mas até melhor apenas simulando a distribuição para ver como a distribuição da estatística de teste vale para um d20).

Eles ainda podem captar qualquer tipo de desvio, mas dão um peso relativamente maior aos tipos mais importantes de desvio.

Uma abordagem ainda mais poderosa é construir especificamente uma estatística de teste que seja especificamente sensível às alternativas mais importantes para você, mas envolve um pouco mais de trabalho.


Em esta resposta que sugerem um método gráfico para testar uma matriz com base no tamanho dos desvios individuais. Como no teste do qui-quadrado, isso faz mais sentido para dados com poucos lados, como d4 ou d6.


7

Se você estiver interessado em apenas verificar o número de vezes que cada número aparece, um teste qui-quadrado seria adequado. Suponha que você jogue um dado N vezes. Você esperaria que cada valor aumentasse N / 20 vezes. Tudo o que um teste qui-quadrado faz é comparar o que você observou com o que obtém. Se essa diferença for muito grande, isso indicaria um problema.

Outros testes

Se você estava interessado em outros aspectos da negligência, por exemplo, se você deu os seguintes dados:

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

Então, embora essa saída tenha o número correto de cada valor individual, claramente não é aleatória. Nesse caso, dê uma olhada nesta pergunta . Provavelmente isso só faz sentido para dados eletrônicos.

Teste qui-quadrado em R

Em R, isso seria

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

Talvez não deva se concentrar tanto em um conjunto de rolos.

Tente rolar um dado de 6 lados 10 vezes e repita o processo 8 vezes.

> 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

Você pode verificar se a soma de cada repetição é 10.

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

Para cada repetição (coluna), você pode calcular a qualidade do ajuste usando o teste 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

Quanto mais lances você fizer, menos tendencioso verá. Vamos fazer isso por um grande 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"))))

insira a descrição da imagem aqui

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.