Accord.Statistics.Distributions.Univariate.FoldedNormalDistribution.ProbabilityDensityFunction C# (CSharp) Method

ProbabilityDensityFunction() public method

Gets the probability density function (pdf) for this distribution evaluated at point x.
The Probability Density Function (PDF) describes the probability that a given value x will occur.
public ProbabilityDensityFunction ( double x ) : double
x double A single point in the distribution range.
return double
        public override double ProbabilityDensityFunction(double x)
        {
            if (x < 0)
                return 0;

            double a = (+x - mu) / sigma;
            double b = (-x - mu) / sigma;

            return (Normal.Derivative(a) + Normal.Derivative(b)) / sigma;
        }

Usage Example

        public void ConstructorTest()
        {
            var fn = new FoldedNormalDistribution(mean: 4, stdDev: 4.2);

            double mean = fn.Mean;     // 4.765653108337438
            double median = fn.Median; // 4.259356588022813
            double mode = fn.Mode;     // 2.0806531871308014
            double var = fn.Variance;  // 10.928550450993715

            double cdf = fn.DistributionFunction(x: 1.4);           // 0.16867109769018807
            double pdf = fn.ProbabilityDensityFunction(x: 1.4);     // 0.11998602818182187
            double lpdf = fn.LogProbabilityDensityFunction(x: 1.4); // -2.1203799747969523

            double ccdf = fn.ComplementaryDistributionFunction(x: 1.4); // 0.83132890230981193
            double icdf = fn.InverseDistributionFunction(p: cdf);       // 1.4

            double hf = fn.HazardFunction(x: 1.4);            // 0.14433039420191671
            double chf = fn.CumulativeHazardFunction(x: 1.4); // 0.18472977144474392

            string str = fn.ToString(CultureInfo.InvariantCulture); // FN(x; μ = 4, σ² = 17.64)


            // Tested against GNU R's VGAM package
            //
            // dfnorm(1.4, mean= 4, sd= 4.2)
            // [1] 0.11998602818182191321
            //
            // pfnorm(1.4, mean= 4, sd= 4.2)
            // [1] 0.16867109769018800991
            //

            Assert.AreEqual(4.765653108337438, mean);
            Assert.AreEqual(4.2593565884089237, median);
            Assert.AreEqual(2.0806531871308014, mode);
            Assert.AreEqual(10.928550450993715, var);
            Assert.AreEqual(0.18472977144474392, chf);
            Assert.AreEqual(0.16867109769018800991, cdf, 1e-10); // from R
            Assert.AreEqual(0.11998602818182191321, pdf, 1e-10); // from R
            Assert.AreEqual(-2.1203799747969523, lpdf);
            Assert.AreEqual(0.14433039420191671, hf);
            Assert.AreEqual(0.83132890230981193, ccdf);
            Assert.AreEqual(1.4, icdf, 1e-8);
            Assert.AreEqual("FN(x; μ = 4, σ² = 17.64)", str);

            var range1 = fn.GetRange(0.95);
            Assert.AreEqual(0.41428977779338388, range1.Min);
            Assert.AreEqual(10.916197224646602, range1.Max);

            var range2 = fn.GetRange(0.99);
            Assert.AreEqual(0.082845881461525633, range2.Min);
            Assert.AreEqual(13.77249095493084, range2.Max);

            var range3 = fn.GetRange(0.01);
            Assert.AreEqual(0.082845881461525495, range3.Min);
            Assert.AreEqual(13.77249095493084, range3.Max);

        }