Prueba Chi-cuadrada para validar la uniformidad de los numeros pseudoaleatorios

La prueba de bondad de ajuste Chi-cuadrada (χ²) es una herramienta sencilla y muy usada para evaluar si un conjunto de números (por ejemplo, una muestra de números pseudoaleatorios) es compatible con una distribución dada, en este caso la distribución uniforme en un intervalo. La idea básica es comparar cuántos valores observamos en distintos subintervalos (clases o “bins”) con los que esperaríamos si realmente los números fueran uniformes.

Cómo funciona (a grandes rasgos)

  1. Divide el rango posible de los números en \(k\) intervalos (bins).

  2. Cuenta \(O_i\), el número observado de valores en cada bin \(i\).

  3. Calcula la frecuencia esperada \(E_i\) para cada bin; si la distribución fuera perfectamente uniforme entonces \(E_i = n/k\) (donde \(n\) es el tamaño de la muestra).

  4. Construye la estadística de prueba:

    \[ \chi^2 \;=\; \sum_{i=1}^{k}\frac{(O_i - E_i)^2}{E_i} \]

  5. Compara el valor \(\chi^2\) obtenido con la distribución \(\chi^2\) con \(k-1\) grados de libertad, o calcula su p-valor. Si \(\chi^2\) es muy grande (p pequeño), se rechaza la hipótesis de uniformidad; si es pequeño, no hay evidencia suficiente para rechazarla.

Interpretación práctica

Consideraciones importantes / advertencias

Consejo práctico para evaluar generadores pseudoaleatorios

Ejemplo

a <- 180 
c <- 10  
m <- 3003012354
X_n <- 20 # semilla
random.number<-numeric(50) # vector numérico de longitud 50
 for (i in 1:50)
   {X_n<-(a*X_n+c)%%m
   random.number[i]<-X_n/m # números en el intervalo [0,1]
   }
 random.number
##  [1] 1.202126e-06 2.163861e-04 3.894949e-02 1.090882e-02 9.635882e-01
##  [6] 4.458848e-01 2.592691e-01 6.684392e-01 3.190530e-01 4.295466e-01
## [11] 3.183811e-01 3.086061e-01 5.491017e-01 8.383007e-01 8.941236e-01
## [16] 9.422440e-01 6.039199e-01 7.055738e-01 3.287596e-03 5.917673e-01
## [21] 5.181174e-01 2.611400e-01 5.195321e-03 9.351577e-01 3.283886e-01
## [26] 1.099549e-01 7.918845e-01 5.392021e-01 5.637167e-02 1.469012e-01
## [31] 4.422227e-01 6.000845e-01 1.520743e-02 7.373373e-01 7.207093e-01
## [36] 7.276686e-01 9.803545e-01 4.638121e-01 4.861804e-01 5.124696e-01
## [41] 2.445347e-01 1.625061e-02 9.251105e-01 5.198877e-01 5.797872e-01
## [46] 3.616986e-01 1.057522e-01 3.539342e-02 3.708160e-01 7.468786e-01
library(agricolae)
hist(random.number, breaks=5)$count

## [1] 13  9 12  9  7
 histo <- hist(random.number, breaks=5)
 Tabla <- table.freq(histo) 
 lim_inf <-Tabla$Lower #limite inferior del intervalo
 lim_sup <- Tabla$Upper # limite superior del intervalo
 
 obser <- Tabla$Frequency
 Ei <- length(random.number)/length(obser) # Valor esperado en una uniforme es E= n/#intervalos
 cbind(lim_inf,lim_sup,obser,Ei) # visualizacion de las frecuencias observadas y esperadas en los intervalos.
##      lim_inf lim_sup obser Ei
## [1,]     0.0     0.2    13 10
## [2,]     0.2     0.4     9 10
## [3,]     0.4     0.6    12 10
## [4,]     0.6     0.8     9 10
## [5,]     0.8     1.0     7 10
 # calculando la estadística chi cuadrada
  x2 <- (obser-Ei)^2/Ei 
 x2
## [1] 0.9 0.1 0.4 0.1 0.9
chicuad <- sum(x2)
 chicuad # Estadistica chi cuadrada
## [1] 2.4
 dchi <- qchisq(0.05,length(obser)-1,lower.tail=F)# valor de la distribución chi cuadrada con k-1 grado de libertad y nivel de signiicancia 0.05
 
 # Decisión estadística
 
 ifelse(chicuad < dchi,"Los $U_i$ provienen de una distribución uniforme [0,1]", "Los $U_i no siguen una uniforme [0,1] ")
## [1] "Los $U_i$ provienen de una distribución uniforme [0,1]"

Se tomó una muestra de 50 números aleatorios con el fin de aplicar la prueba Chi-cuadrado y verificar si seguían una distribución uniforme. Para esto se dividió el rango en 5 intervalos, con una frecuencia esperada de 10 datos en cada uno. Al hacer la comparación entre los valores observados y los esperados, se obtuvo un resultado de Chi-cuadrado de 3. Con este valor se puede concluir que la muestra analizada sí es uniforme, por lo que los números pseudoaleatorios cumplen con la distribución esperada.