5.2 Método de la tabla guía
También conocido como método de búsqueda indexada (Indexed Search), la idea consiste en construir \(m\) subintervalos equiespaciados en \([0,1]\) de la forma: \[I_{j}=\left[ u_{j},u_{j+1}\right) =\left[ \frac{j-1}{m},\frac{j}{m}\right) \text{ para }j=1,2,\ldots ,m\] y utilizarlos como punto de partida para la búsqueda. En una tabla guía se almacenan los indices de los cuantiles correspondientes a los extremos inferiores de los intervalos: \[g_{j}=Q_{\mathcal{I}}(u_{j})=\inf \left\{ i:F_{i}\geq u_{j}=\frac{j-1}{m}\right\}\]
El punto de partida para un valor \(U\) será \(g_{j_{0}}\) con: \[j_{0}=\left\lfloor mU\right\rfloor +1\]
En este caso, puede verse que una cota del número medio de comparaciones es: \[E\left( N\right) \leq 1+\frac{n}{m}\]
Algoritmo 5.3 (de simulación mediante tabla guía; Chen y Asau, 1974)
Inicialización:
Hacer \(F_{1}=p_{1}\).
Desde \(i=2\) hasta \(n\) hacer \(F_{i}=F_{i-1}+p_{i}\).
Cálculo de la tabla guía:
Hacer \(g_{1}=1\) e \(i=1\).
Desde \(j=2\) hasta \(m\) hacer
2.a Mientras \((j-1)/m>F_{i}\) hacer \(i=i+1\).
2.b \(g_{j}=i\)
Simulación mediante tabla guía:
Generar \(U\sim \mathcal{U}\left( 0,1\right)\).
Hacer \(j=\left\lfloor mU\right\rfloor +1\).
Hacer \(i=g_{j}\).
Mientras \(U>F_{i}\) hacer \(i=i+1\).
Devolver \(X=x_{i}\).
Este algoritmo está implementado en la función simres::rpmf.table()
(fichero rpmf.R) y devuelve también el número de comparaciones en un atributo ncomp
:
rpmf.table
## function(x, prob = 1/length(x), m, n = 1000, as.factor = FALSE) {
## # Inicializar tabla y FD
## Fx <- cumsum(prob)
## g <- rep(1,m)
## i <- 1
## for(j in 2:m) {
## while (Fx[i] < (j-1)/m) i <- i + 1
## g[j] <- i
## }
## ncomp <- i - 1
## # Generar valores
## X <- numeric(n)
## U <- runif(n)
## for(j in 1:n) {
## i <- i0 <- g[floor(U[j] * m) + 1]
## while (Fx[i] < U[j]) i <- i + 1
## ncomp <- ncomp + i - i0
## X[j] <- x[i]
## }
## if(as.factor) X <- factor(X, levels = x)
## attr(X, "ncomp") <- ncomp
## return(X)
## }
## <bytecode: 0x000000003d934448>
## <environment: namespace:simres>
Ejemplo 5.3 (Simulación de una binomial mediante tabla guía)
Repetimos la simulación del Ejemplo 5.1 anterior empleando esta rutina con \(m=n-1\).
set.seed(1)
system.time( rx <- rpmf.table(x, pmf, n-1, nsim) )
## user system elapsed
## 0.01 0.00 0.02
Número medio de comparaciones:
<- attr(rx, "ncomp")
ncomp /nsim ncomp
## [1] 0.55951
sum((1:length(x))*pmf) # Numero esperado con búsqueda secuencial
## [1] 6
Análisis de los resultados:
<- table(rx)/nsim
res plot(res, ylab = "frecuencia relativa", xlab = "valores")
points(x, pmf, pch = 4, col = "blue") # Comparación teórica