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); }
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); }
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); }
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))); }
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); }
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 })); }