Skip to content

Commit e57a270

Browse files
2 parents 50f7fe2 + dde9395 commit e57a270

24 files changed

Lines changed: 898 additions & 142 deletions

File tree

4.8.1/Numerics/Distributions/Univariate/Base/UnivariateDistributionFactory.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -172,10 +172,10 @@ public static UnivariateDistributionBase CreateDistribution(UnivariateDistributi
172172
{
173173
distribution = new PertPercentileZ();
174174
}
175-
//else if (distributionType == UnivariateDistributionType.Poisson)
176-
//{
177-
// distribution = new Poisson();
178-
//}
175+
else if (distributionType == UnivariateDistributionType.Poisson)
176+
{
177+
distribution = new Poisson();
178+
}
179179
else if (distributionType == UnivariateDistributionType.Rayleigh)
180180
{
181181
distribution = new Rayleigh();
@@ -228,6 +228,16 @@ public static UnivariateDistributionBase CreateDistribution(XElement xElement)
228228
dist = Mixture.FromXElement(xElement);
229229
return dist;
230230
}
231+
else if (type == UnivariateDistributionType.PertPercentile)
232+
{
233+
dist = PertPercentile.FromXElement(xElement);
234+
return dist;
235+
}
236+
else if (type == UnivariateDistributionType.PertPercentileZ)
237+
{
238+
dist = PertPercentileZ.FromXElement(xElement);
239+
return dist;
240+
}
231241
else
232242
{
233243
dist = CreateDistribution(type);

4.8.1/Numerics/Distributions/Univariate/CompetingRisks.cs

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,10 @@ public CompetingRisks(IUnivariateDistribution[] distributions)
7878
}
7979

8080
private UnivariateDistributionBase[] _distributions;
81-
private EmpiricalDistribution _inverseCDF;
81+
private EmpiricalDistribution _empiricalCDF;
8282
private bool _momentsComputed = false;
8383
private double u1, u2, u3, u4;
84-
private bool _inverseCDFCreated = false;
84+
private bool _empiricalCDFCreated = false;
8585
private double[,] _correlationMatrix;
8686
private bool _mvnCreated = false;
8787
private MultivariateNormal _mvn;
@@ -364,7 +364,7 @@ public void SetParameters(UnivariateDistributionBase[] distributions)
364364
if (distributions == null) throw new ArgumentNullException(nameof(Distributions));
365365
_distributions = distributions;
366366
_momentsComputed = false;
367-
_inverseCDFCreated = false;
367+
_empiricalCDFCreated = false;
368368
_mvnCreated = false;
369369
}
370370

@@ -381,7 +381,7 @@ public void SetParameters(IUnivariateDistribution[] distributions)
381381
_distributions[i] = (UnivariateDistributionBase)distributions[i];
382382
}
383383
_momentsComputed = false;
384-
_inverseCDFCreated = false;
384+
_empiricalCDFCreated = false;
385385
_mvnCreated = false;
386386
}
387387

@@ -403,7 +403,7 @@ public override void SetParameters(IList<double> parameters)
403403
}
404404

405405
_momentsComputed = false;
406-
_inverseCDFCreated = false;
406+
_empiricalCDFCreated = false;
407407
_mvnCreated = false;
408408
}
409409

@@ -566,22 +566,29 @@ public override double InverseCDF(double probability)
566566
return Distributions[0].InverseCDF(probability);
567567
}
568568

569-
// Otherwise use a root finder to solve the inverse CDF
570-
var xVals = Distributions.Select(d => d.InverseCDF(probability));
571-
double minX = xVals.Min();
572-
double maxX = xVals.Max();
573569
double x = 0;
574-
try
570+
if (_empiricalCDFCreated == true)
575571
{
576-
Brent.Bracket((y) => { return probability - CDF(y); }, ref minX, ref maxX, out var f1, out var f2);
577-
x = Brent.Solve((y) => { return probability - CDF(y); }, minX, maxX, 1E-6, 100, true);
572+
x = _empiricalCDF.InverseCDF(probability);
578573
}
579-
catch (Exception)
574+
else
580575
{
581-
// If the root finder fails, create an empirical inverse CDF
582-
if (_inverseCDFCreated == false)
583-
CreateInverseCDF();
584-
x = _inverseCDF.InverseCDF(probability);
576+
// use a root finder to solve the inverse CDF
577+
var xVals = Distributions.Select(d => d.InverseCDF(probability));
578+
double minX = xVals.Min();
579+
double maxX = xVals.Max();
580+
try
581+
{
582+
Brent.Bracket((y) => { return probability - CDF(y); }, ref minX, ref maxX, out var f1, out var f2);
583+
x = Brent.Solve((y) => { return probability - CDF(y); }, minX, maxX, 1E-6, 100, true);
584+
}
585+
catch (Exception)
586+
{
587+
// If the root finder fails, create an empirical CDF
588+
if (_empiricalCDFCreated == false)
589+
CreateEmpiricalCDF();
590+
x = _empiricalCDF.InverseCDF(probability);
591+
}
585592
}
586593
double min = Minimum;
587594
double max = Maximum;
@@ -815,11 +822,10 @@ private void CreateMultivariateNormal()
815822
_mvnCreated = true;
816823
}
817824

