Pruebas de validación.

Introducción
Las pruebas de validación de números pseudoaleatorios permiten verificar que una secuencia generada cumple con propiedades de aleatoriedad necesarias para su uso en simulaciones o modelos estadísticos. La prueba de Kolmogorov-Smirnov mide la uniformidad de la distribución comparando la función empírica con la teórica. La Run Test analiza la secuencia de números para comprobar la independencia, evaluando la longitud y frecuencia de las corridas ascendentes o descendentes. La prueba Póker se inspira en el juego de cartas y examina patrones en los dígitos de los números generados, identificando si aparecen con la frecuencia esperada. Estas pruebas en conjunto permiten determinar si los números se pueden considerar suficientemente aleatorios.

  1. Prueba de kolmogorv Smirnoff

La prueba de Kolmogorov-Smirnov (Smirnov) se usa para comprobar si una muestra de números pseudoaleatorios sigue una distribución específica (generalmente uniforme). Evalúa la diferencia máxima entre la distribución empírica de la muestra y la teórica, indicando si los datos se ajustan a lo esperado.

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

a <- 255
c <- 1395  
m <- 15777
X_n <- 21 # 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.427837992 0.187107815 0.800912721 0.321163719 0.985168283 0.306332002
##  [7] 0.203080434 0.873930405 0.940673132 0.960068454 0.905875642 0.086708500
## [13] 0.199087279 0.855675984 0.285795779 0.966343411 0.505989732 0.115801483
## [19] 0.617798060 0.626925271 0.954363948 0.451226469 0.151169424 0.636622932
## [25] 0.427267541 0.041642898 0.707358813 0.464917285 0.642327439 0.881916714
## [31] 0.977181974 0.269823160 0.893325727 0.886480319 0.140901312 0.018254421
## [37] 0.743297205 0.629207074 0.536223617 0.825442099 0.576155163 0.007986309
## [43] 0.124928694 0.945236737 0.123787792 0.654306902 0.936679977 0.941814033
## [49] 0.250998289 0.092983457
# 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.15568, p-value = 0.1592
## 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
Generamos unos números aleatorios, y realizamos pruebas con el método kolmogorov el cuál, sirvió para comparar los resultados de lo que habíamos realizado con anterioridad en el excel, y se llegó a la conclusión de que los números siguen una distribución uniforme tanto en el excel como en R.

  1. Prueba RunTest
    La Run Test o prueba de corridas se utiliza para verificar la independencia de una secuencia de números pseudoaleatorios. Una corrida es una sucesión de valores consecutivos que siguen una misma tendencia (ascendente o descendente, o bien mayores/menores a la media). La prueba compara el número de corridas observadas con el esperado en una secuencia verdaderamente aleatoria. Si la diferencia es significativa, se concluye que los números no son independientes.
library(tseries)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
diff(random.number)
##  [1] -0.240730177  0.613804906 -0.479749002  0.664004564 -0.678836281
##  [6] -0.103251569  0.670849971  0.066742727  0.019395322 -0.054192812
## [11] -0.819167142  0.112378779  0.656588705 -0.569880205  0.680547633
## [16] -0.460353679 -0.390188249  0.501996577  0.009127210  0.327438677
## [21] -0.503137479 -0.300057045  0.485453508 -0.209355391 -0.385624643
## [26]  0.665715916 -0.242441529  0.177410154  0.239589276  0.095265260
## [31] -0.707358813  0.623502567 -0.006845408 -0.745579007 -0.122646891
## [36]  0.725042784 -0.114090131 -0.092983457  0.289218483 -0.249286937
## [41] -0.568168853  0.116942384  0.820308043 -0.821448945  0.530519110
## [46]  0.282373075  0.005134056 -0.690815744 -0.158014832
S<-ifelse(diff(random.number) > 0, 1, 0) # seuencia de ceros y unos
S
##  [1] 0 1 0 1 0 0 1 1 1 0 0 1 1 0 1 0 0 1 1 1 0 0 1 0 0 1 0 1 1 1 0 1 0 0 0 1 0 0
## [39] 1 0 0 1 1 0 1 1 1 0 0
runs.test(as.factor(S))
## 
##  Runs Test
## 
## data:  as.factor(S)
## Standard Normal = 1.014, p-value = 0.3106
## 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] 29

Conclusión
La prueba RunTest permitió evaluar la independencia de la secuencia de números pseudoaleatorios generados. El número de corridas observado se ajustó al esperado bajo la hipótesis nula, indicando ausencia de patrones deterministas. Por tanto, se concluye que los números presentan un comportamiento consistente con una distribución aleatoria.

3.Prueba Poker

La prueba Póker es una técnica de validación de números pseudoaleatorios inspirada en el juego de cartas. Consiste en agrupar los números generados en bloques de dígitos y clasificar los patrones que aparecen (por ejemplo: pares, tríos, full, todos diferentes, etc.). Luego, se compara la frecuencia observada de cada patrón con la frecuencia esperada bajo la hipótesis de aleatoriedad. Si las diferencias son pequeñas, se acepta que los números cumplen con la propiedad de aleatoriedad; si no, se concluye que la secuencia presenta patrones no deseados.

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