The Two Piece Normal Distribution

The two-piece normal, also known as split normal, binormal, or double-Gaussian,  results from joining at the mode the corresponding halves of two normal distributions with the same mode $\mu$ but different standard deviations $\sigma_1$ and $\sigma_2$. This idea can be seen in the following graph where we can see in blue and pink the two half densities and the resulting two-piece normal density.


The two-piece normal was proposed by German physicist and phycologist Gustav Fechner -who is also consider the founder of psychophysics– around 1887 but published posthumously ten years later. Unfortunately, Fechner work did not become popular and this lead to a series of re discoveries (as recent as 2016!). You can see a brief recap of this interesting journey in my previous post Brief History of the Two-Piece Normal.


Definition. Let $f: \mathbb{R} \mapsto \mathbb{R}_{+}$ be the probability density function (pdf) of the normal distribution The pdf of the two-piece normal is given by

s(x) := s\left(x; \mu,\sigma_1,\sigma_2\right) =
\dfrac{2}{\sigma_1+\sigma_2}f\left(\dfrac{x-\mu}{\sigma_1}\right), \qquad \mbox{if } x < \mu, \\
\dfrac{2}{\sigma_1+\sigma_2}f\left(\dfrac{x-\mu}{\sigma_2}\right), \qquad \mbox{if } x \geq \mu. \\


  • $\mu$ is the unique mode of $s(x)$
  • $\sigma_1$ controls the spread of $s(x)$ on the left side
  • $\sigma_2$ controls the spread of $s(x)$ on the right side
  • If $\sigma_1 = \sigma_2 = \sigma$, then $s$ is simply the pdf of a normal distribution with parameters $\mu$ and $\sigma$

Python Implementation

I recently released the twopiece Python library which contains the implementation of the two-piece normal distribution among others. Here, we are going to explore the features of the two-piece normal using this package. You can find details on how to install and use it in my Github Repository: twopiece.

#Import tporm from twopiece.scale
from twopiece.scale import tpnorm
# Create an instance of tpnorm
dist = tpnorm(loc=0.0, sigma1=1.0, sigma2 =1.75)

Probability Density Function

for sigma2 in np.arange(0.5, 4, 1):
    dist = tpnorm(loc=loc, sigma1=sigma1, sigma2=sigma2)
    x = np.arange(-12, 12, 0.1)
    y = dist.pdf(x)
    plt.plot(x, y, label='sigma2 = ' + str(sigma2))

Cumulative Distribution Function

for sigma2 in np.arange(0.5, 4, 1):
    dist = tpnorm(loc=loc, sigma1 =sigma1, sigma2=sigma2)
    x = np.arange(-12, 12, 0.1)
    y = dist.cdf(x)
    plt.plot(x, y, label='sigma2 = ' + str(sigma2))
plt.legend(loc='lower right')
plt.title('Two-Piece Cumulative Distribution Functions')

Percent Point Function

for sigma2 in np.arange(0.5, 4, 1):
    dist = tpnorm(loc=loc, sigma1 =sigma1, sigma2=sigma2)
    x = np.arange(0.01, 0.99, 0.01)
    y = dist.ppf(x)
    plt.plot(x, y, label='sigma2 = ' + str(sigma2) )
plt.legend(loc='lower right')
plt.title('Two-Piece Quantile Function')

Random Sample Generation

dist = tpnorm(loc=0.0, sigma1=1.0, sigma2=2.0)
sample = dist.random_sample(size = 500)


The Two-Piece normal, and more generally the family of two-piece distributions, have been extensively used in applications such as:

  • Bank of England Fan Charts for Inflation Report
  • Measurement Errors Models
  • Forecasting and Estimation of Risk

Future posts will provide details on some of these applications!

Resources and References

Quant Girl

I write about Mathematics, Statistics, Finance, Programming, and the relationships among them. I enjoy learning, listening to music and podcasts, practicing yoga, reading magazines, and watching documentaries.

3 thoughts on “The Two Piece Normal Distribution

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.