1

I am searching for a way to calculate the $z$-score for a given percentile $p$. I found this site doing such a calculation. They have given a formula for calculating $P(Z\leq z)$:

$$ \Phi(z) = P(Z \le z) = \int_{-\infty}^z \frac{1}{\sqrt{2\pi}}e^{\frac{-u^2}{2}}du $$

Now I have the value of $P(Z\leq z)$ and I tried solving it to find out $z$, but it was really complex to solve for $z$.

Is there any function in JAVA or PHP which can do this? Or is there any mathematical way in which we can solve for $z$? (I am considering hard-coding the $z$ table as my last choice because I would have to make some approximations in that case.)

EDIT

I forgot to mention this, the main problem I am trying to solve is to draw a random point from a normal distribution. I tried using inversecdf function of Normal Distribution. Due to the generalized implementation of that function, it is taking lot of time.

Say I want to calculate the point at $0.75$ we can do that in a quick way by finding $z$-value at that point followed by a simple math $\bar{x}+\sigma\times z$. So I wanted to find some way to get $z$-score for a given percentile.

mdewey
  • 16,541
  • 22
  • 30
  • 57
Karthik
  • 155
  • 2
  • 6
  • Hi and welcome to the site! I think you want the [inverse CDF](http://en.wikipedia.org/wiki/Normal_distribution#Quantile_function) or quantile function of the normal distribution. I've found [this](http://home.online.no/~pjacklam/notes/invnorm) page which features the implementations in several languages (PHP and JAVA are among them). – COOLSerdash Oct 03 '13 at 11:31
  • @COOLSerdash Thank you for the reply, i forgot to mention one point. I mentioned it in the edit. – Karthik Oct 03 '13 at 11:45
  • 2
    See, for example, [here](http://home.online.no/~pjacklam/notes/invnorm/) or [here](http://www.jstor.org/discover/10.2307/2347330) – Glen_b Oct 03 '13 at 12:03

1 Answers1

5

The z-table contains the area to the left of the z-number under a normal distribution with $\mu = 0$ and $\sigma = 1$. Your p-value will generally represent one minus that area (for a one tailed test). Transforming this p-value into it's corresponding z-score should not be that hard under these circumstances.

Your normal distribution with $\mu = 0$ and $\sigma = 1$ is defined by the function

$$ f(z) = \frac{1}{\sqrt{2\pi}}e^{-\frac{z^2}{2}} $$

Your p-value is

$$ p = \int_z^\infty{\frac{1}{\sqrt{2\pi}}e^{-\frac{z^2}{2}}} $$

All you have to do is plug in your numbers and solve for $z$.

Note how the integral starts at $z$ and not at $-\infty$ because we're calculating $p$ which is one minus the area to the left of $z$ (This is true for one-tailed tests. For two-tailed tests divide $p$ by two before plugging it in the above formula).

Solving for $z$ yields:

$$ \frac{1}{2} \text{erfc}\left(\frac{z}{\sqrt{2}}\right) = p $$

$$ \text{erfc}\left(\frac{z}{\sqrt{2}}\right) = 2p $$

$$ \frac{z}{\sqrt{2}} = \text{erfc}^{-1}(2p) $$

$$ z = \sqrt{2} \cdot \text{erfc}^{-1}(2p) $$

Don't know much java but after reading these docs I suspect the code would be as easy as

double pToZ(double p) {
    double z = Math.sqrt(2) * Erf.erfcInv(2*p);
    return(z);
}

Note $\text{erfc()}$ stands for $1 - \text{erf()}$ where $\text{erf}$ is the error function.

Cristian Dima
  • 1,058
  • 7
  • 17