2016-10-14 2 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) n은 확률 분포의 길이와 동일이다

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

균일 한 분포로부터 임의의 N 개의 변수를 가지고. 각 값을 각 확률과 비교하고 값이 확률 (as.numericTRUE/FALSE에서 1/0으로 변환)보다 작 으면 1을 반환합니다. 또한,이 내 컴퓨터에 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)