Pruebas de Validacion

Prueba de Kolomogorov Smirnoff

Introduccion

Las pruebas de validación de números pseudoaleatorios verifican uniformidad, independencia y ausencia de patrones; por ejemplo, Kolmogorov–Smirnov compara la función de distribución empírica con la distribución teórica (uniforme) midiendo la máxima desviación, la prueba de rachas (runs test / runtests) evalúa independencia contando rachas por encima/por debajo de la media o rachas ascendentes/descendentes, y la prueba POKER agrupa dígitos en bloques y clasifica “manos” (pares, tríos, full, etc.) para detectar patrones; cada prueba entrega una estadística y un p-valor (un p-valor bajo sugiere rechazar la hipótesis de aleatoriedad) y es aconsejable aplicar varias pruebas o baterías (p. ej. Diehard, NIST) para una evaluación robusta.

  1. prueba de Kolmogorov Smirnoff La prueba de Kolmogorov–Smirnov es un test no paramétrico que sirve para comprobar si una muestra de números se ajusta a una distribución teórica (como la uniforme o normal) o si dos muestras provienen de la misma distribución, comparando sus funciones de distribución acumulada y calculando la máxima diferencia entre ellas. En un programa puede aplicarse generando primero la muestra de números pseudoaleatorios y luego contrastándola con la distribución esperada: el resultado devuelve la estadística de prueba y un valor p, que indica si se acepta o se rechaza la hipótesis de que los datos provienen de dicha distribución.

generando 50 numeros Pseudoaleatorios por el metodo secuencial mixto.

a <- 254183 
c <- 2307  
m <- 58561
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.06352351 0.63456908 0.71231707 0.92947525 0.84636533 0.71767900
##  [7] 0.84100340 0.80615085 0.88121788 0.64261198 0.07960930 0.36915353
## [13] 0.59167364 0.42009187 0.25119107 0.53805434 0.30481037 0.65333584
## [19] 0.90266560 0.28872458 0.91875139 0.02330903 0.79810796 0.51392565
## [25] 0.20293369 0.33430099 0.66674066 0.18148597 0.68818838 0.82759857
## [31] 0.52733048 0.48175407 0.73376479 0.57558785 0.68550742 0.37183450
## [37] 0.04743771 0.89998463 0.83296050 0.43885863 0.44153959 0.89730367
## [43] 0.37719643 0.95896586 0.85977015 0.99649938 0.24046721 0.71499804
## [49] 0.38523932 0.32625809
# Probando si los U_i provienen de una uniforme [0,1]
test_ks <- ks.test(random.number,"punif",0,1)
test_ks
## 
##  Exact one-sample Kolmogorov-Smirnov test
## 
## data:  random.number
## D = 0.13457, p-value = 0.2982
## alternative hypothesis: two-sided
ifelse(test_ks$p.value < 0.05, " Los u_i no siguen una distribución uniforme","Los u_i siguen la distribución uniforme [0,1]") # 
## [1] "Los u_i siguen la distribución uniforme [0,1]"

conclusion mediante la generación de números pseudoaleatorios la prueba de Kolmogorov–Smirnov en R fue posible evaluar si dichos valores seguían una distribución uniforme, permitiendo contrastar la función de distribución empírica con la teórica. Este proceso evidenció la importancia de combinar herramientas prácticas de generación con métodos estadísticos de validación, ya que solo a través de pruebas rigurosas se puede determinar si los números generados cumplen con las propiedades necesarias de aleatoriedad y uniformidad para su uso en simulaciones o aplicaciones estadísticas.

  1. prueba de Run Test

La prueba de rachas o runs test evalúa la independencia de una secuencia de números pseudoaleatorios analizando la cantidad y longitud de rachas (subsecuencias consecutivas) que se forman al clasificar los valores como mayores o menores a la media, o como ascendentes y descendentes. Si el número de rachas difiere mucho del esperado en una secuencia aleatoria, se rechaza la hipótesis de independencia.

library(tseries)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
diff(random.number)
##  [1]  0.571045576  0.077747989  0.217158177 -0.083109920 -0.128686327
##  [6]  0.123324397 -0.034852547  0.075067024 -0.238605898 -0.563002681
## [11]  0.289544236  0.222520107 -0.171581769 -0.168900804  0.286863271
## [16] -0.233243968  0.348525469  0.249329759 -0.613941019  0.630026810
## [21] -0.895442359  0.774798928 -0.284182306 -0.310991957  0.131367292
## [26]  0.332439678 -0.485254692  0.506702413  0.139410188 -0.300268097
## [31] -0.045576408  0.252010724 -0.158176944  0.109919571 -0.313672922
## [36] -0.324396783  0.852546917 -0.067024129 -0.394101877  0.002680965
## [41]  0.455764075 -0.520107239  0.581769437 -0.099195710  0.136729223
## [46] -0.756032172  0.474530831 -0.329758713 -0.058981233
S<-ifelse(diff(random.number) > 0, 1, 0) # seuencia de ceros y unos
S
##  [1] 1 1 1 0 0 1 0 1 0 0 1 1 0 0 1 0 1 1 0 1 0 1 0 0 1 1 0 1 1 0 0 1 0 1 0 0 1 0
## [39] 0 1 1 0 1 0 1 0 1 0 0
runs.test(as.factor(S))
## 
##  Runs Test
## 
## data:  as.factor(S)
## Standard Normal = 2.4583, p-value = 0.01396
## alternative hypothesis: two.sided
# devuelve 1 si el número es mayor que el anterior y 0 en caso contrario.

# Detectar cambios
cambios <- abs(diff(S))

# Contar las corridas
corridas <- sum(cambios) + 1
corridas
## [1] 34

La validación de los números pseudoaleatorios generados mostró que cumplen con las dos propiedades esenciales: la uniformidad, verificada mediante la prueba de Kolmogorov–Smirnoff, y la independencia, confirmada con el Run Test; por lo que se concluye que son valores adecuados para ser utilizados en simulaciones y aplicaciones estadísticas que requieren aleatoriedad confiable.

Prueba Poker

Los números pseudoaleatorios ui se organizan en secuencias de varios dígitos decimales (generalmente en grupos de 5). Estas combinaciones de dígitos se categorizan de forma análoga a las manos del juego de póker:

Todo diferente (TD): Ningún decimal se repite en el grupo P(TD)=0.3024

Un par (1p): Un decimal aparece dos veces y los demás son diferentes. P(1p)=0.5040

Dos pares (2p): Dos decimales aparecen dos veces cada uno P(2p)=0.1080

Tercia (T): Un decimal aparece tres veces, y los otros dos son diferentes. P(T)=0.0720

Full House (FH): Un dígito aparece tres veces y otro dígito dos veces. P(FH)=0.0090

Poker (p): Un dígito aparece cuatro veces. P(p)=0.0045

Quintilla: Todos los dígitos son iguales. P(Q)=0.0001

library(randtoolbox)
## Cargando paquete requerido: rngWELL
## This is randtoolbox. For an overview, type 'help("randtoolbox")'.
poker.test(random.number,nbcard = 5)
## 
##           Poker test
## 
## chisq stat = 1.2, df = 4, p-value = 0.88
## 
##       (sample size : 50)
## 
##  observed number  0 1 5 3 1 
##  expected number  0.016 0.96 4.8 3.8 0.38