Browse Source

Statistics: s/InverseCDF/EmpiricalInvCDF/

optimization-3
Christoph Ruegg 13 years ago
parent
commit
9482a7518c
  1. 4
      src/Numerics/Statistics/QuantileDefinition.cs
  2. 16
      src/Numerics/Statistics/Statistics.cs
  3. 20
      src/UnitTests/StatisticsTests/StatisticsTests.cs

4
src/Numerics/Statistics/QuantileDefinition.cs

@ -32,8 +32,8 @@ namespace MathNet.Numerics.Statistics
{ {
public enum QuantileDefinition public enum QuantileDefinition
{ {
R1 = 1, SAS3 = 1, InverseCDF = 1, R1 = 1, SAS3 = 1, EmpiricalInvCDF = 1,
R2 = 2, SAS5 = 2, InverseCDFAverage = 2, R2 = 2, SAS5 = 2, EmpiricalInvCDFAverage = 2,
R3 = 3, SAS2 = 3, Nearest = 3, R3 = 3, SAS2 = 3, Nearest = 3,
R4 = 4, SAS1 = 4, California = 4, R4 = 4, SAS1 = 4, California = 4,
R5 = 5, Hydrology = 5, Hazen = 5, R5 = 5, Hydrology = 5, Hazen = 5,

16
src/Numerics/Statistics/Statistics.cs

@ -725,10 +725,10 @@ namespace MathNet.Numerics.Statistics
/// </summary> /// </summary>
/// <param name="data">The data sample sequence.</param> /// <param name="data">The data sample sequence.</param>
/// <param name="tau">Quantile selector, between 0.0 and 1.0 (inclusive).</param> /// <param name="tau">Quantile selector, between 0.0 and 1.0 (inclusive).</param>
public static double InverseCDF(this IEnumerable<double> data, double tau) public static double EmpiricalInvCDF(this IEnumerable<double> data, double tau)
{ {
var array = data.ToArray(); var array = data.ToArray();
return ArrayStatistics.QuantileCustomInplace(array, tau, QuantileDefinition.InverseCDF); return ArrayStatistics.QuantileCustomInplace(array, tau, QuantileDefinition.EmpiricalInvCDF);
} }
/// <summary> /// <summary>
@ -736,29 +736,29 @@ namespace MathNet.Numerics.Statistics
/// </summary> /// </summary>
/// <param name="data">The data sample sequence.</param> /// <param name="data">The data sample sequence.</param>
/// <param name="tau">Quantile selector, between 0.0 and 1.0 (inclusive).</param> /// <param name="tau">Quantile selector, between 0.0 and 1.0 (inclusive).</param>
public static double InverseCDF(this IEnumerable<double?> data, double tau) public static double EmpiricalInvCDF(this IEnumerable<double?> data, double tau)
{ {
return InverseCDF(data.Where(d => d.HasValue).Select(d => d.Value), tau); return EmpiricalInvCDF(data.Where(d => d.HasValue).Select(d => d.Value), tau);
} }
/// <summary> /// <summary>
/// Estimates the empirical inverse CDF at tau from the provided samples. /// Estimates the empirical inverse CDF at tau from the provided samples.
/// </summary> /// </summary>
/// <param name="data">The data sample sequence.</param> /// <param name="data">The data sample sequence.</param>
public static Func<double, double> InverseCDFFunc(this IEnumerable<double> data) public static Func<double, double> EmpiricalInvCDFFunc(this IEnumerable<double> data)
{ {
var array = data.ToArray(); var array = data.ToArray();
Array.Sort(array); Array.Sort(array);
return tau => SortedArrayStatistics.QuantileCustom(array, tau, QuantileDefinition.InverseCDF); return tau => SortedArrayStatistics.QuantileCustom(array, tau, QuantileDefinition.EmpiricalInvCDF);
} }
/// <summary> /// <summary>
/// Estimates the empirical inverse CDF at tau from the provided samples. /// Estimates the empirical inverse CDF at tau from the provided samples.
/// </summary> /// </summary>
/// <param name="data">The data sample sequence.</param> /// <param name="data">The data sample sequence.</param>
public static Func<double, double> InverseCDFFunc(this IEnumerable<double?> data) public static Func<double, double> EmpiricalInvCDFFunc(this IEnumerable<double?> data)
{ {
return InverseCDFFunc(data.Where(d => d.HasValue).Select(d => d.Value)); return EmpiricalInvCDFFunc(data.Where(d => d.HasValue).Select(d => d.Value));
} }
} }
} }

20
src/UnitTests/StatisticsTests/StatisticsTests.cs

