[R] How to generate a matrix of Beta or Binomial distribution

Rui Barradas ruipbarradas at sapo.pt
Mon Aug 27 21:24:03 CEST 2012


Hello,

I'm glad it helped.
Inline.
Em 27-08-2012 19:00, Zuofeng Shang escreveu:
> Hi Rui,
>
> Many thanks for your excellent code! That works very well. But I still 
> have a kind of naive question about the set.seed(1)
>
> Consider shape1=c(1,3) and shape2=c(2,4)
>
> Using R I got that
>
> > set.seed(1)
> > rbeta(2,c(1,3),c(2,4))
> [1] 0.5803922 0.4679171
>
> > set.seed(1)
> > c(rbeta(1,1,2),rbeta(1,3,4))
> [1] 0.5803922 0.4679171
>
> They have the same outputs. So rbeta(2,shape1,shape2) is the correct 
> solution which is equivalent to operating rbeta() componentwise to 
> shape1 and shape2. This is exactly the solution I wanted. Thanks a lot!
>
> But I also found the following:
>
> set.seed(1)
> > rbeta(1,1,2)
> [1] 0.5803922
>
> > set.seed(1)
> > rbeta(1,3,4)
> [1] 0.3016368
>
> This is pretty strange. Why is the second one 0.3016368 instead of 
> being 0.4679171? Probably I was wrong somewhere here.

No, you are not wrong, and no, it is not strange. You are restarting the 
random number generator so your _first_ random beta number cannot be 
eqaul to the _second_ one. Just look:

set.seed(1)
rbeta(1,3,4) # 0.3016368

set.seed(1)
rbeta(2,3,4) # 0.3016368 0.4679171

The second is, as expected, what you had. When yo change the beta 
parameters, the numbers must also change (obvious!)

Rui Barradas

>
> The binomial code works very well. Thanks for this very much!
>
> Have a nice day.
> Jeff
>
> 于 8/27/2012 1:25 PM, Rui Barradas 写道:
>> Hello,
>>
>> Try the following.
>>
>> set.seed(1)
>> X <- rbeta(2*length(shape1), rep(shape1, each = 2), rep(shape2, each 
>> = 2))
>> X <- matrix(X, ncol = 2, byrow = TRUE)
>>
>> #-- binomial
>>
>> n <- 10
>> p <- runif(10000)
>>
>> Y1 <- matrix(nrow = 10000, ncol = 10)
>>
>> set.seed(6292)
>> for(i in 1:10000){
>>       Y1[i, ] <- rbinom(n, 2, p[i])
>> }
>>
>> set.seed(6292)
>> Y2 <- rbinom(n*length(p), 2, rep(p, each = 10))
>> Y2 <- matrix(Y2, ncol = n, byrow = TRUE)
>>
>> identical(Y1, Y2) #TRUE
>>
>> The trick is not to use argument recycling.
>>
>> Hope this helps,
>>
>> Rui Barradas
>>
>> Em 27-08-2012 15:49, JeffND escreveu:
>>> Hi folks,
>>>
>>> I have a question about how to efficiently produce random numbers 
>>> from Beta
>>> and Binomial distributions.
>>>
>>> For Beta distribution, suppose we have two shape vectors shape1 and 
>>> shape2.
>>> I hope to generate a 10000 x 2 matrix X whose i th rwo is a sample from
>>> reta(2,shape1[i]mshape2[i]). Of course this can be done via loops:
>>>
>>> for(i in 1:10000)
>>> {
>>> X[i,]=rbeta(2,shape1[i],shape2[i])
>>> }
>>>
>>> However, the above code is time consuming. It would be better to 
>>> directly
>>> generate X without any loops. I tried the following code
>>>
>>> X<- rbeta(2,shape1,shape2)
>>>
>>> but it looks not right. So I was wondering if there is an R code 
>>> doing this.
>>>
>>> For Binomial distribution, I have a similar question.  I hope to 
>>> generate a
>>> 10000 x n matrix Y whose i th row is a sample from rbinom(n,2,p[i]), 
>>> where p
>>> is a vector of binomial probabilities. We can also do it by loops
>>>
>>> for(i in 1:10000)
>>> {
>>> Y[i,]=rbinom(n,2,p[i])
>>> }
>>>
>>> But it would be nice to do it without using any loops. Is this 
>>> possible in
>>> R?
>>>
>>> Many thanks for great help and suggestions!
>>> Jeff
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> -- 
>>> View this message in context: 
>>> http://r.789695.n4.nabble.com/How-to-generate-a-matrix-of-Beta-or-Binomial-distribution-tp4641422.html
>>> Sent from the R help mailing list archive at Nabble.com.
>>>
>>> ______________________________________________
>>> R-help at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>> PLEASE do read the posting guide 
>>> http://www.R-project.org/posting-guide.html
>>> and provide commented, minimal, self-contained, reproducible code.
>
>




More information about the R-help mailing list