2016-10-14 9 views
0

何度も二項から一つの数だけ描きたい。それぞれのドローは特定の確率に対応しています(異なる確率でベルヌーイから引き出します)。ループは避けてください。確率を変えて二項から引き出す

y<-c(1:10) 
p<- dpois(y,2) #probability vector 

#not working below 

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

アップデート: 私はベルヌーイ一部を除いて、ジム・Mさんz=vapply(p,function(z){rbinom(1,1,z)},as.integer(1L))同じコードを使用し、MATLABは67Sであるが、Rは520Sをとります。

答えて

4

これはいかがですか? length(p)

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

nは、確率分布の長さに等しい均一な分布からのN個の確率変数を取ります。各値を各確率と比較し、値が確率よりも小さい場合は1を返します(as.numericTRUE/FALSEから1/0に変換されます)。また、これは私のマシン上でvapply使用するよりもはるかに高速です:

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 
+0

なぜあなたのユニフォームは確率条件ベルヌーイで与えられますか? – alphabetagamma

+1

@Phdaml一様分布からの価値を取らず、それを成功確率と比較して1を返すべきであるとすれば、Bernoulliからの数値を、同じ成功確率を前提として描くことに等しいでしょうか?私は物事をより速くするためにこのアプローチを使用しています。 – parksw3

1

pは確率ベクトルであるため、それぞれの確率に同じ関数を順番に適用することで、各確率に対してBernouilliランダム描画を生成することができます。 vapplyを使用して、戻り値(この場合は整数)を入力します。

set.seed(12345) 

y <- 1:10 
p <- dpois(y, 2) 

rBernoulli <- vapply(p, function(x) rbinom(1, 1, x), as.integer(1L)) 
1

それは、pがベクトルのとき、あまりにも同様の作業を行うことができますrbinomが判明します。それは受け入れられた答えよりもわずかに遅いです。

rbinom(length(p),size=1,p) 
関連する問題