[R] options in 'rnorm' to set the lower bound of normal distribution to 0 ?

Prof Brian Ripley ripley at stats.ox.ac.uk
Thu Mar 27 14:02:39 CET 2008


On Thu, 27 Mar 2008, Tom Cohen wrote:

>
> Dear list,

>  I have a dataset containing values obtained from two different 
> instruments (x and y). I want to generate 5 samples from normal 
> distribution for each instrument based on their means and standard 
> deviations. The problem is values from both instruments are 
> non-negative, so if using rnorm I would get some negative values. Is 
> there any options to determine the lower bound of normal distribution to 
> be 0 or can I simulate the samples in different ways to avoid the 
> negative values?

Well, that would not be a normal distribution.

If you want a _truncated_ normal distribution it is very easy by 
inversion.  E.g.

trunc_rnorm <- function(n, mean = 0, sd = 1, lb = 0)
{
    lb <- pnorm(lb, mean, sd)
    qnorm(runif(n, lb, 1), mean, sd)
}

but I suggest you may rather want samples from a lognormal.

>
>
>  > dat
>    id     x         y
> 75 101 0.134 0.1911315
> 79 102 0.170 0.1610306
> 76 103 0.134 0.1911315
> 84 104 0.170 0.1610306
> 74 105 0.134 0.1911315
> 80 106 0.170 0.1610306
> 77 107 0.134 0.1911315
> 81 108 0.170 0.1610306
> 82 109 0.170 0.1610306
> 78 111 0.170 0.1610306
> 83 112 0.170 0.1610306
> 85 113 0.097 0.2777778
> 2  201 1.032 1.5510434
> 1  202 0.803 1.0631001
> 5  203 1.032 1.5510434
>
> mu<-apply(dat[,-1],2,mean)
> sigma<-apply(dat[,-1],2,sd)
>  len<-5
> n<-20
> s1<-vector("list",len)
>  set.seed(7)
> for(i in 1:len){
>    s1[[i]]<-cbind.data.frame(x=rnorm(n*i,mean=mu[1],sd=sigma[1]),
>                             y=rnorm(n*i,mean=mu[2],sd=sigma[2]))
>               }
>
> Thanks for any help,
> Tom
>
>
> ---------------------------------
> S?? efter k??leken!
>
> 	[[alternative HTML version deleted]]
>
>

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595



More information about the R-help mailing list