[R] how to generate a normal distribution with mean=1, min=0.2, max=0.8

Mike Miller mbmiller+l at gmail.com
Fri Apr 29 07:05:58 CEST 2011


I just realized that I had misread what was wanted -- the code I wrote was 
for mean=0, sd=1, not for mean=1.  So for mean=m, and sd=s, lower limit L 
and upper limit U, this approach will work:

n <- 1000

m <- 1
s <- 1

L <- .2
U <- .8

p_L <- pnorm(L, mean=m, sd=s)
p_U <- pnorm(U, mean=m, sd=s)


x <- qnorm(runif(n, p_L, p_U), mean=m, sd=s)

Or it could be written on one line:

x <- qnorm(runif(n, pnorm(L, mean=m, sd=s), pnorm(U, mean=m, sd=s)), mean=m, sd=s)

Mike


On Thu, 28 Apr 2011, Mike Miller wrote:

> Good point.  It would be absurdly inefficient if the upper and lower 
> limits on the interval of interest were, say, 0.2 and 0.201 instead of 
> 0.2 and 0.8. Here's what I think is probably the best general approach:
>
> Compute the CDF for the upper and lower limits of the interval and 
> generate uniform random numbers within that range of CDF values, then 
> compute the inverse CDF of those values.  To be explicit:
>
> n <- 1000
> L <- .2
> U <- .8
>
> p_L <- pnorm(L)
> p_U <- pnorm(U)
>
> x <- qnorm(runif(n, p_L, p_U))
>
> It is very fast and it always produces exactly the desired number ("n") 
> of random normal values.
>
> Mike
>
> --
> Michael B. Miller, Ph.D.
> Bioinformatics Specialist
> Minnesota Center for Twin and Family Research
> Department of Psychology
> University of Minnesota
>
>
>
> On Thu, 28 Apr 2011, Carl Witthoft wrote:
>
>> That method (creating lots of samples and throwing most of them away) is 
>> usually frowned upon :-).
>> 
>> Try this:  (I haven't, so it may well have syntax errors)
>> 
>> % n28<- dnorm(seq(.2,.8,by=.001),mean=1,sd=1)
>> 
>> % x <- sample(seq(.2,.8,by=.001), size=500,replace=TRUE, prob=n28)
>> 
>> And I guess in retrospect this  will get really ugly if you want, say, a 
>> sampling grid resolution of 1e-6 or so.
>> 
>> Anyone know what's applicable from the "sampling" package?
>> 
>> 
>> Carl
>> 
>> -------<quote>__________________
>> From: David Winsemius <dwinsemius_at_comcast.net>
>> Date: Thu, 28 Apr 2011 13:06:21 -0400
>> 
>> On Apr 28, 2011, at 12:09 PM, Ravi Varadhan wrote:
>> 
>>> Surely you must be joking, Mr. Jianfeng.
>>> 
>> 
>> Perhaps not joking and perhaps not with correct statistical specification.
>> 
>> A truncated Normal could be simulated with:
>> 
>> set.seed(567)
>> x <- rnorm(n=50000, m=1, sd=1)
>> xtrunc <- x[x>=0.2 & x <=0.8]
>> require(logspline)
>> plot(logspline(xtrunc, lbound=0.2, ubound=0.8, nknots=7))
>> 
>> -- 
>> David.
>> 
>> 
>> 
>> 
>>> -----Original Message-----
>> 
>>> From: r-help-bounces_at_r-project.org 
>> [mailto:r-help-bounces_at_r-project.org
>> 
>>> ] On Behalf Of Mao Jianfeng
>> 
>> 
>> 
>>> Dear all,
>> 
>>> 
>> 
>>> This is a simple probability problem. I want to know, How to
>> 
>>> generate a
>> 
>>> normal distribution with mean=1, min=0.2 and max=0.8?
>> 
>>> 
>> 
>> ______________________________________________
>> R-help at 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.
>> 
>



More information about the R-help mailing list