[R] Generate N random numbers with a given probability and condition

Jim Lemon drj|m|emon @end|ng |rom gm@||@com
Wed Jul 11 23:59:58 CEST 2018


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 using 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 using 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 using 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 using auckland.ac.nz>
>> Envoyé : mercredi 4 juillet 2018 16:11:11
>> À : Nelly Reduan
>> Cc : r-help using 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 using 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.




More information about the R-help mailing list