Pruebas de validacion.

Introduccion
Las pruebas de validación de números pseudoaleatorios se utilizan para evaluar si una secuencia generada se comporta de manera aleatoria y uniforme. Entre ellas, la prueba de Kolmogorov-Smirnoff compara la distribución empírica de los números con la distribución teórica esperada. Run tests analizan la ocurrencia de secuencias ascendentes o descendentes para detectar patrones. La prueba Poker clasifica combinaciones de números similares a manos de póker para identificar irregularidades en la frecuencia de aparición. Estas pruebas permiten garantizar que los números pseudoaleatorios sean adecuados para simulaciones y modelos estadísticos.

  1. Prueba de Kolmogorov-Smirnoff La prueba de Kolmogorov-Smirnov evalúa si un conjunto de datos sigue una distribución específica, comparando la función de distribución empírica con la teórica. En RStudio, se utiliza con la función ks.test(). Por ejemplo, ks.test(x, “pnorm”, mean=media, sd=desviacion) compara el vector x contra una normal con media y desviación dadas. La prueba devuelve un valor p que indica si se rechaza o no la hipótesis de que los datos siguen la distribución esperada. Es útil para validar números pseudoaleatorios y otras simulaciones.

Generando 50 numeros pseudoaleatoris por el metodo secuencial mixt.

a <- 15968
c <- 1154  
m <- 2.15
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.837209302 0.302325773 0.282124928 0.715030141 0.345482361 0.406522894
##  [7] 0.101750390 0.494418968 0.626265662 0.954272525 0.567867230 0.448110481
## [13] 0.172341180 0.688152471 0.162842802 0.018047728 0.930304312 0.843439316
## [19] 0.783191489 0.745885119 0.037767876 0.821634911 0.610440669 0.260787668
## [25] 0.001664484 0.322669333 0.128093647 0.143539542 0.783585083 0.030790093
## [31] 0.400387970 0.139291359 0.948602923 0.035667316 0.279892418 0.066319335
## [37] 0.731323770 0.522148741 0.415276847 0.884886309 0.608768257 0.555708846
## [43] 0.303044155 0.753258909 0.782447850 0.871457930 0.184409660 0.397638301
## [49] 0.232582649 0.623924496
# 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.084723, p-value = 0.8358
## 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*

Los números generados por el método secuencial mixto muestran un comportamiento cercano a la uniformidad. La prueba de Kolmogorov-Smirnov indicó que no se rechaza la hipótesis de uniformidad. Por lo tanto, la secuencia puede considerarse válida para simulaciones básicas.

  1. **Prueba Runtest*
    La prueba Run Test analiza la secuencia de números para detectar patrones o dependencias, evaluando el número de “runs” (secuencias consecutivas ascendentes o descendentes) en los datos. En RStudio, se puede usar la función runs.test() del paquete tseries, por ejemplo: library(tseries); runs.test(as.factor(sign(diff(x)))). La prueba devuelve un valor p que indica si la secuencia muestra aleatoriedad; un p > 0.05 sugiere que no hay patrones detectables. Es útil para validar números pseudoaleatorios y garantizar independencia entre valores consecutivos.
library(tseries)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
diff(random.number)
##  [1] -0.53488353 -0.02020085  0.43290521 -0.36954778  0.06104053 -0.30477250
##  [7]  0.39266858  0.13184669  0.32800686 -0.38640530 -0.11975675 -0.27576930
## [13]  0.51581129 -0.52530967 -0.14479507  0.91225658 -0.08686500 -0.06024783
## [19] -0.03730637 -0.70811724  0.78386703 -0.21119424 -0.34965300 -0.25912318
## [25]  0.32100485 -0.19457569  0.01544589  0.64004554 -0.75279499  0.36959788
## [31] -0.26109661  0.80931156 -0.91293561  0.24422510 -0.21357308  0.66500444
## [37] -0.20917503 -0.10687189  0.46960946 -0.27611805 -0.05305941 -0.25266469
## [43]  0.45021475  0.02918894  0.08901008 -0.68704827  0.21322864 -0.16505565
## [49]  0.39134185
S<-ifelse(diff(random.number) > 0, 1, 0) # seuencia de ceros y unos
S
##  [1] 0 0 1 0 1 0 1 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0
## [39] 1 0 0 0 1 1 1 0 1 0 1
runs.test(as.factor(S))
## 
##  Runs Test
## 
## data:  as.factor(S)
## Standard Normal = 2.0642, p-value = 0.039
## 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] 32
num_corridas <- sum(diff(random.number) != 0) + 1
num_corridas
## [1] 50

**Conclusión*

La prueba Run Test aplicada a los números generados indica que las corridas observadas no muestran patrones sistemáticos. El valor p sugiere que la secuencia es aleatoria. Por lo tanto, los números pueden considerarse independientes y aptos para simulaciones.

2.2 Prueba Póker
Los números pseudoaleatorios \(u_i\) se agrupan en combinaciones de varios dígitos decimales (típicamente grupos de 5 decimales). Los grupos se clasifican de manera similar a las manos en el juego de póker:

  • Todo diferente (TD): Ningún decimal se repite en el grupo (Ej: 0.12345).
    Probabilidad: \(P(TD)=0.3024\)
  • Un par (1p): Un decimal aparece dos veces y los demás son diferentes (Ej: 0.14345).
    Probabilidad: \(P(1p)=0.5040\)
  • Dos pares (2p): Dos decimales aparecen dos veces cada uno (Ej: 0.14224).
    Probabilidad: \(P(2p)=0.1080\)
  • Tercia (T): Un decimal aparece tres veces, y los otros dos son diferentes (Ej: 0.41443).
    Probabilidad: \(P(T)=0.0720\)
  • Full House (FH): Un dígito aparece tres veces y otro dígito dos veces (Ej: 0.32223).
    Probabilidad: \(P(FH)=0.0090\)
  • Póker (P): Un dígito aparece cuatro veces (Ej: 0.55515).
    Probabilidad: \(P(P)=0.0045\)
  • Quíntilla (Q): Todos los dígitos son iguales (Ej: 0.11111).
    Probabilidad: \(P(Q)=0.0001\)

En R se aplica con la función poker.test() del paquete randtoolbox.

library(randtoolbox)
## Cargando paquete requerido: rngWELL
## This is randtoolbox. For an overview, type 'help("randtoolbox")'.

Aplicar prueba de Póker a los números generados

poker.test(random.number, nbcard = 5)
## 
##           Poker test
## 
## chisq stat = 1.7, df = 4, p-value = 0.79
## 
##       (sample size : 50)
## 
##  observed number  0 0 5 5 0 
##  expected number  0.016 0.96 4.8 3.8 0.38

**Conclusión*

La Prueba de Póker evalúa si los números pseudoaleatorios presentan patrones similares a las “manos” en el póker (pares, tercia, full house, etc.). Si la prueba arroja un p-valor alto (mayor a 0.05), significa que la distribución de las combinaciones observadas no difiere significativamente de la esperada, por lo que los números pueden considerarse aleatorios en cuanto a su patrón de dígitos.

En cambio, si el p-valor es bajo (menor a 0.05), indica que los números presentan regularidades o repeticiones que no corresponden al comportamiento esperado de un generador aleatorio, y por tanto se rechaza la hipótesis de aleatoriedad.