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.

  1. prueba Kolmogórov-Smirnov La prueba de Kolmogórov-Smirnov (K-S) es una herramienta estadística que permite comparar la distribución acumulada de una muestra de datos con una distribución teórica (como la uniforme o la normal), o bien comparar dos muestras entre sí. Su propósito es verificar si los datos siguen la distribución esperada. Para ello, mide la máxima diferencia absoluta entre la función de distribución empírica de la muestra y la función de distribución teórica.

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

  1. prueba runtest

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