R's Normal Distribution Functions: rnorm and pals
Posted: Wednesday, July 14th, 2010
The rnorm() function in R is a convenient way to simulate values from the normal distribution, characterized by a given mean and standard deviation. I hadn't previously used the associated commands dnorm() (normal density function), pnorm() (cumulative distribution function), and qnorm() (quantile function) before-- so I made a simple demo. The *norm functions generate results based on a well-behaved normal distribution, while the corresponding functions density(), ecdf(), and quantile() compute empirical values. The following example could be extended to graphically describe departures from normality (or some other distribution-- see rt(), runif(), rcauchy() etc.) in a data set.
# sample a normal distribution, with a mean of 5 and sd of 2, 100 times x <- rnorm(100, mean=5, sd=2) # sort in ascending order x.sorted <- sort(x) # compute the empirical cumulative distribution function x.ecdf <- ecdf(x.sorted) # plot the expected and actual probability density plot(x.sorted, dnorm(x.sorted, mean=5, sd=2), type='l', ylim=c(0,1), ylab='Probability', xlab='Value', main='rnorm(), dnorm(), pnorm(), and qnorm()') lines(density(x), col=1, lty=2) # add the expected and actual cumulative probability lines(x.sorted, pnorm(x.sorted, mean=5, sd=2), type='l', col=2) lines(x.sorted, x.ecdf(x.sorted), type='l', col=2, lty=2) # add the expected and actual p=0.5 (median) and p=0.95 quantiles abline(v=qnorm(c(0.5, 0.95), mean=5, sd=2), col=3) abline(v=quantile(x, probs=c(0.5, 0.95)), col=3, lty=2) # add the original x values rug(x) # annotate legend('topleft', legend=c('Probability Density','Cumulative Probability','[0.5, 0.95] Quantiles'), lty=1, col=1:3, bty='n')