On Mon, Aug 27, 2012 at 9:49 AM, JeffND <zuofeng.shan...@nd.edu> wrote: > 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)
No, not quite: this only makes 2 random variates, while before you made 2*10,000 = 20k. You can make them all in one fell swoop like this: X <- rbeta(20000, shape1, shape2) Now you might ask, "shape1" and "shape2" are only 10k long: how does this work? R will recycle shape1 and shape2 as needed, so you get a call as if you actually used rbeta(20000, c(shape1, shape1), c(shape2, shape2)) or more generally rbeta(20000, rep(shape1, length.out = 20000), rep(shape2, length.out = 20000)) If I understand your code correctly, you want each row to use the same shape1/shape2 parameters, so we will need to reshape the result of rbeta() into a matrix: it turns out that this is actually pretty easy to do for your case: matrix(rbeta(20000, shape1, shape2), ncol = 2) R will get the correct number of rows by default (it does the 20000 elements / 2 columns = 10000 rows division internally) and because R uses column-major ordering, you get the parameter arrangement by happy coincidence. (Basically, R fills up the first column first, then the second; this aligns nicely with the recycling behavior in this problem, so we get back to shape1[1] as soon as we start filling the second column) This is a little bit of happy hackery, and you might instead prefer something more explicit like this: matrix(rbeta(20000, rep(shape1, each = 2), rep(shape2, each = 2)), ncol = 2, byrow = TRUE) which will repeat shape1 and shape2 elementwise two times (so c(1,2,3) becomes c(1,1,2,2,3,3)) and then fills rowwise. It's a little clearer, at the expense of verbosity. > > 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]) > } This should follow pretty easily from the above. Hope this helps, Michael > > 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@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. ______________________________________________ R-help@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.