I was implementing a simple scheme of Bernoulli distribution sampler. $ X \sim B(p) $. I have a function that generates a uniform random number $r \in (0,1)$. Then, I set $ X = 1 $ if $p > r $, and $X =0$ otherwise. Is this correct?
Asked
Active
Viewed 5,184 times
1 Answers
4
If $X$ is a Bernoulli random variable then $E[X]=p$ and $V[X]=p(1-p)$. For example:
> x <- rbinom(1000,1,0.3)
> mean(x)
[1] 0.302
> var(x)
[1] 0.211007
The most basic way to generate a Bernoulli sample is (Kachitvichyanukul and Schmeise): $$\begin{align} 1.&\quad x \leftarrow 0, k \leftarrow 0 \\ 2.&\quad \text{Repeat} \\ &\quad\quad \text{Generate } u\sim\mathcal{U}(0,1), k\leftarrow k + 1 \\ &\quad\quad \text{if }u\le p\text{ then } x \leftarrow x + 1\\ &\quad\text{Until }k = n \\ 3.&\text{Return}\end{align}$$ This algorithm generates $x$ successes out of $n$ trials, but can be slightly modified to generate a sample form the Bernoulli distribution. In R:
> rbernoulli <- function(n, p) {
+ x <- c()
+ for (i in 1:n) {
+ u <- runif(1,0,1)
+ if (u <= p)
+ x <- c(x, 1)
+ else
+ x <- c(x, 0)
+ }
+ return (x)
+ }
> x <- rbernoulli(1000, 0.3)
> mean(x)
[1] 0.314
> var(x)
[1] 0.2156196
Sergio
- 5,951
rbernoullican be written more succinctly (and far more efficiently) asrbernoulli <- function(n,p) runif(n) < p. Many people would find this much clearer than the pseudocode, too. (2) Checking the variance is redundant. A thorough verification of accuracy (assuming the values truly are independent) requires only (a) demonstrating that all the results are zeros or ones and (b) the proportion of ones is not significantly different from $p$. – whuber May 29 '14 at 18:55