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)
Divide el rango posible de los números en \(k\) intervalos (bins).
Cuenta \(O_i\), el número observado de valores en cada bin \(i\).
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).
Construye la estadística de prueba:
\[ \chi^2 \;=\; \sum_{i=1}^{k}\frac{(O_i - E_i)^2}{E_i} \]
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]"