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