Class FoldedNormalDistribution

java.lang.Object
org.apache.commons.statistics.distribution.AbstractContinuousDistribution
org.apache.commons.statistics.distribution.FoldedNormalDistribution
All Implemented Interfaces:
ContinuousDistribution
Direct Known Subclasses:
FoldedNormalDistribution.HalfNormalDistribution, FoldedNormalDistribution.RegularFoldedNormalDistribution

public abstract class FoldedNormalDistribution extends AbstractContinuousDistribution
Implementation of the folded normal distribution.

Given a normally distributed random variable \( X \) with mean \( \mu \) and variance \( \sigma^2 \), the random variable \( Y = |X| \) has a folded normal distribution. This is equivalent to not recording the sign from a normally distributed random variable.

The probability density function of \( X \) is:

\[ f(x; \mu, \sigma) = \frac 1 {\sigma\sqrt{2\pi}} e^{-{\frac 1 2}\left( \frac{x-\mu}{\sigma} \right)^2 } + \frac 1 {\sigma\sqrt{2\pi}} e^{-{\frac 1 2}\left( \frac{x+\mu}{\sigma} \right)^2 }\]

for \( \mu \) the location, \( \sigma > 0 \) the scale, and \( x \in [0, \infty) \).

If the location \( \mu \) is 0 this reduces to the half-normal distribution.

Since:
1.1
See Also:
  • Field Details

    • sigma

      final double sigma
      The scale.
    • sigmaSqrt2

      final double sigmaSqrt2
      The scale multiplied by sqrt(2). This is used to avoid a double division when computing the value passed to the error function:
        ((x - u) / sd) / sqrt(2) == (x - u) / (sd * sqrt(2)).
        

      Note: Implementations may first normalise x and then divide by sqrt(2) resulting in differences due to rounding error that show increasingly large relative differences as the error function computes close to 0 in the extreme tail.

    • sigmaSqrt2pi

      final double sigmaSqrt2pi
      The scale multiplied by sqrt(2 pi). Computed to high precision.
  • Constructor Details

    • FoldedNormalDistribution

      FoldedNormalDistribution(double sigma)
      Parameters:
      sigma - Scale parameter.
  • Method Details

    • of

      public static FoldedNormalDistribution of(double mu, double sigma)
      Creates a folded normal distribution. If the location mu is zero this is the half-normal distribution.
      Parameters:
      mu - Location parameter.
      sigma - Scale parameter.
      Returns:
      the distribution
      Throws:
      IllegalArgumentException - if sigma <= 0.
    • getMu

      public abstract double getMu()
      Gets the location parameter \( \mu \) of this distribution.
      Returns:
      the mu parameter.
    • getSigma

      public double getSigma()
      Gets the scale parameter \( \sigma \) of this distribution.
      Returns:
      the sigma parameter.
    • getMean

      public abstract double getMean()
      Gets the mean of this distribution.

      For location parameter \( \mu \) and scale parameter \( \sigma \), the mean is:

      \[ \sigma \sqrt{ \frac 2 \pi } \exp \left( \frac{-\mu^2}{2\sigma^2} \right) + \mu \operatorname{erf} \left( \frac \mu {\sqrt{2\sigma^2}} \right) \]

      where \( \operatorname{erf} \) is the error function.

      Returns:
      the mean.
    • getVariance

      public abstract double getVariance()
      Gets the variance of this distribution.

      For location parameter \( \mu \), scale parameter \( \sigma \) and a distribution mean \( \mu_Y \), the variance is:

      \[ \mu^2 + \sigma^2 - \mu_{Y}^2 \]

      Returns:
      the variance.
    • getSupportLowerBound

      public double getSupportLowerBound()
      Gets the lower bound of the support. It must return the same value as inverseCumulativeProbability(0), i.e. \( \inf \{ x \in \mathbb R : P(X \le x) \gt 0 \} \).

      The lower bound of the support is always 0.

      Returns:
      0.
    • getSupportUpperBound

      public double getSupportUpperBound()
      Gets the upper bound of the support. It must return the same value as inverseCumulativeProbability(1), i.e. \( \inf \{ x \in \mathbb R : P(X \le x) = 1 \} \).

      The upper bound of the support is always positive infinity.

      Returns:
      positive infinity.