Come posso testare l'equità di una d20?


29

Come posso verificare l'equità di un dado a venti facce (d20)? Ovviamente confronterei la distribuzione dei valori con una distribuzione uniforme. Ricordo vagamente di aver usato un test Chi-square al college. Come posso applicare questo per vedere se un dado è giusto?


Ho pensato a un test per un d6 (dado a sei facce). Ciò ha incluso la ricerca del numero di rotoli necessari per il test. È molto semplice ma richiede comunque molto tempo per il calcolo. Dai un'occhiata a localtrainbeplac.bplaced.net/die.php .

Risposte:


15

Ecco un esempio con il codice R. L'output è preceduto da # 's. Un dado giusto:

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 distorto - i numeri da 1 a 10 hanno ciascuno una probabilità di 0,045; quelli 11-20 hanno una probabilità di 0,055 - 200 tiri:

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

Abbiamo prove insufficienti di parzialità (p = 0,64).

Un dado parziale, 1000 tiri:

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

Ora p <0,05 e stiamo iniziando a vedere prove di parzialità. È possibile utilizzare simulazioni simili per stimare il livello di distorsione che ci si può aspettare di rilevare e il numero di tiri necessari per rilevarlo con un dato livello p.

Caspita, altre 2 risposte anche prima che finissi di scrivere.


Tutte le risposte sono simili, ma leggermente diverse. Non penso sia importante.
csgillespie,

Grazie per la risposta. Ho accettato questo perché includeva tutte le novità sui valori p e sul rifiuto.
C. Ross,

10

Vuoi farlo a mano o in Excel?

Se vuoi farlo in R , puoi farlo in questo modo:

Step 1: lancia il tuo dado (diciamo) 100 volte.

Passaggio 2: conta quante volte hai ricevuto ciascuno dei tuoi numeri

Step 3: mettili in R in questo modo (scrivi il numero di volte che ottieni ogni tiro di dado, invece dei numeri che ho scritto):

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

Passaggio 4: esegui semplicemente questo comando:

chisq.test(x)

Se il valore P è basso (ad esempio: muggito 0,05) - il tuo dado non è bilanciato.

Questo comando simula un dado bilanciato (P = ~ .5):

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

E questo simula un dado sbilanciato:

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

(Deve essere circa P = ~ .005)

Ora la vera domanda è: quanti dadi dovrebbero essere lanciati a quale livello di potere di rilevazione. Se qualcuno vuole risolverlo, è il benvenuto ...

Aggiornamento: c'è anche un bell'articolo su questo argomento qui .


5
+1 per il riferimento: è un lungo trattato sulla prova pratica della matrice. A metà strada l'autore suggerisce di usare un test KS e quindi cerca di identificare forme specifiche di deviazione dall'equità. Sa anche che il chi-quadrato è un'approssimazione per un numero limitato di tiri per faccia (ad esempio, per 100 tiri di un dado a 20 facce), che la potenza varia, ecc., Ecc. In breve, qualsiasi cosa l'OP potrebbe piacere sapere è chiaramente definito.
whuber

8

n=37

Innanzitutto, in linea con quanto affermato da @Glen_b, un bayesiano non è effettivamente interessato a sapere se il dado è o meno esattamente giusto - non lo è. Ciò che gli interessa è se è abbastanza vicino , qualunque cosa "abbastanza" significhi nel contesto, diciamo, entro il 5% della fiera per ciascuna parte.

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

Comunque, ecco come (con R):

Innanzitutto, ottieni alcuni dati. Lanciamo il dado 500 volte.

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

(stiamo iniziando con un dado equo; in pratica questi dati sarebbero osservati.)

p

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

Infine, stimiamo la nostra probabilità posteriore (dopo aver osservato i dati) che il dado si trova entro 0,05 dalla fiera in ciascuna coordinata.

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

Il risultato è circa 0,9486 sulla mia macchina. (Non è una sorpresa, davvero. Dopo tutto abbiamo iniziato con un dado giusto.)

