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:
- Folded normal distribution (Wikipedia), Half-normal distribution (Wikipedia)
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static class
FoldedNormalDistribution.HalfNormalDistribution
Specialisation for the half-normal distribution.private static class
FoldedNormalDistribution.RegularFoldedNormalDistribution
Regular implementation of the folded normal distribution.-
Nested classes/interfaces inherited from interface org.apache.commons.statistics.distribution.ContinuousDistribution
ContinuousDistribution.Sampler
-
-
Field Summary
Fields Modifier and Type Field Description (package private) double
sigma
The scale.(package private) double
sigmaSqrt2
The scale multiplied by sqrt(2).(package private) double
sigmaSqrt2pi
The scale multiplied by sqrt(2 pi).
-
Constructor Summary
Constructors Constructor Description FoldedNormalDistribution(double sigma)
-
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description abstract double
getMean()
Gets the mean of this distribution.abstract double
getMu()
Gets the location parameter \( \mu \) of this distribution.double
getSigma()
Gets the scale parameter \( \sigma \) of this distribution.double
getSupportLowerBound()
Gets the lower bound of the support.double
getSupportUpperBound()
Gets the upper bound of the support.abstract double
getVariance()
Gets the variance of this distribution.static FoldedNormalDistribution
of(double mu, double sigma)
Creates a folded normal distribution.-
Methods inherited from class org.apache.commons.statistics.distribution.AbstractContinuousDistribution
createSampler, getMedian, inverseCumulativeProbability, inverseSurvivalProbability, isSupportConnected, probability
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface org.apache.commons.statistics.distribution.ContinuousDistribution
cumulativeProbability, density, logDensity, survivalProbability
-
-
-
-
Field Detail
-
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.
-
-
Method Detail
-
of
public static FoldedNormalDistribution of(double mu, double sigma)
Creates a folded normal distribution. If the locationmu
is zero this is the half-normal distribution.- Parameters:
mu
- Location parameter.sigma
- Scale parameter.- Returns:
- the distribution
- Throws:
java.lang.IllegalArgumentException
- ifsigma <= 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 asinverseCumulativeProbability(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 asinverseCumulativeProbability(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.
-
-