@ -305,23 +305,23 @@ namespace MathNet.Numerics.UnitTests.StatisticsTests
[TestCase(0.99d, 10d)] [TestCase(0.99d, 10d)]
[TestCase(0.52d, 1d)] [TestCase(0.52d, 1d)]
[TestCase(0.325d, 0d)] [TestCase(0.325d, 0d)]
public void QuantileR1InverseCDFOnShortSequence(double tau, double expected) public void QuantileR1EmpiricalInvCDFOnShortSequence(double tau, double expected)
{ {
// R: quantile(c(-1,5,0,-3,10,-0.5,4,0.2,1,6),probs=c(0,1,0.5,0.2,0.7,0.01,0.99,0.52,0.325),type=1) // R: quantile(c(-1,5,0,-3,10,-0.5,4,0.2,1,6),probs=c(0,1,0.5,0.2,0.7,0.01,0.99,0.52,0.325),type=1)
// Mathematica: Quantile[{-1,5,0,-3,10,-1/2,4,1/5,1,6},{0,1,1/2,1/5,7/10,1/100,99/100,13/25,13/40},{{0,0},{1,0}}] // Mathematica: Quantile[{-1,5,0,-3,10,-1/2,4,1/5,1,6},{0,1,1/2,1/5,7/10,1/100,99/100,13/25,13/40},{{0,0},{1,0}}]
var samples = new[] {-1, 5, 0, -3, 10, -0.5, 4, 0.2, 1, 6}; var samples = new[] {-1, 5, 0, -3, 10, -0.5, 4, 0.2, 1, 6};
Assert.AreEqual(expected, Statistics.InverseCDF(samples, tau), 1e-14); Assert.AreEqual(expected, Statistics.EmpiricalInvCDF(samples, tau), 1e-14);
Assert.AreEqual(expected, Statistics.InverseCDFFunc(samples)(tau), 1e-14); Assert.AreEqual(expected, Statistics.EmpiricalInvCDFFunc(samples)(tau), 1e-14);
Assert.AreEqual(expected, Statistics.QuantileCustom(samples, tau, QuantileDefinition.InverseCDF), 1e-14); Assert.AreEqual(expected, Statistics.QuantileCustom(samples, tau, QuantileDefinition.EmpiricalInvCDF), 1e-14);
Assert.AreEqual(expected, Statistics.QuantileCustomFunc(samples, QuantileDefinition.InverseCDF)(tau), 1e-14); Assert.AreEqual(expected, Statistics.QuantileCustomFunc(samples, QuantileDefinition.EmpiricalInvCDF)(tau), 1e-14);
Assert.AreEqual(expected, ArrayStatistics.QuantileCustomInplace(samples, tau, QuantileDefinition.InverseCDF), 1e-14); Assert.AreEqual(expected, ArrayStatistics.QuantileCustomInplace(samples, tau, QuantileDefinition.EmpiricalInvCDF), 1e-14);
Assert.AreEqual(expected, ArrayStatistics.QuantileCustomInplace(samples, tau, 0d, 0d, 1d, 0d), 1e-14); Assert.AreEqual(expected, ArrayStatistics.QuantileCustomInplace(samples, tau, 0d, 0d, 1d, 0d), 1e-14);
Array.Sort(samples); Array.Sort(samples);
Assert.AreEqual(expected, SortedArrayStatistics.QuantileCustom(samples, tau, QuantileDefinition.InverseCDF), 1e-14); Assert.AreEqual(expected, SortedArrayStatistics.QuantileCustom(samples, tau, QuantileDefinition.EmpiricalInvCDF), 1e-14);
Assert.AreEqual(expected, SortedArrayStatistics.QuantileCustom(samples, tau, 0d, 0d, 1d, 0d), 1e-14); Assert.AreEqual(expected, SortedArrayStatistics.QuantileCustom(samples, tau, 0d, 0d, 1d, 0d), 1e-14);
} }
@ -334,7 +334,7 @@ namespace MathNet.Numerics.UnitTests.StatisticsTests
[TestCase(0.99d, 10d)] [TestCase(0.99d, 10d)]
[TestCase(0.52d, 1d)] [TestCase(0.52d, 1d)]
[TestCase(0.325d, 0d)] [TestCase(0.325d, 0d)]
public void QuantileR2InverseCDFAverageOnShortSequence(double tau, double expected) public void QuantileR2EmpiricalInvCDFAverageOnShortSequence(double tau, double expected)
{ {
// R: quantile(c(-1,5,0,-3,10,-0.5,4,0.2,1,6),probs=c(0,1,0.5,0.2,0.7,0.01,0.99,0.52,0.325),type=2) // R: quantile(c(-1,5,0,-3,10,-0.5,4,0.2,1,6),probs=c(0,1,0.5,0.2,0.7,0.01,0.99,0.52,0.325),type=2)
// Mathematica: Not Supported // Mathematica: Not Supported
@ -344,10 +344,10 @@ namespace MathNet.Numerics.UnitTests.StatisticsTests
Assert.AreEqual(expected, Statistics.QuantileCustom(samples, tau, QuantileDefinition.R2), 1e-14); Assert.AreEqual(expected, Statistics.QuantileCustom(samples, tau, QuantileDefinition.R2), 1e-14);
Assert.AreEqual(expected, Statistics.QuantileCustomFunc(samples, QuantileDefinition.R2)(tau), 1e-14); Assert.AreEqual(expected, Statistics.QuantileCustomFunc(samples, QuantileDefinition.R2)(tau), 1e-14);
Assert.AreEqual(expected, ArrayStatistics.QuantileCustomInplace(samples, tau, QuantileDefinition.InverseCDFAverage), 1e-14); Assert.AreEqual(expected, ArrayStatistics.QuantileCustomInplace(samples, tau, QuantileDefinition.EmpiricalInvCDFAverage), 1e-14);
Array.Sort(samples); Array.Sort(samples);
Assert.AreEqual(expected, SortedArrayStatistics.QuantileCustom(samples, tau, QuantileDefinition.InverseCDFAverage), 1e-14); Assert.AreEqual(expected, SortedArrayStatistics.QuantileCustom(samples, tau, QuantileDefinition.EmpiricalInvCDFAverage), 1e-14);
} }
[TestCase(0d, -3d)] [TestCase(0d, -3d)]

Loading…
Cancel
Save