Phaml - 1 year ago 94

R Question

I want to draw only one number from binomial many times. Each draw corresponding to a specific probability (draw from Bernoulli with different probability). Please avoid loop.

`y<-c(1:10)`

p<- dpois(y,2) #probability vector

#not working below

rbinom(1,1,p) #only return one value

Update:

I used Jim M's

`z=vapply(p,function(z){rbinom(1,1,z)},as.integer(1L))`

Recommended for you: Get network issues from **WhatsUp Gold**. **Not end users.**

Answer Source

How about this?

```
as.numeric(runif(length(p)) < p)
```

Take n random variables from uniform distribution where n is equal to the length of probability distribution: `length(p)`

. Compare each value with each probability and return 1 if the value is smaller than the probability ( `as.numeric`

converts `TRUE/FALSE`

to `1/0`

). Also, this is a lot faster than using vapply on my machine:

```
y <- 1:1000
p <- dpois(y, 2)
rBernoulli <- function(p){
vapply(p, function(x) rbinom(1, 1, x), as.integer(1L))
}
rBernoulli2 <- function(p){
var(as.numeric(runif(length(p)) < p))
}
library(microbenchmark)
microbenchmark(rBernoulli(p), rBernoulli2(p))
## Unit: microseconds
## expr min lq mean median uq max neval
## rBernoulli(p) 2110.307 2197.771 2699.7286 2245.7425 2413.532 6966.376 100
## rBernoulli2(p) 66.045 70.062 91.8782 93.9355 103.083 186.086 100
```

Recommended from our users: **Dynamic Network Monitoring from WhatsUp Gold from IPSwitch**. ** Free Download**