5
$\begingroup$

I just discovered when working on Copulae that it was common knowledge that if $X$ is a continuous random variable with probability density function $F_{X}$, then $Y=F_{X}(x)$ follows a uniform distribution.

Before finding the proof online I was trying to empirically verify the above statement in R, but couldn't seem to succeed. Could someone please tell me what is wrong in my approach? In the code below I am plotting the histograms (empirical PDFs) of $10^3$ values sampled from the Normal CDF and of $10^3$ values sampled from the Cauchy CDF. Instead of observing uniform distributions, here is what I am getting:

par(mfrow=c(1,2))
hist(pnorm(ppoints(1e3)))
hist(pcauchy(ppoints(1e3)))

enter image description here

I was not expecting perfectly uniform distributions, but $10^3$ values should be enough to at least approach something that looks uniform. So what is wrong?

$\endgroup$
  • $\begingroup$ What do you mean "sampled from the Normal and Cauchy CDFs. One set of points cannot be sampled from both. ppoints seems to be a built in function, but I don't really understand its documentation. $\endgroup$ – Matthew Drury Oct 15 '15 at 21:08
  • $\begingroup$ It was clear from my code. But anyway, I edited my question for clarity. Thanks. $\endgroup$ – Antoine Oct 15 '15 at 21:09
  • 1
    $\begingroup$ R has so many built in functions that it's often not clear to me what is a variable name that someone has assigned but not provided, and what is a built in I've never heard of. $\endgroup$ – Matthew Drury Oct 15 '15 at 21:12
  • $\begingroup$ You're not generating random variables. See rnorm. $\endgroup$ – Scortchi - Reinstate Monica Oct 15 '15 at 21:16
  • 3
    $\begingroup$ ppoints (roughly speaking) generates expected uniform quantiles, not normal (or whatever) random numbers $\endgroup$ – Glen_b Oct 15 '15 at 21:17
8
$\begingroup$

I believe your code just does not do what you want it to do. Here's what you want:

set.seed(154)
x <- rnorm(10000)
hist(pnorm(x))

This histogram looks uniform.

I believe

plot(ppoints(1000), pnorm(ppoints(1000)))

results in a plot of a portion of the graph of the normal cdf.

Here's a quick verification

plot((1:100 - 50)/25, pnorm((1:100 - 50)/25)) 
points(ppoints(25), pnorm(ppoints(25)), col="blue")

enter image description here

| cite | improve this answer | |
$\endgroup$
  • 3
    $\begingroup$ +1 Yep, That's the way to do it. More generally p<thing>(r<thing>(n)) will be uniform for some distribution <thing> and sample size n. $\endgroup$ – Glen_b Oct 15 '15 at 21:18
  • 1
    $\begingroup$ thanks. What misled me is that in the documentation for pnorm it is said that the argument $q$ that should be passed is a vector of quantiles. $\endgroup$ – Antoine Oct 15 '15 at 21:21
  • $\begingroup$ @Glen_b That looks like C++ template. $\endgroup$ – Matthew Drury Oct 15 '15 at 21:23
  • $\begingroup$ @Antoine the normal use case for pnorm is when you want to use it to get the probabilty associated with a quantile, but you're using it as a transformation. $\endgroup$ – Glen_b Oct 15 '15 at 21:33

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.