Prueba de validación

Introducción: Los números pseudoaleatorios (NPRs) son secuencias generadas por algoritmos que simulan el comportamiento de números aleatorios. Aunque son determinísticos, deben cumplir ciertas propiedades estadísticas para ser considerados adecuados en simulaciones, criptografía y métodos numéricos.

1. Prueba de Kolomogorov Smirnoff: La prueba de Kolmogorov–Smirnov (K-S) compara la distribución de una muestra de datos con una distribución teórica (por ejemplo, la uniforme en [0,1]) o bien compara dos muestras entre sí.

Para usar la prueba de Kolmogorov–Smirnov en RStudio, primero necesitas tener una muestra de datos. Luego aplicas la función ks.test(), donde indicas tu muestra y la distribución teórica con la que la quieres comparar (por ejemplo, uniforme o normal). El resultado te da un estadístico D y un p-valor.

Si el p-valor es grande (mayor que 0.05 normalmente), no se rechaza la hipótesis de que los datos provienen de esa distribución.

Si el p-valor es pequeño, significa que los datos se desvían significativamente y no siguen la distribución esperada.

En resumen, el uso consiste en:

Generar o tener tu muestra de datos.

Llamar a ks.test() indicando la distribución teórica a contrastar.

Interpretar el p-valor para decidir si la muestra se ajusta o no a dicha distribución.

Generando 50 números pseudo aleatorios por metodo secuencial mixto

a <- 20.88543
c <- 8000
m <- 400
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.61067875 0.75428829 0.75363519 0.73999498 0.45511346 0.50524030
##  [7] 0.55216089 0.53211762 0.11350532 0.37060747 0.74029633 0.46140725
## [13] 0.63668881 0.29751951 0.21382297 0.46578466 0.72811288 0.20695067
## [19] 0.32225377 0.73040855 0.25489660 0.32362502 0.75904769 0.85303744
## [25] 0.81605384 0.04363530 0.91134196 0.03376863 0.70527239 0.72991708
## [31] 0.24463213 0.10924721 0.28167506 0.88290470 0.43984439 0.18633912
## [37] 0.89177266 0.62505539 0.05455055 0.13931165 0.90958366 0.99704585
## [43] 0.82373139 0.20398438 0.26030155 0.43650978 0.11669446 0.43721406
## [49] 0.13140364 0.74442153
test_ks <- ks.test(random.number,"punif",0,1)
test_ks
## 
##  Exact one-sample Kolmogorov-Smirnov test
## 
## data:  random.number
## D = 0.080952, p-value = 0.8723
## 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]"

2. Prueba Run Test: La prueba de rachas (Run Test) es una técnica estadística no paramétrica utilizada para evaluar la aleatoriedad de una secuencia de datos. Se basa en analizar las rachas, que son subsecuencias de valores iguales consecutivos (por ejemplo, números mayores o menores que la media). Si el número de rachas observadas difiere mucho de lo esperado en una secuencia verdaderamente aleatoria, se interpreta como evidencia de dependencia o presencia de patrones. En cambio, si el número de rachas se encuentra dentro del rango esperado, se concluye que la secuencia no muestra ordenamientos significativos y puede considerarse aleatoria.

library(tseries)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
diff(random.number)
##  [1]  0.1436095356 -0.0006530966 -0.0136402040 -0.2848815256  0.0501268392
##  [6]  0.0469205916 -0.0200432693 -0.4186122984  0.2571021456  0.3696888652
## [11] -0.2788890840  0.1752815578 -0.3391692938 -0.0836965440  0.2519616893
## [16]  0.2623282254 -0.5211622122  0.1153030978  0.4081547782 -0.4755119515
## [21]  0.0687284232  0.4354226728  0.0939897523 -0.0369836072 -0.7724185397
## [26]  0.8677066584 -0.8775733247  0.6715037562  0.0246446947 -0.4852849529
## [31] -0.1353849146  0.1724278430  0.6012296458 -0.4430603184 -0.2535052649
## [36]  0.7054335358 -0.2667172684 -0.5705048400  0.0847610996  0.7702720123
## [41]  0.0874621945 -0.1733144595 -0.6197470119  0.0563171662  0.1762082315
## [46] -0.3198153164  0.3205195957 -0.3058104195  0.6130178905
S<-ifelse(diff(random.number) > 0, 1, 0) # seuencia de ceros y unos
S
##  [1] 1 0 0 0 1 1 0 0 1 1 0 1 0 0 1 1 0 1 1 0 1 1 1 0 0 1 0 1 1 0 0 1 1 0 0 1 0 0
## [39] 1 1 1 0 0 1 1 0 1 0 1
runs.test(as.factor(S))
## 
##  Runs Test
## 
## data:  as.factor(S)
## Standard Normal = 1.0411, p-value = 0.2978
## alternative hypothesis: two.sided
# Detectar cambios
cambios <- abs(diff(S))

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

3. Prueba Poker La prueba del póker es un método estadístico utilizado para evaluar la calidad e independencia de secuencias de números pseudoaleatorios. Su nombre proviene del juego de cartas debido a que clasifica los dígitos de manera similar a las manos del póker.

Prueba Poker

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:

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 = 2.2, df = 4, p-value = 0.7
## 
##       (sample size : 50)
## 
##  observed number  0 1 6 2 1 
##  expected number  0.016 0.96 4.8 3.8 0.38