\frac{f(w)}{g(w)} \leq c \text{ para todo $w$.}
O algoritmo pode ser escrito como:
- Gere W com densidade g;
- Gere um número U \sim \mathcal{U}(0,1);
- Se U \leq \frac{f(W)}{c g(W)}, aceite o valor W. Caso contrário, retorne ao passo 1.
Exemplo no R.
Suponha que queiramos gerar valores de uma v.a. com densidade
f(x) = 12 x^2 (1-x), \ 0 < x < 1.
Note que X\sim B(3,2). Como esta variável pertence ao intervalo (0,1), podemos considerar o método com g(x)=1, para x \in (0,1), i.e, uma distribuição uniforme. Para determinar o menor valor de c tal que f(x)/g(x) \leq c, maximizamos
\frac{f(x)}{g(x)} = 12 x^2 (1-x),
obtendo x=2/3. Assim, f(x)/g(x) \leq 12 (2/3)^2 (1/3)=16/9=c. Assim, temos que
\frac{f(x)}{c \ g(x)} = \frac{27}{4} x^2 (1-x).
Assim, para este exemplo o algoritmo fica:
- Gere u_1 e u_2 com distribuição \mathcal{U}(0,1);
- Se u_2 \leq \frac{27}{4} u^2_1 (1-u_1), aceite o valor u_1. Caso contrário, retorne ao passo 1.
O código em R, adaptado de uma postagem do blog "Playing with R" (para ler, clique aqui),
pode ser escrito como:
pode ser escrito como:
x = runif(10000,0,1) #gerando os valores que podem ser aceitos ou não
accept = c()
for(i in 1:length(x)){
U = runif(1)
if(U <= (27/4)*(x[i]^2)*(1-x[i])) {
accept[i] = 'Yes'
}
else if(U > (27/4)*(x[i]^2)*(1-x[i])) {
accept[i] = 'No'
}
}
T = data.frame(x, accept = factor(accept, levels= c('Yes','No')))
xseq=seq(0,1,0.01)
hist(T[,1][T$accept=='Yes'], breaks = seq(0,1,0.01), ylim=c(0,2), freq = FALSE, main = 'Histogram of X', xlab = 'X')
lines(xseq, dbeta(xseq,3,2))
library(ggplot2)
print(qplot(x, data = T, geom = 'histogram', fill = accept, binwidth=0.01))
Nenhum comentário:
Postar um comentário