This is an automated email from the ASF dual-hosted git repository.
erans pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-math.git
The following commit(s) were added to refs/heads/master by this push:
new 53d9c7f MATH-1401: Branch added to prevent passing invalid input to
"FDistribution".
53d9c7f is described below
commit 53d9c7fbfbe9cbd7e11cb872ef87e00462fa3eca
Author: Gilles Sadowski <[email protected]>
AuthorDate: Tue Apr 16 12:54:04 2019 +0200
MATH-1401: Branch added to prevent passing invalid input to "FDistribution".
Thanks to Michele De Stefano for circumscribing the issue.
---
src/changes/changes.xml | 3 +++
.../math4/stat/interval/ClopperPearsonInterval.java | 14 +++++++++-----
.../math4/stat/interval/ClopperPearsonIntervalTest.java | 6 ++++++
3 files changed, 18 insertions(+), 5 deletions(-)
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 2401282..8b5f8e5 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -54,6 +54,9 @@ If the output is not quite correct, check for invisible
trailing spaces!
</release>
<release version="4.0" date="XXXX-XX-XX" description="">
+ <action dev="erans" type="fix" issue="MATH-1401">
+ "ClopperPearsonInterval": Fixed case where number of trials equals
number of successes.
+ </action>
<action dev="erans" type="add" issue="MATH-1477" due-to="Chee Sing Lee">
"MillerUpdatingRegression": Fixed "ArrayIndexOutOfBounds" exception.
</action>
diff --git
a/src/main/java/org/apache/commons/math4/stat/interval/ClopperPearsonInterval.java
b/src/main/java/org/apache/commons/math4/stat/interval/ClopperPearsonInterval.java
index b6a72ff..5bf642c 100644
---
a/src/main/java/org/apache/commons/math4/stat/interval/ClopperPearsonInterval.java
+++
b/src/main/java/org/apache/commons/math4/stat/interval/ClopperPearsonInterval.java
@@ -46,11 +46,15 @@ public class ClopperPearsonInterval implements
BinomialConfidenceInterval {
lowerBound = numberOfSuccesses /
(numberOfSuccesses + (numberOfTrials - numberOfSuccesses + 1)
* fValueLowerBound);
- final FDistribution distributionUpperBound = new FDistribution(2 *
(numberOfSuccesses + 1),
- 2 *
(numberOfTrials - numberOfSuccesses));
- final double fValueUpperBound =
distributionUpperBound.inverseCumulativeProbability(1 - alpha);
- upperBound = (numberOfSuccesses + 1) * fValueUpperBound /
- (numberOfTrials - numberOfSuccesses + (numberOfSuccesses + 1)
* fValueUpperBound);
+ if (numberOfSuccesses != numberOfTrials) {
+ final FDistribution distributionUpperBound = new
FDistribution(2 * (numberOfSuccesses + 1),
+
2 * (numberOfTrials - numberOfSuccesses));
+ final double fValueUpperBound =
distributionUpperBound.inverseCumulativeProbability(1 - alpha);
+ upperBound = (numberOfSuccesses + 1) * fValueUpperBound /
+ (numberOfTrials - numberOfSuccesses + (numberOfSuccesses +
1) * fValueUpperBound);
+ } else {
+ upperBound = 1;
+ }
}
return new ConfidenceInterval(lowerBound, upperBound, confidenceLevel);
diff --git
a/src/test/java/org/apache/commons/math4/stat/interval/ClopperPearsonIntervalTest.java
b/src/test/java/org/apache/commons/math4/stat/interval/ClopperPearsonIntervalTest.java
index e50ab58..a8a1db1 100644
---
a/src/test/java/org/apache/commons/math4/stat/interval/ClopperPearsonIntervalTest.java
+++
b/src/test/java/org/apache/commons/math4/stat/interval/ClopperPearsonIntervalTest.java
@@ -40,4 +40,10 @@ public class ClopperPearsonIntervalTest extends
BinomialConfidenceIntervalAbstra
Assert.assertEquals(0.1248658, confidenceInterval.getUpperBound(),
1E-5);
}
+ @Test
+ public void testMath1401() {
+ ConfidenceInterval interval = new
ClopperPearsonInterval().createInterval(1, 1, 0.95);
+ Assert.assertEquals(0.025, interval.getLowerBound(), 1e-16);
+ Assert.assertEquals(1, interval.getUpperBound(), 0d);
+ }
}