Nelly Reduan
2018-Jul-04 22:21 UTC
[R] Generate N random numbers with a given probability and condition
Dear all, I would like to generate N random numbers with a given probability and condition but I'm not sure how to do this. For example, I have N = 20 and the vector from which to choose is seq(0, 10, 1). I have tested: x <- sample(seq(0, 10, 1), 20, replace=TRUE, prob=rep(0.28, times=length(seq(0, 10, 1)))) But I don?t know how to put the condition sum(x) <= max(seq(0, 10, 1)). Many thanks for your time Nell [[alternative HTML version deleted]]
Jeff Newmiller
2018-Jul-04 22:56 UTC
[R] Generate N random numbers with a given probability and condition
This looks like homework (which is off topic here per the Posting Guide). Also, please send your emails in plain text format to avoid us seeing your message differently than you do. On July 4, 2018 3:21:34 PM PDT, Nelly Reduan <nell.redu at hotmail.fr> wrote:>Dear all, > >I would like to generate N random numbers with a given probability and >condition but I'm not sure how to do this. >For example, I have N = 20 and the vector from which to choose is >seq(0, 10, 1). I have tested: > >x <- sample(seq(0, 10, 1), 20, replace=TRUE, prob=rep(0.28, >times=length(seq(0, 10, 1)))) > >But I don?t know how to put the condition sum(x) <= max(seq(0, 10, 1)). >Many thanks for your time >Nell > > > [[alternative HTML version deleted]]-- Sent from my phone. Please excuse my brevity.
Rolf Turner
2018-Jul-04 23:11 UTC
[R] Generate N random numbers with a given probability and condition
On 05/07/18 10:21, Nelly Reduan wrote:> Dear all, > > I would like to generate N random numbers with a given probability and condition but I'm not sure how to do this. > For example, I have N = 20 and the vector from which to choose is seq(0, 10, 1). I have tested: > > x <- sample(seq(0, 10, 1), 20, replace=TRUE, prob=rep(0.28, times=length(seq(0, 10, 1)))) > > But I don?t know how to put the condition sum(x) <= max(seq(0, 10, 1)). > Many thanks for your time.Your thinking requires considerable clarification. (1) Note that seq(0,10,1) is just 0, 1, 2, ..., 10. (2) Hence length(seq(0,10,1)) is 11. (3) Likewise max(seq(0,10,1)) is 10. (4) Your prob vector is *constant* --- so specifying "prob" makes no difference --- the result is the same as if you omitted "prob". (5) You need to think carefully about what you really mean by "random". In what way do you want the final result to be "random"? I expect that the lecturer who assigned this problem to you needs to clarify his/her thinking as well. cheers, Rolf Turner -- Technical Editor ANZJS Department of Statistics University of Auckland Phone: +64-9-373-7599 ext. 88276
Nelly Reduan
2018-Jul-11 00:11 UTC
[R] Generate N random numbers with a given probability and condition
Thank you very much for your reply. By omitting the probability, the expected results could be: c(2, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0) c(0, 0, 1, 0, 0, 1, 1, 0, 6, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0) If I omit the probability, I would like to generate N random positive integers that sum to M and the integers would be selected from a uniform distribution. Many thanks for your time Nell ________________________________ De : Rolf Turner <r.turner at auckland.ac.nz> Envoy? : mercredi 4 juillet 2018 16:11:11 ? : Nelly Reduan Cc : r-help at r-project.org Objet : Re: [R] Generate N random numbers with a given probability and condition On 05/07/18 10:21, Nelly Reduan wrote:> Dear all, > > I would like to generate N random numbers with a given probability and condition but I'm not sure how to do this. > For example, I have N = 20 and the vector from which to choose is seq(0, 10, 1). I have tested: > > x <- sample(seq(0, 10, 1), 20, replace=TRUE, prob=rep(0.28, times=length(seq(0, 10, 1)))) > > But I don?t know how to put the condition sum(x) <= max(seq(0, 10, 1)). > Many thanks for your time.Your thinking requires considerable clarification. (1) Note that seq(0,10,1) is just 0, 1, 2, ..., 10. (2) Hence length(seq(0,10,1)) is 11. (3) Likewise max(seq(0,10,1)) is 10. (4) Your prob vector is *constant* --- so specifying "prob" makes no difference --- the result is the same as if you omitted "prob". (5) You need to think carefully about what you really mean by "random". In what way do you want the final result to be "random"? I expect that the lecturer who assigned this problem to you needs to clarify his/her thinking as well. cheers, Rolf Turner -- Technical Editor ANZJS Department of Statistics University of Auckland Phone: +64-9-373-7599 ext. 88276 [[alternative HTML version deleted]]
Nelly Reduan
2018-Jul-11 17:14 UTC
[R] Generate N random numbers with a given probability and condition
Many thanks Jim for your help. I am trying to apply the permutations with a sequence of 20 but I obtain the error message: Error in matrix(NA, nrow = nrows, ncol = lenx) : invalid 'nrow' value (too large or NA) In addition: Warning message: In matrix(NA, nrow = nrows, ncol = lenx) : NAs introduced by coercion to integer range Here is the code: library(partitions) library(crank) r <- t(restrictedparts(10, 20)) r <- split(r, seq(nrow(r))) rp <- crank::permute(r[[sample(1:length(r), 1)]]) rp[sample(1:dim(rp)[1],1),] In this case, Is it correct to permute the elements of a vector rather than to permute a vector ? Many thanks for your time. Have a nice day Nell ________________________________ De : Jim Lemon <drjimlemon at gmail.com> Envoy? : mardi 10 juillet 2018 17:44:13 ? : Nelly Reduan Objet : Re: [R] Generate N random numbers with a given probability and condition Hi Nell, I may not have the right idea about this, but I think you need to do this in two steps if it can be done. Let's say you want a sequence of 20 (N) numbers between 0 and 10 that sums to 10 (M). You can enumerate the monotonically increasing sequences like this: c(0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1) c(0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2) ... c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10) So if you select one of these sequences at random, there will be a further set of sequences that are permutations of it. By randomly selecting one of those permutations, I think you can solve your problem. However, this is going to be computationally intensive, with the set of permutations being very large for large N. Here is an example using N = M = 5: # enumerate the sequences = M rs5<-list(c(1,1,1,1,1),c(0,1,1,1,2),c(0,0,1,1,3),c(0,0,0,1,4), c(0,0,1,2,2),c(0,0,0,2,3),c(0,0,0,0,5)) library(crank) # generate the permutations for one sequence (120 in this case) rs5_s1<-permute(rs5[[sample(1:length(rs5),1)]]) # select one of the permutations at random rs5_s1[sample(1:dim(rs5_s1)[1],1),] [1] 4 0 1 0 0 Jim On Wed, Jul 11, 2018 at 10:11 AM, Nelly Reduan <nell.redu at hotmail.fr> wrote:> Thank you very much for your reply. > > > By omitting the probability, the expected results could be: > > > c(2, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0) > > > c(0, 0, 1, 0, 0, 1, 1, 0, 6, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0) > > > If I omit the probability, I would like to generate N random positive integers that sum to M and the integers would be selected from a uniform distribution. > > > Many thanks for your time > > Nell > > > ________________________________ > De : Rolf Turner <r.turner at auckland.ac.nz> > Envoy? : mercredi 4 juillet 2018 16:11:11 > ? : Nelly Reduan > Cc : r-help at r-project.org > Objet : Re: [R] Generate N random numbers with a given probability and condition > > > On 05/07/18 10:21, Nelly Reduan wrote: > >> Dear all, >> >> I would like to generate N random numbers with a given probability and condition but I'm not sure how to do this. >> For example, I have N = 20 and the vector from which to choose is seq(0, 10, 1). I have tested: >> >> x <- sample(seq(0, 10, 1), 20, replace=TRUE, prob=rep(0.28, times=length(seq(0, 10, 1)))) >> >> But I don?t know how to put the condition sum(x) <= max(seq(0, 10, 1)). >> Many thanks for your time. > > Your thinking requires considerable clarification. > > (1) Note that seq(0,10,1) is just 0, 1, 2, ..., 10. > > (2) Hence length(seq(0,10,1)) is 11. > > (3) Likewise max(seq(0,10,1)) is 10. > > (4) Your prob vector is *constant* --- so specifying "prob" makes > no difference --- the result is the same as if you omitted "prob". > > (5) You need to think carefully about what you really mean by "random". > In what way do you want the final result to be "random"? > > I expect that the lecturer who assigned this problem to you needs to > clarify his/her thinking as well. > > cheers, > > Rolf Turner > > -- > Technical Editor ANZJS > Department of Statistics > University of Auckland > Phone: +64-9-373-7599 ext. 88276 > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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.[[alternative HTML version deleted]]
Jim Lemon
2018-Jul-11 21:59 UTC
[R] Generate N random numbers with a given probability and condition
Hi Nell, As I said, the number of permutations increases rapidly with the number of values to be permuted. Using the package "permute", which is much more sophisticated than the basic function in the crank package, a vector of length 20 has 2.432902e+18 possible permutations. While your problem can be solved for small vectors by simply generating all the permutations and then sampling that set, it is not a general solution. You may be able to use the functions in the permute package to handle a 20 element vector, but I am not familiar enough with the functions to tell you how. Jim On Thu, Jul 12, 2018 at 3:14 AM, Nelly Reduan <nell.redu at hotmail.fr> wrote:> Many thanks Jim for your help. I am trying to apply the permutations with a > sequence of 20 but I obtain the error message: > > > Error in matrix(NA, nrow = nrows, ncol = lenx) : > invalid 'nrow' value (too large or NA) > In addition: Warning message: > In matrix(NA, nrow = nrows, ncol = lenx) : > NAs introduced by coercion to integer range > > Here is the code: > > library(partitions) > library(crank) > r <- t(restrictedparts(10, 20)) > r <- split(r, seq(nrow(r))) > rp <- crank::permute(r[[sample(1:length(r), 1)]]) > rp[sample(1:dim(rp)[1],1),] > > In this case, Is it correct to permute the elements of a vector rather than > to permute a vector ? > > > Many thanks for your time. > > Have a nice day > > Nell > > > ________________________________ > De : Jim Lemon <drjimlemon at gmail.com> > Envoy? : mardi 10 juillet 2018 17:44:13 > ? : Nelly Reduan > Objet : Re: [R] Generate N random numbers with a given probability and > condition > > Hi Nell, > I may not have the right idea about this, but I think you need to do > this in two steps if it can be done. Let's say you want a sequence of > 20 (N) numbers between 0 and 10 that sums to 10 (M). You can enumerate > the monotonically increasing sequences like this: > > c(0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1) > c(0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2) > ... > c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10) > > So if you select one of these sequences at random, there will be a > further set of sequences that are permutations of it. By randomly > selecting one of those permutations, I think you can solve your > problem. However, this is going to be computationally intensive, with > the set of permutations being very large for large N. Here is an > example using N = M = 5: > > # enumerate the sequences = M > rs5<-list(c(1,1,1,1,1),c(0,1,1,1,2),c(0,0,1,1,3),c(0,0,0,1,4), > c(0,0,1,2,2),c(0,0,0,2,3),c(0,0,0,0,5)) > library(crank) > # generate the permutations for one sequence (120 in this case) > rs5_s1<-permute(rs5[[sample(1:length(rs5),1)]]) > # select one of the permutations at random > rs5_s1[sample(1:dim(rs5_s1)[1],1),] > [1] 4 0 1 0 0 > > Jim > > On Wed, Jul 11, 2018 at 10:11 AM, Nelly Reduan <nell.redu at hotmail.fr> wrote: >> Thank you very much for your reply. >> >> >> By omitting the probability, the expected results could be: >> >> >> c(2, 0, 0, 0, 0, 0, 1, 0, 5, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0) >> >> >> c(0, 0, 1, 0, 0, 1, 1, 0, 6, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0) >> >> >> If I omit the probability, I would like to generate N random positive >> integers that sum to M and the integers would be selected from a uniform >> distribution. >> >> >> Many thanks for your time >> >> Nell >> >> >> ________________________________ >> De : Rolf Turner <r.turner at auckland.ac.nz> >> Envoy? : mercredi 4 juillet 2018 16:11:11 >> ? : Nelly Reduan >> Cc : r-help at r-project.org >> Objet : Re: [R] Generate N random numbers with a given probability and >> condition >> >> >> On 05/07/18 10:21, Nelly Reduan wrote: >> >>> Dear all, >>> >>> I would like to generate N random numbers with a given probability and >>> condition but I'm not sure how to do this. >>> For example, I have N = 20 and the vector from which to choose is seq(0, >>> 10, 1). I have tested: >>> >>> x <- sample(seq(0, 10, 1), 20, replace=TRUE, prob=rep(0.28, >>> times=length(seq(0, 10, 1)))) >>> >>> But I don?t know how to put the condition sum(x) <= max(seq(0, 10, 1)). >>> Many thanks for your time. >> >> Your thinking requires considerable clarification. >> >> (1) Note that seq(0,10,1) is just 0, 1, 2, ..., 10. >> >> (2) Hence length(seq(0,10,1)) is 11. >> >> (3) Likewise max(seq(0,10,1)) is 10. >> >> (4) Your prob vector is *constant* --- so specifying "prob" makes >> no difference --- the result is the same as if you omitted "prob". >> >> (5) You need to think carefully about what you really mean by "random". >> In what way do you want the final result to be "random"? >> >> I expect that the lecturer who assigned this problem to you needs to >> clarify his/her thinking as well. >> >> cheers, >> >> Rolf Turner >> >> -- >> Technical Editor ANZJS >> Department of Statistics >> University of Auckland >> Phone: +64-9-373-7599 ext. 88276 >> >> [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >> 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.
Duncan Murdoch
2018-Jul-12 00:13 UTC
[R] Generate N random numbers with a given probability and condition
On 04/07/2018 6:21 PM, Nelly Reduan wrote:> Dear all, > > I would like to generate N random numbers with a given probability and condition but I'm not sure how to do this. > For example, I have N = 20 and the vector from which to choose is seq(0, 10, 1). I have tested: > > x <- sample(seq(0, 10, 1), 20, replace=TRUE, prob=rep(0.28, times=length(seq(0, 10, 1)))) > > But I don?t know how to put the condition sum(x) <= max(seq(0, 10, 1)). > Many thanks for your timeI'd recommend an MCMC solution to this problem. Set up a distribution that is uniform on vectors that satisfy the conditions, with penalties on vectors that don't. Use the Metropolis algorithm with proposals that pick a pair of entries and increase one, decrease the other, then let MCMC run. At the end, filter out the cases that violate the conditions. The hard part is knowing how long to let it run for a satisfactory sample, and how correlated later draws will be. Propp and Wilson's perfect sampling algorithm might allow an exact draw, though I don't quite see how, and I'm not sure it would be worth the trouble. Just run for a few thousand steps and it should be fine. Duncan Murdoch
Göran Broström
2018-Jul-12 07:44 UTC
[R] Generate N random numbers with a given probability and condition
On 2018-07-05 00:21, Nelly Reduan wrote:> Dear all, > > I would like to generate N random numbers with a given probability and condition but I'm not sure how to do this. > For example, I have N = 20 and the vector from which to choose is seq(0, 10, 1). I have tested: > > x <- sample(seq(0, 10, 1), 20, replace=TRUE, prob=rep(0.28, times=length(seq(0, 10, 1)))) > > But I don?t know how to put the condition sum(x) <= max(seq(0, 10, 1)). > Many thanks for your time > NellMaybe the paper "Acceptance?Rejection Sampling from the Conditional Distribution of Independent Discrete Random Variables, given their Sum", Statistics 34, pages 247-257, by Leif Nilsson and myself (2000) is relevant? G?ran> > > [[alternative HTML version deleted]] > > > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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. >
David Winsemius
2018-Jul-12 15:22 UTC
[R] Generate N random numbers with a given probability and condition
> On Jul 12, 2018, at 12:44 AM, G?ran Brostr?m <goran.brostrom at umu.se> wrote: > > "Acceptance?Rejection Sampling from the Conditional Distribution of Independent Discrete Random Variables, given their Sum", Statistics 34, pages 247-257Dear Go:ran; I'm fully retired with no subscriber academic library that I can easily access. I've done a good faith search and can find no pdf's and the publisher website is apparently unable to deliver paid copies at this time. I wonder if you would be so kind as to send a preprint or other form of that article? I'm not so much interested in the the statistics as I am to see the two mentioned applications. Best regards; David Winsemius Alameda, CA, USA