Osservazione rapida: probabilmente non è ragionevole per noi aver utilizzato un precedente non informativo in questo esempio. Dal momento che c'è persino una domanda, presumibilmente il dado appare approssimativamente equilibrato in primo luogo, quindi potrebbe essere meglio scegliere un precedente che sia concentrato più vicino a 1/3 in tutte le coordinate. Al di sopra di ciò avrebbe semplicemente aumentato ulteriormente la nostra probabilità posteriore stimata di "vicino alla fiera".


8

Un test di bontà di adattamento chi-quadrato mira a trovare tutti i possibili tipi di deviazioni dalla rigida uniformità. Questo è ragionevole con un d4 o un d6, ma con un d20, probabilmente sei più interessato a verificare che la probabilità che passi sotto (o eventualmente superi) ogni risultato sia vicino a quello che dovrebbe essere.

Quello che sto ottenendo è che ci sono alcuni tipi di deviazioni dall'equità che avranno un forte impatto su qualsiasi cosa tu stia usando un D20 e altri tipi di deviazioni che non contano quasi per niente, e il test chi-quadrato dividerà il potere tra più interessanti e alternative meno interessanti. La conseguenza è che per avere abbastanza potenza per raccogliere deviazioni anche abbastanza moderate dall'equità, hai bisogno di un numero enorme di rotoli - molto più di quanto vorresti mai sederti e generare.

(Suggerimento: crea alcune serie di probabilità non uniformi per il tuo d20 che avranno un impatto maggiore sul risultato per cui stai usando il d20 e usi i test di simulazione e chi-quadrato per scoprire quale potere hai contro di loro vari numeri di rotoli, così avrai un'idea del numero di rotoli di cui avrai bisogno.)

Esistono vari modi per verificare le deviazioni "interessanti" (quelle che avranno maggiori probabilità di incidere sostanzialmente sugli usi tipici di un d20)

La mia raccomandazione è di fare un test ECDF (test di tipo Kolmogorov-Smirnov / Anderson-Darling - ma probabilmente vorrai adattarti alla conservatività che risulta dalla distribuzione discreta - almeno alzando il livello nominale alfa, ma anche meglio semplicemente simulando la distribuzione per vedere come va la distribuzione della statistica test per un d20).

Questi possono ancora rilevare qualsiasi tipo di deviazione, ma attribuiscono un peso relativamente maggiore ai tipi più importanti di deviazione.

Un approccio ancora più efficace è quello di costruire in modo specifico una statistica di test che sia specificamente sensibile alle alternative più importanti per te, ma implica un po 'più di lavoro.


In questa risposta suggerisco un metodo grafico per testare un dado basato sulla dimensione delle singole deviazioni. Come il test chi-quadrato, questo ha più senso per i dadi con pochi lati come d4 o d6.


7

Se sei interessato a controllare solo il numero di volte in cui appare ogni numero, allora sarebbe adatto un test Chi-quadrato. Supponiamo di tirare un dado N volte. Ti aspetteresti che ogni valore aumenti N / 20 volte. Tutto ciò che un test chi-quadrato fa è confrontare ciò che hai osservato con ciò che ottieni. Se questa differenza è troppo grande, ciò indicherebbe un problema.

Altri test

Se tu fossi interessato ad altri aspetti dell'abbandono, per esempio, se i dadi davano il seguente risultato:

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

Quindi, sebbene questo output abbia il numero corretto di ogni singolo valore, chiaramente non è casuale. In questo caso, dai un'occhiata a questa domanda . Questo probabilmente ha senso solo per i dadi elettronici.

Test chi-quadro in R

In R, questo sarebbe

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

Forse uno non dovrebbe concentrarsi tanto su una serie di rotoli.

Prova a lanciare un dado a 6 facce 10 volte e ripeti il ​​procedimento 8 volte.

> 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

È possibile verificare che la somma per ogni ripetizione sia pari a 10.

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

Per ogni ripetizione (per quanto riguarda le colonne) è possibile calcolare la bontà dell'adattamento usando il 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

Più lanci fai, meno distorto vedrai. Facciamo questo per un gran numero.

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

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.