818-
819825
/// <summary>
820-
/// Create empirical distribution for the inverse CDF.
826+
/// Create empirical distribution for the CDF.
821827
/// </summary>
822-
private void CreateInverseCDF()
828+
public void CreateEmpiricalCDF()
823829
{
824830
// Get min & max
825831
double minP = 1E-16;
@@ -858,8 +864,8 @@ private void CreateInverseCDF()
858864
xValues.Add(x);
859865
pValues.Add(p);
860866
}
861-
_inverseCDF = new EmpiricalDistribution(xValues, pValues) { XTransform = XTransform, ProbabilityTransform = ProbabilityTransform };
862-
_inverseCDFCreated = true;
867+
_empiricalCDF = new EmpiricalDistribution(xValues, pValues) { XTransform = XTransform, ProbabilityTransform = ProbabilityTransform };
868+
_empiricalCDFCreated = true;
863869
}
864870

865871
/// <inheritdoc/>

4.8.1/Numerics/Distributions/Univariate/Deterministic.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ public override string ShortDisplayName
112112
get
113113
{
114114
var parmString = new string[1, 2];
115-
parmString[0, 0] = "Y";
115+
parmString[0, 0] = "Value";
116116
parmString[0, 1] = Value.ToString();
117117
return parmString;
118118
}

4.8.1/Numerics/Distributions/Univariate/KernelDensity.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,11 @@ public int SampleSize
211211
/// </summary>
212212
public Transform ProbabilityTransform { get; set; } = Transform.NormalZ;
213213

214+
/// <summary>
215+
/// Determines whether to use the data to set the minimum or maximum limits. If false, the limits are the data min and max +- 3 * Bandwidth, respectively.
216+
/// </summary>
217+
public bool BoundedByData { get; set; } = true;
218+
214219
/// <inheritdoc/>
215220
public override int NumberOfParameters
216221
{
@@ -341,7 +346,7 @@ public override double Minimum
341346
{
342347
if (_sampleData is null) return double.NaN;
343348
if (_sampleData.Count() == 0) return double.NaN;
344-
return Tools.Min(SampleData) - 3 * Bandwidth;
349+
return BoundedByData ? Tools.Min(SampleData) : Tools.Min(SampleData) - 3 * Bandwidth;
345350
}
346351
}
347352

@@ -352,7 +357,7 @@ public override double Maximum
352357
{
353358
if (_sampleData is null) return double.NaN;
354359
if (_sampleData.Count() == 0) return double.NaN;
355-
return Tools.Max(SampleData) + 3 * Bandwidth;
360+
return BoundedByData ? Tools.Max(SampleData) : Tools.Max(SampleData) + 3 * Bandwidth;
356361
}
357362
}
358363

@@ -510,6 +515,7 @@ public override double CDF(double x)
510515
{
511516
if (x < Minimum) return 0.0;
512517
if (x > Maximum) return 1.0;
518+
if (Minimum == Maximum) return double.NaN;
513519
if (!_cdfCreated) CreateCDF();
514520
return opd.GetYFromX(x, XTransform, ProbabilityTransform);
515521
}
@@ -522,21 +528,23 @@ public override double InverseCDF(double probability)
522528
throw new ArgumentOutOfRangeException("probability", "Probability must be between 0 and 1.");
523529
if (probability == 0.0) return Minimum;
524530
if (probability == 1.0) return Maximum;
531+
if (Minimum == Maximum) return double.NaN;
525532
if (!_cdfCreated) CreateCDF();
526533
return opd.GetXFromY(probability, XTransform, ProbabilityTransform);
527534
}
528535

529536
/// <inheritdoc/>
530537
public override UnivariateDistributionBase Clone()
531538
{
532-
return new KernelDensity(SampleData, KernelDistribution, Bandwidth);
539+
return new KernelDensity(SampleData, KernelDistribution, Bandwidth) { XTransform = XTransform, ProbabilityTransform = ProbabilityTransform, BoundedByData = BoundedByData };
533540
}
534541

535542
/// <summary>
536543
/// Create the empirical CDF.
537544
/// </summary>
538545
private void CreateCDF()
539546
{
547+
540548
// Create wide bins
541549
int n = 1000;
542550
var bins = Stratify.XValues(new StratificationOptions(Minimum, Maximum, n));

0 commit comments

Comments
 (0)