Prueba chi2 para validar la uniformidad de los numeros pseudoaleatorios.

Introducción

En el ámbito de la simulación y la estadística, resulta fundamental garantizar que los números pseudoaleatorios generados por un algoritmo provengan de una distribución verdaderamente uniforme. La uniformidad es esencial, ya que asegura que todos los valores posibles dentro de un intervalo tengan la misma probabilidad de ocurrencia, lo cual evita sesgos y garantiza la validez de los experimentos o modelos que dependen de dichos números.
Para evaluar esta propiedad, una de las técnicas más utilizadas es la prueba de bondad de ajuste Chi-cuadrado (χ²). Esta prueba compara las frecuencias observadas en distintos intervalos con las frecuencias esperadas bajo la hipótesis de que los datos siguen una distribución uniforme. Si las diferencias entre lo observado y lo esperado son lo suficientemente pequeñas, se concluye que no hay evidencia significativa para rechazar la uniformidad.
En este contexto, la prueba Chi² constituye una herramienta estadística robusta para validar generadores de números pseudoaleatorios, permitiendo identificar posibles irregularidades en la secuencia generada y garantizando la confiabilidad de los resultados obtenidos en aplicaciones prácticas como la criptografía, el muestreo estadístico y la simulación de fenómenos complejos.

Formula

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

Ejemplo

a <- 14065 
c <- 3764
m <- 1547474
X_n <- 59 # 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.538683687 0.588491309 0.132694313 0.347950919 0.932104190 0.047870917
##  [7] 0.306885285 0.343970238 0.943829105 0.958790261 0.387450128 0.488488336
## [13] 0.590884887 0.798371410 0.096320197 0.745998317 0.468764580 0.176253042
## [19] 0.001468845 0.661742297 0.407845948 0.355686105 0.727502368 0.323243557
## [25] 0.423060420 0.347236206 0.879663891 0.475058709 0.703168519 0.067645078
## [31] 0.430459575 0.416351422 0.985179072 0.546086719 0.712140559 0.259400158
## [37] 0.465653704 0.421779623 0.332826917 0.213014887 0.056824864 0.244148205
## [43] 0.946941273 0.731441691 0.729822278 0.952774005 0.768807101 0.274309617
## [49] 0.167193116 0.573608991
 library(agricolae) # cargando la libreria 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     8 10
## [2,]     0.2     0.4    12 10
## [3,]     0.4     0.6    14 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.4 0.4 1.6 0.1 0.9
 chicuad <- sum(x2)
 chicuad # Estadistica chi cuadrada
## [1] 3.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]"

INFORME

Se realiza un estudio de la distribucion chi2 donde se hace un estudio de 5 intervalos para notar la frecuencia en la que se repiten los numeros generados aleatoriamente, despues se una serie de calculos para obtener los valores de: Observasion(Oi) y esperada(Ei), luego aplicamos la formula para obtener los valores de cada intervalo y hacer la sumatoria y determinar si son numeros uniformes u no uniformes.