Pruebas de validacion

Introduccion
Las pruebas de validación de números pseudoaleatorios buscan verificar que una secuencia generada tenga propiedades cercanas al azar real. Entre ellas, la prueba de Kolmogorov-Smirnov compara la distribución empírica de los números con la distribución uniforme esperada. La Run Test (o prueba de corridas) evalúa la secuencia de números para comprobar que no existan patrones repetitivos o demasiadas secuencias largas de valores crecientes/disminuyentes. Finalmente, la prueba de Póker analiza bloques de números como si fueran “manos de cartas”, revisando la frecuencia de combinaciones (pares, tríos, etc.) y contrastándola con lo esperado en un proceso aleatorio. Estas pruebas permiten identificar sesgos y deficiencias en los generadores de números pseudoaleatorios

  1. Prueba de kolomogorov smirnoff La prueba de Smirnov (Kolmogorov-Smirnov) es una prueba no paramétrica que compara la distribución de una muestra con una distribución teórica (uniforme, normal, etc.) o compara dos muestras entre sí. Evalúa la máxima diferencia entre las funciones de distribución acumulada, verificando si los datos se ajustan a la distribución esperada. En R, se usa con la función ks.test().

Generando 50 numeros pseudoaleatorios por el metodo secuencial mixto.

a <- 34432
c <- 12
m <- 1231331
X_n <- 45 # 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.25835539 0.69277798 0.73133625 0.36988024 0.71627125 0.65184260
##  [7] 0.24439895 0.14455821 0.42814889 0.02256583 0.98649997 0.16712890
## [13] 0.58241854 0.83508740 0.72927344 0.34325945 0.10934103 0.83035999
## [19] 0.95527360 0.98068432 0.92239211 0.80516368 0.39586025 0.26020786
## [25] 0.47692050 0.32677241 0.42767623 0.74796216 0.83325848 0.75606478
## [31] 0.82246934 0.26446747 0.14409610 0.51706730 0.66140705 0.56743556
## [37] 0.94133665 0.10358222 0.54304976 0.28923336 0.88299409 0.25263313
## [43] 0.66381339 0.42250540 0.70603518 0.20320937 0.90512787 0.36268152
## [49] 0.85014265 0.11175224
# 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.11184, p-value = 0.5228
## 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 de lo obtenido: Generamos unos numeros aleatorios y se relizo la prueba de Kolmogorov-Smirnov para comprobar la la aleatoridad de los numeros obtenidos. Por medio de estos metodos realizados se llega a la conclusion de que los numeros generados siguen la distribucion uniforme.

  1. Prueba RunTes La prueba Run Test (o prueba de corridas) es una prueba no paramétrica usada para verificar la aleatoriedad de una secuencia de números. Se basa en contar las “corridas”, es decir, subsecuencias de valores similares (por ejemplo, mayores o menores que la media). Si hay muy pocas o demasiadas corridas, indica que la secuencia puede tener patrones o dependencia, y por tanto no ser realmente aleatoria.
library(tseries)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
diff(random.number) # halla la diferencia entre un valor  y el otro en un vector
##  [1]  0.43442259  0.03855828 -0.36145602  0.34639102 -0.06442865 -0.40744365
##  [7] -0.09984074  0.28359068 -0.40558306  0.96393415 -0.81937107  0.41528963
## [13]  0.25266886 -0.10581395 -0.38601400 -0.23391842  0.72101896  0.12491361
## [19]  0.02541071 -0.05829221 -0.11722843 -0.40930343 -0.13565240  0.21671265
## [25] -0.15014809  0.10090382  0.32028593  0.08529632 -0.07719370  0.06640457
## [31] -0.55800187 -0.12037137  0.37297120  0.14433974 -0.09397148  0.37390109
## [37] -0.83775443  0.43946754 -0.25381640  0.59376074 -0.63036097  0.41118026
## [43] -0.24130798  0.28352977 -0.50282580  0.70191849 -0.54244634  0.48746113
## [49] -0.73839041
S<-ifelse(diff(random.number) > 0, 1, 0) # seuencia de ceros y unos
S
##  [1] 1 1 0 1 0 0 0 1 0 1 0 1 1 0 0 0 1 1 1 0 0 0 0 1 0 1 1 1 0 1 0 0 1 1 0 1 0 1
## [39] 0 1 0 1 0 1 0 1 0 1 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

relizamos la prueba RunTest con los numeros que genaramos anteriormente. Al realizar esta prueba, nos arroja que el numero de corridas en 34, este resultado se encuentra en el rango esperado. Esto nos confirma que nuestro modelo no presenta ningun tipo de secuencia o patron y esto significa que los numeros son generados presentan una aleatoriedad.

  1. Prueba Poker

La prueba de Póker evalúa la independencia y uniformidad de una secuencia de números pseudoaleatorios. Consiste en agrupar los números en bloques (como si fueran manos de cartas) y clasificar las combinaciones según repeticiones de dígitos (todos distintos, un par, doble par, trío, etc.). Luego, se comparan las frecuencias observadas de cada tipo de combinación con las frecuencias teóricas esperadas en un proceso aleatorio. Si las diferencias son grandes, se sospecha que el generador no es realmente aleatorio.

Todo diferente (TD): Ningún decimal se repite en el grupo (Ej: 0.12345). la probabilidad de este evento es: P(TD)=0.3024

Un par (1p): Un decimal aparece dos veces y los demás son diferentes (Ej: 0.14345).

                                                                  P(1p)=0.5040

Dos pares (2p): Dos decimales aparecen dos veces cada uno (Ej: 0.14224).

                                                      P(2p)=0.1080

Tercia (T): Un decimal aparece tres veces, y los otros dos son diferentes (Ej: 0.41443).

                                                                      P(T)=0.0720

Full House (FH): Un dígito aparece tres veces y otro dígito dos veces (Ej: 0.32223).

                                                                  P(FH)=0.0090

Poker (p): Un dígito aparece cuatro veces (Ej: 0.55515).

                                      P(p)=0.0045

Quintilla: Todos los dígitos son iguales (Ej: 0.11111).

                                      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 = 6.7, df = 4, p-value = 0.15
## 
##       (sample size : 50)
## 
##  observed number  0 3 2 5 0 
##  expected number  0.016 0.96 4.8 3.8 0.38