La prueba Chi-cuadrado (χ²) es una de las técnicas más utilizadas en estadística para verificar si un conjunto de datos observados se ajusta a una distribución teórica esperada. En el contexto de los números pseudoaleatorios, esta prueba se aplica para determinar si los valores generados por un algoritmo realmente siguen una distribución uniforme, es decir, que todos los intervalos de la muestra tengan la misma probabilidad de ocurrencia.
La idea central consiste en dividir el rango de posibles valores en varios intervalos (clases) y contar cuántos números pseudoaleatorios caen en cada uno. Si los números fueran verdaderamente uniformes, se esperaría que la frecuencia de cada intervalo sea aproximadamente la misma. Luego, se comparan las frecuencias observadas con las frecuencias esperadas usando la fórmula de la estadística χ². Un valor de χ² demasiado grande indicaría que existen diferencias significativas entre lo observado y lo esperado, lo cual pondría en duda la hipótesis de uniformidad.
En resumen, la prueba Chi-cuadrado nos permite evaluar la calidad de los generadores de números pseudoaleatorios, asegurando que su comportamiento sea lo suficientemente cercano a una distribución uniforme, lo que resulta esencial en aplicaciones de simulación, criptografía y modelamiento estadístico.
\[ \chi^2 = \sum_{i=1}^{k} \frac{(O_i - E_i)^2}{E_i} \]
Ejemplo
a <- 37890
c <- 5678
m <- 245677645
X_n <- 50 # 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] 0.007734436 0.057799777 0.033559008 0.550827907 0.869420569 0.345396945
## [7] 0.090263333 0.077697944 0.975136191 0.910306402 0.509583821 0.130989484
## [13] 0.191579755 0.956934189 0.236448408 0.030195841 0.120422304 0.801113622
## [19] 0.195156006 0.461096361 0.941127745 0.330275646 0.144263911 0.159624324
## [25] 0.165658695 0.807967196 0.877087181 0.833297665 0.648562115 0.018552840
## [31] 0.967124656 0.353253215 0.764347192 0.115113660 0.656616531 0.200382062
## [37] 0.476338040 0.448375504 0.947885340 0.375546269 0.448162237 0.867188580
## [43] 0.775303072 0.233438122 0.970455484 0.558329383 0.100352733 0.365059092
## [49] 0.089017696 0.880537413
library(agricolae)
histo <- hist(random.number, breaks=6)
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 17 10
## [2,] 0.2 0.4 8 10
## [3,] 0.4 0.6 7 10
## [4,] 0.6 0.8 4 10
## [5,] 0.8 1.0 14 10
# calculando la estadística chi cuadrada
x2 <- (obser-Ei)^2/Ei
x2
## [1] 4.9 0.4 0.9 3.6 1.6
chicuad <- sum(x2)
chicuad # Estadistica chi cuadrada
## [1] 11.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 no siguen una uniforme [0,1] "
En este trabajo lo que hicimos fue generar números pseudoaleatorios y de ahí sacamos valores entre 0 y 1 que luego pasamos a otra hoja para revisarlos con pruebas de uniformidad y chi-square. básicamente miramos los intervalos, comparamos las frecuencias observadas con las esperadas y al final vimos que los números salieron uniformes, o sea que sirven bien para usarlos en simulaciones.