Re: defining random variable with piecewise-continuous
- To: mathgroup at smc.vnet.net
- Subject: [mg79522] Re: [mg79462] defining random variable with piecewise-continuous
- From: Darren Glosemeyer <darreng at wolfram.com>
- Date: Sat, 28 Jul 2007 05:38:15 -0400 (EDT)
- References: <200707270953.FAA02959@smc.vnet.net>
sdw wrote: > any ideas on how to do this? > > basically seeking a computationally efficient way to define the PDF, which > may look like a set of continuous or discontinuous rectangle functions and > have the Mathematica random number generator produce values from this PDF > > thanks > > Here is function that will generate numbers from a piecewise rectangular density, which sounds like what you are looking for. The function takes as arguments a list of lower bounds for the intervals, a list of upper bounds, a list of density values for the intervals, and the number of random numbers desired. In[1]:= rand = Compile[{{lower, _Real, 1}, {upper, _Real, 1}, {height, _Real, 1}, {n, _Integer}}, Module[{rc, mult = (upper - lower), rr = RandomReal[1., n]}, rc = RandomChoice[height*mult -> Range[Length[height]], n]; lower[[rc]] + rr*mult[[rc]]]]; The code works by randomly selecting regions based on the probabilities of following in each region and then scaling random uniforms into the selected regions. So for instance, if the pdf is the following In[2]:= pdf[x_] := Piecewise[{{.2, 0 <= x <= 2}, {.1, 4 <= x < 6}, {.4, 6 <= x <= 7}}] ten numbers from this distribution can be generated with this input. In[3]:= rand[{0., 4., 6.}, {2., 6., 7.}, {.2, .1, .4}, 10] Out[3]= {6.4957, 1.16766, 5.80021, 1.27402, 6.50937, 6.70427, 0.728181, 1.25066, 6.49188, > 6.92062} Histograms can be used to compare the random numbers with the theoretical density. In[4]:= <<Histograms` In[5]:= Show[Histogram[rand[{0., 4., 6.}, {2., 6., 7.}, {.2, .1, .4}, 10^4], HistogramScale -> 1], Plot[pdf[x], {x, 0, 7}, PlotStyle -> {Thick}]] In[6]:= Show[Histogram[rand[{0., 4., 6.}, {2., 6., 7.}, {.2, .1, .4}, 10^4], HistogramScale -> 1, HistogramCategories -> {0, 2, 4, 6, 7}], Plot[pdf[x], {x, 0, 7}, PlotStyle -> {Thick}]] Note that for more general piecewise densities efficient methods may vary greatly depending on the shapes of the pieces. Darren Glosemeyer Wolfram Research
- References:
- defining random variable with piecewise-continuous PDF Mathematica 6
- From: "sdw" <warwick@jps.net>
- defining random variable with piecewise-continuous PDF Mathematica 6