[R] random numbers with constraints

Martin Maechler m@ech|er @end|ng |rom @t@t@m@th@ethz@ch
Thu Jan 28 16:42:25 CET 2021


>>>>> Abby Spurdle 
>>>>>     on Thu, 28 Jan 2021 08:48:06 +1300 writes:

    > I note that there's a possibility of floating point errors.
    > If all values have one digit after the decimal point, you could replace:
    > qexp (p, rate) with round (qexp (p, rate), 1).

    > However, sometimes uniroot will fail, due to problems with input.

I also think the  constrained.sample() function should not
depend on the global variable 'u',
but rather depend on 'n'   and construct 'u' from  runif(n).

Martin

    > On Thu, Jan 28, 2021 at 5:02 AM Denis Francisci
    > <denis.francisci using gmail.com> wrote:
    >> 
    >> Wonderful!
    >> This is exactly what I need!
    >> Thank you very much!!
    >> 
    >> Denis
    >> 
    >> 
    >> 
    >> Il giorno mer 27 gen 2021 alle ore 10:58 Abby Spurdle <spurdle.a using gmail.com> ha scritto:
    >>> 
    >>> u <- runif (410)
    >>> u <- (u - min (u) ) / diff (range (u) )
    >>> 
    >>> constrained.sample <- function (rate)
    >>> {   plim <- pexp (c (9.6, 11.6), rate)
    >>> p <- plim [1] + diff (plim) * u
    >>> qexp (p, rate)
    >>> }
    >>> 
    >>> diff.sum <- function (rate)
    >>> sum (constrained.sample (rate) ) - 4200
    >>> 
    >>> rate <- uniroot (diff.sum, c (1, 2) )$root
    >>> q <- constrained.sample (rate)
    >>> 
    >>> length (q)
    >>> range (q)
    >>> sum (q)
    >>> 
    >>> 
    >>> On Wed, Jan 27, 2021 at 9:03 PM Denis Francisci
    >>> <denis.francisci using gmail.com> wrote:
    >>> >
    >>> > Hi,
    >>> > I would like to generate random numbers in R with some constraints:
    >>> > - my vector of numbers must contain 410 values;
    >>> > - min value must be 9.6 and max value must be 11.6;
    >>> > - sum of vector's values must be 4200.
    >>> > Is there a way to do this in R?
    >>> > And is it possible to generate this series in such a way that it follows a
    >>> > specific distribution form (for example exponential)?
    >>> > Thank you in advance,
    >>> >
    >>> > D.



More information about the R-help mailing list