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@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.

Reply via email to