[R] Curious Behavior with Curve() and dnorm()

Peter Dalgaard p.dalgaard at biostat.ku.dk
Thu Feb 10 23:40:33 CET 2005


Thomas Hopper <thopper at cobasys.com> writes:

> I am attempting to wrap the histogram function in my own custom
> function, so that I can quickly generate some standard plots.
> 
> A part of what I want to do is to draw a normal curve over the histogram:
> 
>  > x <- rnorm(1000)
>  > hist(x, freq=F)
>  > curve(dnorm(x), lty=3, add=T)
> 
> (for normal use, x would be a vector of empirical values, but the
> rnorm() function works for testing)
> 
> That works just as you'd expect, but I've found something a bit strange.
> 
> If I try the following:
> 
>  > curve(dnorm(x, mean=mean(x), sd=sd(x)), lty=3, add=T)
> 
> I get a much flatter and broader curve (which looks like it probably
> has the same area as the first curve, though I haven't tested).
> 
> However, if I do
> 
>  > z <- sd(x)
>  > curve(dnorm(x, mean=mean(x), sd=z), lty=1, add=T)
> 
> I get the curve you'd expect; it draws right over the first curve
> (curve(dnorm(x),...), above).

I don't think that is guaranteed, actually.

Notice that curve plots the *expression* as a function of the argument
"x". So it takes a bunch of x values, evenly spread across the
abscissa collects them into a vector and plugs that in as "x" in

curve(dnorm(x, mean=mean(x), sd=sd(x)), lty=3, add=T)

I.e. the x that gets plugged into mean(x) and sd(x) has nothing to do
with your original data (except that they both fit in the same xlim)! 

-- 
   O__  ---- Peter Dalgaard             Blegdamsvej 3  
  c/ /'_ --- Dept. of Biostatistics     2200 Cph. N   
 (*) \(*) -- University of Copenhagen   Denmark      Ph: (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)             FAX: (+45) 35327907




More information about the R-help mailing list