You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ah...@apache.org on 2023/07/20 15:49:38 UTC

[commons-statistics] branch master updated: Fix: Avoid t=-0.0 for t-distribution inverse SF with p=0.5

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


The following commit(s) were added to refs/heads/master by this push:
     new 5b36cbe  Fix: Avoid t=-0.0 for t-distribution inverse SF with p=0.5
5b36cbe is described below

commit 5b36cbecd8385d367d64d7d35b7acee06e773afc
Author: Alex Herbert <ah...@apache.org>
AuthorDate: Thu Jul 20 16:47:40 2023 +0100

    Fix: Avoid t=-0.0 for t-distribution inverse SF with p=0.5
---
 .../commons/statistics/distribution/TDistribution.java   |  3 ++-
 .../statistics/distribution/TDistributionTest.java       | 16 ++++++++++++++++
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/TDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/TDistribution.java
index c37bd8c..54c6b2c 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/TDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/TDistribution.java
@@ -274,7 +274,8 @@ public abstract class TDistribution extends AbstractContinuousDistribution {
     @Override
     public double inverseSurvivalProbability(double p) {
         // Exploit symmetry
-        return -inverseCumulativeProbability(p);
+        // Subtract from 0 avoids returning -0.0 for p=0.5
+        return 0.0 - inverseCumulativeProbability(p);
     }
 
     /**
diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TDistributionTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TDistributionTest.java
index 69b8823..7bcd104 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TDistributionTest.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TDistributionTest.java
@@ -23,6 +23,7 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.CsvSource;
 import org.junit.jupiter.params.provider.MethodSource;
+import org.junit.jupiter.params.provider.ValueSource;
 
 /**
  * Test cases for {@link TDistribution}.
@@ -148,4 +149,19 @@ class TDistributionTest extends BaseContinuousDistributionTest {
         Assertions.assertEquals(cdf, p, 6 * Math.ulp(cdf),
             () -> "cdf error: " + (Double.doubleToLongBits(cdf) - Double.doubleToRawLongBits(p)));
     }
+
+    /**
+     * Test the inverse probability edge case for p=0.5.
+     * The inverse can use symmetry {@code isf(p) = -icdf(p)}. When p=0.5 the inverse
+     * will generate -0.0 for the negation. This test ensures both return the more logical 0.0.
+     */
+    @ParameterizedTest
+    @ValueSource(doubles = {1, 42, 1e25})
+    void testInverseSymmetryEdgeCase(double df) {
+        final TDistribution dist = TDistribution.of(df);
+        final double p = 0.5;
+        final double t = 0.0;
+        Assertions.assertEquals(t, dist.inverseCumulativeProbability(p));
+        Assertions.assertEquals(t, dist.inverseSurvivalProbability(p));
+    }
 }