prueba de validacion
introduccion
Los números pseudoaleatorios se generan mediante algoritmos deterministas que imitan el comportamiento de la aleatoriedad verdadera. Para garantizar que estos números cumplen con las propiedades estadísticas esperadas, se aplican pruebas de validación, las cuales permiten detectar patrones, sesgos o irregularidades.
En el caso de la validación de números pseudoaleatorios, la prueba se utiliza para determinar si los valores generados siguen una distribución uniforme [0,1], que es la característica fundamental de un generador de números aleatorios de calidad.
generando 50 numeros pseudoaleatorios por el metodo secuencial mixto
a <- 16807
c <- 1147
m <- 2147000000
X_n <- 41 # 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.0003214877 0.4032435887 0.3149962934 0.1427042576 0.4304574914
## [6] 0.6990582138 0.0713996469 0.0138668100 0.0594756563 0.6073553726
## [11] 0.8217480401 0.1193097536 0.2390294523 0.3680046507 0.0541644350
## [16] 0.3416600098 0.2797849250 0.3452352049 0.3680899124 0.4871588454
## [21] 0.6787145943 0.1561872310 0.0387922878 0.9819823200 0.1768524611
## [26] 0.3593143852 0.9968723996 0.4344210717 0.3149530666 0.4161909571
## [31] 0.9214173461 0.2613358365 0.2714048598 0.5014792664 0.3620312259
## [36] 0.6588141784 0.6898967089 0.0939869516 0.6386954085 0.5537308062
## [41] 0.5536610312 0.3809520191 0.6605854877 0.4602915887 0.1207322934
## [46] 0.1476562576 0.6587214914 0.1321062138 0.3091356469 0.6428188100
# 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.22094, p-value = 0.01266
## 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 no siguen una distribución uniforme"
Despues de aver generado 50 numeros aleatorios y utilizando La prueba de Kolmogórov-Smirnov pude encontrar que la u_i no sigue una distribucion uninforme
La prueba de rachas se utiliza para verificar la independencia de una secuencia de números pseudoaleatorios. Una racha es una sucesión de valores consecutivos que cumplen una misma condición, por ejemplo:
valores mayores que la media, o
valores menores que la media.
La idea es contar cuántas rachas aparecen en la secuencia.
Si hay muy pocas rachas, significa que los números se agrupan y muestran dependencia.
Si hay demasiadas rachas, sugiere un exceso de alternancia que tampoco corresponde al azar.
En resumen, esta prueba permite identificar si los números generados presentan patrones repetitivos o si, por el contrario, se comportan de manera independiente como debería ocurrir en un proceso aleatorio.
library(tseries)
## Warning: package 'tseries' was built under R version 4.4.3
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
diff(random.number)
## [1] 4.029221e-01 -8.824730e-02 -1.722920e-01 2.877532e-01 2.686007e-01
## [6] -6.276586e-01 -5.753284e-02 4.560885e-02 5.478797e-01 2.143927e-01
## [11] -7.024383e-01 1.197197e-01 1.289752e-01 -3.138402e-01 2.874956e-01
## [16] -6.187508e-02 6.545028e-02 2.285471e-02 1.190689e-01 1.915557e-01
## [21] -5.225274e-01 -1.173949e-01 9.431900e-01 -8.051299e-01 1.824619e-01
## [26] 6.375580e-01 -5.624513e-01 -1.194680e-01 1.012379e-01 5.052264e-01
## [31] -6.600815e-01 1.006902e-02 2.300744e-01 -1.394480e-01 2.967830e-01
## [36] 3.108253e-02 -5.959098e-01 5.447085e-01 -8.496460e-02 -6.977503e-05
## [41] -1.727090e-01 2.796335e-01 -2.002939e-01 -3.395593e-01 2.692396e-02
## [46] 5.110652e-01 -5.266153e-01 1.770294e-01 3.336832e-01
S<-ifelse(diff(random.number) > 0, 1, 0) # seuencia de ceros y unos
S
## [1] 1 0 0 1 1 0 0 1 1 1 0 1 1 0 1 0 1 1 1 1 0 0 1 0 1 1 0 0 1 1 0 1 1 0 1 1 0 1
## [39] 0 0 0 1 0 0 1 1 0 1 1
runs.test(as.factor(S))
##
## Runs Test
##
## data: as.factor(S)
## Standard Normal = 1.1795, p-value = 0.2382
## 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
con la prueba runtest pudimos obserbar que las corridas me dieron 29