コード例 #1
0
        public void ConstructorTest2()
        {
            var normal = SkewNormalDistribution.Normal(mean: 4, stdDev: 4.2);

            double mean   = normal.Mean;                                    // 4.0
            double median = normal.Median;                                  // 4.0
            double var    = normal.Variance;                                // 17.64
            double mode   = normal.Mode;                                    // 4.0

            double cdf  = normal.DistributionFunction(x: 1.4);              // 0.26794249453351904
            double pdf  = normal.ProbabilityDensityFunction(x: 1.4);        // 0.078423391448155175
            double lpdf = normal.LogProbabilityDensityFunction(x: 1.4);     // -2.5456330358182586

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

            double hf  = normal.HazardFunction(x: 1.4);                     // 0.10712736480747137
            double chf = normal.CumulativeHazardFunction(x: 1.4);           // 0.31189620872601354

            string str = normal.ToString(CultureInfo.InvariantCulture);     // Sn(x; ξ = 4, ω = 4.2, α = 0)

            Assert.AreEqual(4.0, mean);
            Assert.AreEqual(4.0, median, 1e-5);
            Assert.AreEqual(17.64, var);
            Assert.AreEqual(4, mode, 1e-6);
            Assert.AreEqual(0.31189620872601354, chf);
            Assert.AreEqual(0.26794249453351904, cdf);
            Assert.AreEqual(0.078423391448155175, pdf, 1e-8);
            Assert.AreEqual(-2.5456330358182586, lpdf, 1e-8);
            Assert.AreEqual(0.10712736480747137, hf, 1e-8);
            Assert.AreEqual(0.732057505466481, ccdf, 1e-8);
            Assert.AreEqual(1.4, icdf, 1e-8);
            Assert.AreEqual("Sn(x; ξ = 4, ω = 4.2, α = 0)", str);
        }
コード例 #2
0
        public void ConstructorTest1()
        {
            // Create a Skew normal distribution with location 2, scale 3 and shape 4.2
            var skewNormal = new SkewNormalDistribution(location: 2, scale: 3, shape: 4.2);

            double mean   = skewNormal.Mean;                                    // 4.3285611780515953
            double median = skewNormal.Median;                                  // 4.0230040653062265
            double var    = skewNormal.Variance;                                // 3.5778028400709641
            double mode   = skewNormal.Mode;                                    // 3.220622226764422

            double cdf  = skewNormal.DistributionFunction(x: 1.4);              // 0.020166854942526125
            double pdf  = skewNormal.ProbabilityDensityFunction(x: 1.4);        // 0.052257431834162059
            double lpdf = skewNormal.LogProbabilityDensityFunction(x: 1.4);     // -2.9515731621912877

            double ccdf = skewNormal.ComplementaryDistributionFunction(x: 1.4); // 0.97983314505747388
            double icdf = skewNormal.InverseDistributionFunction(p: cdf);       // 1.3999998597203041

            double hf  = skewNormal.HazardFunction(x: 1.4);                     // 0.053332990517581239
            double chf = skewNormal.CumulativeHazardFunction(x: 1.4);           // 0.020372981958858238

            string str = skewNormal.ToString(CultureInfo.InvariantCulture);     // Sn(x; ξ = 2, ω = 3, α = 4.2)

            Assert.AreEqual(4.3285611780515953, mean);
            Assert.AreEqual(4.0230040653062265, median);
            Assert.AreEqual(3.2206222267273086, mode);
            Assert.AreEqual(3.5778028400709641, var);
            Assert.AreEqual(0.020372981958858238, chf);
            Assert.AreEqual(0.020166854942526125, cdf);
            Assert.AreEqual(0.052257431834161927, pdf);
            Assert.AreEqual(-2.9515731621912908, lpdf);
            Assert.AreEqual(0.053332990517581107, hf);
            Assert.AreEqual(0.97983314505747388, ccdf);
            Assert.AreEqual(1.3999998597203041, icdf);
            Assert.AreEqual("Sn(x; ξ = 2, ω = 3, α = 4.2)", str);
        }
