Prueba de Validación.

Introducción
Las pruebas de validación de números pseudoaleatorios permiten verificar si una secuencia generada cumple con las propiedades de aleatoriedad necesarias para su uso en simulaciones o aplicaciones estadísticas. Entre ellas, la prueba de Kolmogorov-Smirnov evalúa si la distribución de los números se ajusta a la uniforme [0,1]. La Run Test analiza la independencia al contar secuencias de números ascendentes o descendentes. Por su parte, la prueba Poker estudia patrones de dígitos en subconjuntos, similar a un juego de cartas, para comprobar uniformidad y aleatoriedad. Estas pruebas en conjunto permiten identificar sesgos o dependencias en los generadores pseudoaleatorios.

  1. Prueba de Kolomogorvo Smirnoff. La prueba Kolmogorov-Smirnov (K-S) es una prueba no paramétrica que compara la distribución empírica de un conjunto de datos con una distribución teórica (por ejemplo, uniforme [0,1]) o bien entre dos muestras. Su objetivo es evaluar si los datos siguen la distribución esperada midiendo la mayor diferencia entre las funciones de distribución acumulada.

En R, se usa la función ks.test(). Por ejemplo, si tienes una muestra de números pseudoaleatorios y quieres verificar si provienen de una distribución uniforme en [0,1]:

Generando 50 números Pseudoaleatorios por el método secuencial mixto.

a <- 273 
c <- 1389  
m <- 11777
X_n <- 39 # 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.02199202 0.12176276 0.35917466 0.17262461 0.24445954 0.85539611
##  [7] 0.64108007 0.13280122 0.37267555 0.85836801 0.45240723 0.62511675
## [13] 0.77481532 0.64252356 0.52687442 0.95465738 0.73940732 0.97613993
## [19] 0.60414367 0.04916362 0.53961111 0.43177380 0.99218816 0.98531035
## [25] 0.10766749 0.51116583 0.66621381 0.99431095 0.56482975 0.31646429
## [31] 0.51269423 0.08346778 0.90464465 0.08593020 0.57688715 0.60813450
## [37] 0.13866010 0.97214910 0.51464719 0.61662563 0.45673771 0.80733633
## [43] 0.52076080 0.28564150 0.09807251 0.89173813 0.56245224 0.66740256
## [49] 0.31884181 0.16175597
# 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.11117, p-value = 0.5305
## 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]"

Conclusión de lo obtenido: Generamos 50 numeros aleatorios, y realizamos una prueba con el el metodo Kolmogorov Smirnov para comparar el resultado obtenido y si cumple con la uniformidad. Para llegar a la conclusión, de que esta prueba dió como resultado que los números aleatorios siguen la distribución uniforme.

  1. Prueba Runtest
    La prueba de rachas (Run Test o Wald–Wolfowitz test) es una prueba no paramétrica que evalúa la independencia de una secuencia de números. Se basa en contar el número de “rachas” o secuencias consecutivas de valores por encima y por debajo de la media (o de una mediana). Si la secuencia es verdaderamente aleatoria, la cantidad de rachas observada debe estar dentro de lo esperado estadísticamente. Un número excesivo o muy bajo de rachas indica dependencia o patrones ocultos en los datos.
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.099770740  0.237411905 -0.186550055  0.071834932  0.610936571
##  [6] -0.214316040 -0.508278849  0.239874331  0.485692451 -0.405960771
## [11]  0.172709519  0.149698565 -0.132291755 -0.115649147  0.427782967
## [16] -0.215250064  0.236732614 -0.371996264 -0.554980046  0.490447482
## [21] -0.107837310  0.560414367 -0.006877813 -0.877642863  0.403498344
## [26]  0.155047975  0.328097138 -0.429481192 -0.248365458  0.196229940
## [31] -0.429226458  0.821176870 -0.818714443  0.490956950  0.031247347
## [36] -0.469474399  0.833489004 -0.457501911  0.101978433 -0.159887917
## [41]  0.350598624 -0.286575529 -0.235119300 -0.187568990  0.793665619
## [46] -0.329285896  0.104950327 -0.348560754 -0.157085845
S<-ifelse(diff(random.number) > 0, 1, 0) # seuencia de ceros y unos
S
##  [1] 1 1 0 1 1 0 0 1 1 0 1 1 0 0 1 0 1 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 0 1 1 0 1 0
## [39] 1 0 1 0 0 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

Conclusión de lo obtenido: Con la prueba de Runtest aplicada a los números generados anteriormente, se obtuvo un numero de corridas que se encuentra dentro del rango esperado, lo que llega a la conclusión de que dichos números aleatorios son independientes.En conclusión, los datos pueden considerarse aleatorios según esta prueba.

  1. Prueba Póker
    Los números pseudoaleatorios ui se agrupan en combinaciones de varios dígitos decimales (típicamente grupos de 5 decimales). Los grupos de dígitos se clasifican de manera similar a las manos en el juego de póker:
  1. Todo diferente (TD): Ningún decimal se repite en el grupo (Ej: 0.12345). La probabilidad de este evento es:

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

                             P(1p)=0.5040
  3. Dos pares (2p): Dos decimales aparecen dos veces cada uno (Ej: 0.14224).

                             P(2p)=0.1080
  4. Tercia (T): Un decimal aparece tres veces, y los otros dos son diferentes (Ej: 0.41443).

                             P(T)=0.0720
  5. Full House (FH): Un dígito aparece tres veces y otro dígito dos veces (Ej: 0.32223).

                             P(FH)=0.0090
  6. Poker (p): Un dígito aparece cuatro veces (Ej: 0.55515).

                             P(p)=0.0045
  7. 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 = 0.42, df = 4, p-value = 0.98
## 
##       (sample size : 50)
## 
##  observed number  0 1 5 4 0 
##  expected number  0.016 0.96 4.8 3.8 0.38