This is an automated email from the ASF dual-hosted git repository. aherbert pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-statistics.git
commit 7814866107e276446144acc14ba458b487473de2 Author: aherbert <aherb...@apache.org> AuthorDate: Mon Sep 27 12:21:57 2021 +0100 Prevent p=0 in Pascal distribution The Pascal is the sum of n independent random variables having an identical geometric distribution with parameter p. The value p=0 is not allowed in the Geometric distribution. This value causes an error in mathematica and scipy stats. It creates NaN values in R and Matlab. --- .../distribution/PascalDistribution.java | 6 ++-- .../distribution/PascalDistributionTest.java | 32 +--------------------- 2 files changed, 4 insertions(+), 34 deletions(-) diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/PascalDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/PascalDistribution.java index 164cec1..037147e 100644 --- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/PascalDistribution.java +++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/PascalDistribution.java @@ -67,7 +67,7 @@ public class PascalDistribution extends AbstractDiscreteDistribution { * * @param r Number of successes. * @param p Probability of success. - * @throws IllegalArgumentException if {@code r <= 0} or {@code p < 0} + * @throws IllegalArgumentException if {@code r <= 0} or {@code p <= 0} * or {@code p > 1}. */ public PascalDistribution(int r, @@ -75,9 +75,9 @@ public class PascalDistribution extends AbstractDiscreteDistribution { if (r <= 0) { throw new DistributionException(DistributionException.NOT_STRICTLY_POSITIVE, r); } - if (p < 0 || + if (p <= 0 || p > 1) { - throw new DistributionException(DistributionException.INVALID_PROBABILITY, p); + throw new DistributionException(DistributionException.INVALID_NON_ZERO_PROBABILITY, p); } numberOfSuccesses = r; diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/PascalDistributionTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/PascalDistributionTest.java index 22ddd2c..f31f66a 100644 --- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/PascalDistributionTest.java +++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/PascalDistributionTest.java @@ -94,37 +94,6 @@ class PascalDistributionTest extends DiscreteDistributionAbstractTest { //-------------------- Additional test cases ------------------------------- - /** Test degenerate case p = 0. */ - @Test - void testDegenerate0() { - final PascalDistribution dist = new PascalDistribution(5, 0.0d); - Assertions.assertEquals(0.0, dist.getProbabilityOfSuccess()); - Assertions.assertEquals(Double.POSITIVE_INFINITY, dist.getMean()); - Assertions.assertEquals(Double.POSITIVE_INFINITY, dist.getVariance()); - - setDistribution(dist); - setProbabilityTestPoints(new int[] {-1, 0, 1, 2, 5, 10}); - setProbabilityTestValues(new double[] {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}); - setCumulativeTestPoints(new int[] {-1, 0, 1, 2, 5, 10}); - setCumulativeTestValues(new double[] {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}); - setInverseCumulativeTestPoints(new double[] {0.1, 0.5, 1.0}); - setInverseCumulativeTestValues(new int[] {Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE}); - verifyProbabilities(); - verifyLogProbabilities(); - verifyCumulativeProbabilities(); - verifySurvivalProbability(); - verifySurvivalAndCumulativeProbabilityComplement(); - verifyInverseCumulativeProbabilities(); - - Assertions.assertEquals(0, dist.getSupportLowerBound()); - Assertions.assertEquals(Integer.MAX_VALUE, dist.getSupportUpperBound()); - - final DiscreteDistribution.Sampler s = dist.createSampler(RandomSource.SPLIT_MIX_64.create()); - for (int i = 0; i < 5; i++) { - Assertions.assertEquals(Integer.MAX_VALUE, s.sample()); - } - } - /** Test degenerate case p = 1. */ @Test void testDegenerate1() { @@ -172,6 +141,7 @@ class PascalDistributionTest extends DiscreteDistributionAbstractTest { "0, 0.5", "-1, 0.5", "3, -0.1", + "3, 0.0", "3, 1.1", }) void testConstructorPreconditions(int r, double p) {