コード例 #3
0
ファイル: InputGraph.cs プロジェクト: cleantechsim/evmarket
        private static SkewNormalDistribution MakeSkewNormalDistribution(decimal location, decimal median, decimal dispersion, decimal skew)
        {
            SkewNormalDistribution distribution = new SkewNormalDistribution(
                (double)location,
                (double)(median * dispersion),
                (double)skew);

            return(distribution);
        }
コード例 #4
0
ファイル: InputGraph.cs プロジェクト: cleantechsim/evmarket
        public decimal ComputeProbabilityAboveX(InputGraphSelection selection, decimal x)
        {
            decimal location = FindDistributionLocation(selection.Median, selection.Dispersion, selection.Skew);

            SkewNormalDistribution distribution = MakeSkewNormalDistribution(
                location,
                selection.Median,
                selection.Dispersion,
                selection.Skew);

            decimal max = location * 100m;

            return((decimal)(distribution.DistributionFunction((double)max) - distribution.DistributionFunction((double)x)));
        }
コード例 #5
0
ファイル: InputGraph.cs プロジェクト: cleantechsim/evmarket
        private static decimal FindDistributionLocation(decimal median, decimal dispersion, decimal skew)
        {
            decimal location;

            decimal acceptableRange = median / 50;

            if (skew == 0)
            {
                location = median;
            }
            else
            {
                Compare compare = value =>
                {
                    SkewNormalDistribution distribution = MakeSkewNormalDistribution(
                        value,
                        median,
                        dispersion,
                        skew);

                    decimal distMedian = (decimal)distribution.Median;

                    int cmp;
                    if (Math.Abs(distMedian - median) < acceptableRange)
                    {
                        cmp = 0;
                    }
                    else if (distMedian > median)
                    {
                        cmp = -1;
                    }
                    else
                    {
                        cmp = 1;
                    }

                    return(cmp);
                };

                location = BinarySearch.Search(0, median * 5, compare);
            }

            return(location);
        }
コード例 #6
0
ファイル: InputGraph.cs プロジェクト: cleantechsim/evmarket
        public PreparedDataPoints GenerateDataPoints(decimal median, decimal dispersion, decimal skew, decimal?maxXValue)
        {
            decimal maxGraph = median * maxGraphXAxisTimesMedian;

            if (maxXValue.HasValue && maxXValue.Value < maxGraph)
            {
                maxGraph = maxXValue.Value;
            }

            decimal location = FindDistributionLocation(median, dispersion, skew);

            SkewNormalDistribution distribution = MakeSkewNormalDistribution(
                location,
                median,
                dispersion,
                skew);

            int numIntervals;

            int step = FindGraphPercentageIntervals(median, maxGraph, out numIntervals);

            string[]        labels   = new string[numIntervals];
            List <decimal?> decimals = new List <decimal?>(numIntervals);

            int startInterval = 0;

            // Make sure not to include distribution data at negative x offset.
            // This is due to normal distribution not appropriate in all cases
            decimal xValue    = startInterval * step;
            decimal lastValue = (decimal)distribution.DistributionFunction((double)xValue);

            for (int i = startInterval; i < numIntervals; ++i)
            {
                decimal computeXValue = xValue + step / 2m;
                labels[i] = "" + xValue;

                decimal distValue = (decimal)distribution.DistributionFunction((double)computeXValue);

                xValue += step;

                decimal fractionOfX = 1 / (decimal)numIntervals;

                // ?? sometimes occurs, but not significant
                decimal diff;
                if (distValue <= lastValue)
                {
                    diff = 0;
                }
                else
                {
                    diff      = distValue - lastValue;
                    lastValue = distValue;
                }

                decimals.Add(diff / fractionOfX);
            }

            DataSet dataSet = new DataSet(null, Color.Green, decimals);

            return(new PreparedDataPoints(labels, new DataSet[] { dataSet }));
        }