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.
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.
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.
Todo diferente (TD): Ningún decimal se repite en el grupo (Ej: 0.12345). La probabilidad de este evento es:
P(TD)=0.3024Un par (1p): Un decimal aparece dos veces y los demás son diferentes (Ej: 0.14345).
P(1p)=0.5040Dos pares (2p): Dos decimales aparecen dos veces cada uno (Ej: 0.14224).
P(2p)=0.1080Tercia (T): Un decimal aparece tres veces, y los otros dos son diferentes (Ej: 0.41443).
P(T)=0.0720Full House (FH): Un dígito aparece tres veces y otro dígito dos veces (Ej: 0.32223).
P(FH)=0.0090Poker (p): Un dígito aparece cuatro veces (Ej: 0.55515).
P(p)=0.0045Quintilla: Todos los dígitos son iguales (Ej: 0.11111).
P(Q)=0.0001library(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