You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ps...@apache.org on 2013/10/19 22:37:13 UTC
svn commit: r1533824 - in /commons/proper/math/trunk/src: changes/
main/java/org/apache/commons/math3/exception/util/
main/java/org/apache/commons/math3/stat/inference/
main/resources/assets/org/apache/commons/math3/exception/util/
test/java/org/apache...
Author: psteitz
Date: Sat Oct 19 20:37:13 2013
New Revision: 1533824
URL: http://svn.apache.org/r1533824
Log:
Added ConfidenceInterval class and BinomialConfidenceInterval providing implementations of several estimates of confidence intervals for binomial probabilities.
JIRA: MATH-1038
Patch provided by Thorsten Schaefer
Added:
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/stat/inference/BinomialConfidenceInterval.java
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/stat/inference/ConfidenceInterval.java
commons/proper/math/trunk/src/test/java/org/apache/commons/math3/stat/inference/BinomialConfidenceIntervalTest.java
Modified:
commons/proper/math/trunk/src/changes/changes.xml
commons/proper/math/trunk/src/main/java/org/apache/commons/math3/exception/util/LocalizedFormats.java
commons/proper/math/trunk/src/main/resources/assets/org/apache/commons/math3/exception/util/LocalizedFormats_fr.properties
Modified: commons/proper/math/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/changes/changes.xml?rev=1533824&r1=1533823&r2=1533824&view=diff
==============================================================================
--- commons/proper/math/trunk/src/changes/changes.xml (original)
+++ commons/proper/math/trunk/src/changes/changes.xml Sat Oct 19 20:37:13 2013
@@ -51,6 +51,10 @@ If the output is not quite correct, chec
</properties>
<body>
<release version="x.y" date="TBD" description="TBD">
+ <actiod dev="psteitz" type="add" issue="MATH-1038" due-to="Thorsten Schaefer">
+ Added ConfidenceInterval class and BinomialConfidenceInterval providing several
+ estimators for confidence intervals for binomial probabilities.
+ </action>
<action dev="tn" type="fix" issue="MATH-1035" due-to="derphead">
Simplified and improved performance of "ArithmeticUtils#addAndCheck(long, long)".
</action>
Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/exception/util/LocalizedFormats.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/exception/util/LocalizedFormats.java?rev=1533824&r1=1533823&r2=1533824&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/exception/util/LocalizedFormats.java (original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/exception/util/LocalizedFormats.java Sat Oct 19 20:37:13 2013
@@ -275,6 +275,7 @@ public enum LocalizedFormats implements
OBSERVED_COUNTS_BOTTH_ZERO_FOR_ENTRY("observed counts are both zero for entry {0}"),
BOBYQA_BOUND_DIFFERENCE_CONDITION("the difference between the upper and lower bound must be larger than twice the initial trust region radius ({0})"),
OUT_OF_BOUNDS_QUANTILE_VALUE("out of bounds quantile value: {0}, must be in (0, 100]"),
+ OUT_OF_BOUNDS_CONFIDENCE_LEVEL("out of bounds confidence level {0}, must be between {1} and {2}"),
OUT_OF_BOUND_SIGNIFICANCE_LEVEL("out of bounds significance level {0}, must be between {1} and {2}"),
SIGNIFICANCE_LEVEL("significance level ({0})"), /* keep */
OUT_OF_ORDER_ABSCISSA_ARRAY("the abscissae array must be sorted in a strictly increasing order, but the {0}-th element is {1} whereas {2}-th is {3}"),
Added: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/stat/inference/BinomialConfidenceInterval.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/stat/inference/BinomialConfidenceInterval.java?rev=1533824&view=auto
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/stat/inference/BinomialConfidenceInterval.java (added)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/stat/inference/BinomialConfidenceInterval.java Sat Oct 19 20:37:13 2013
@@ -0,0 +1,202 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.math3.stat.inference;
+
+import org.apache.commons.math3.distribution.FDistribution;
+import org.apache.commons.math3.distribution.NormalDistribution;
+import org.apache.commons.math3.exception.MathIllegalArgumentException;
+import org.apache.commons.math3.exception.NotPositiveException;
+import org.apache.commons.math3.exception.NotStrictlyPositiveException;
+import org.apache.commons.math3.exception.util.LocalizedFormats;
+import org.apache.commons.math3.util.FastMath;
+
+/**
+ * Factory methods to generate confidence intervals for a binomial proportion.
+ * The supported methods are:
+ * <ul>
+ * <li>Clopper-Pearson method (exact method)</li>
+ * <li>Normal approximation (based on central limit theorem)</li>
+ * <li>Agresti-Coull interval</li>
+ * <li>Wilson score interval</li>
+ * </ul>
+ *
+ * @see <a
+ * href="http://en.wikipedia.org/wiki/Binomial_proportion_confidence_interval">Binomial
+ * proportion confidence interval (Wikipedia)</a>
+ * @version $Id$
+ * @since 3.3
+ */
+public class BinomialConfidenceInterval {
+
+ /**
+ * Create a Clopper-Pearson binomial confidence interval for the true
+ * probability of success of an unknown binomial distribution with the given
+ * observed number of trials, successes and confidence level.
+ * <p>
+ * Preconditions:
+ * <ul>
+ * <li>{@code numberOfTrials} must be positive</li>
+ * <li>{@code numberOfSuccesses} may not exceed {@code numberOfTrials}</li>
+ * <li>{@code confidenceLevel} must be strictly between 0 and 1 (exclusive)</li>
+ * </ul>
+ * </p>
+ *
+ * @param numberOfTrials number of trials
+ * @param numberOfSuccesses number of successes
+ * @param confidenceLevel desired probability that the true probability of
+ * success falls within the returned interval
+ * @return Confidence interval containing the probability of success with
+ * probability {@code confidenceLevel}
+ * @throws MathIllegalArgumentException if the preconditions are not met
+ */
+ public ConfidenceInterval getClopperPearsonInterval(int numberOfTrials, int numberOfSuccesses,
+ double confidenceLevel) {
+ checkParameters(numberOfTrials, numberOfSuccesses, confidenceLevel);
+ double lowerBound = 0;
+ double upperBound = 0;
+ final double alpha = (1.0 - confidenceLevel) / 2.0;
+
+ final FDistribution distributionLowerBound = new FDistribution(2 * (numberOfTrials - numberOfSuccesses + 1),
+ 2 * numberOfSuccesses);
+ final double fValueLowerBound = distributionLowerBound.inverseCumulativeProbability(1 - alpha);
+ if (numberOfSuccesses > 0) {
+ 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);
+ if (numberOfSuccesses > 0) {
+ upperBound = (numberOfSuccesses + 1) * fValueUpperBound /
+ (numberOfTrials - numberOfSuccesses + (numberOfSuccesses + 1) * fValueUpperBound);
+ }
+
+ return new ConfidenceInterval(lowerBound, upperBound, confidenceLevel);
+ }
+
+ /**
+ * Create a binomial confidence interval for the true probability of success
+ * of an unknown binomial distribution with the given observed number of
+ * trials, successes and confidence level using the Normal approximation to
+ * the binomial distribution.
+ *
+ * @param numberOfTrials number of trials
+ * @param numberOfSuccesses number of successes
+ * @param confidenceLevel desired probability that the true probability of
+ * success falls within the interval
+ * @return Confidence interval containing the probability of success with
+ * probability {@code confidenceLevel}
+ * @throws MathIllegalArgumentException if the preconditions are not met
+ */
+ public ConfidenceInterval getNormalApproximationInterval(int numberOfTrials, int numberOfSuccesses,
+ double confidenceLevel) {
+ checkParameters(numberOfTrials, numberOfSuccesses, confidenceLevel);
+ final double mean = (double) numberOfSuccesses / (double) numberOfTrials;
+ final double alpha = (1.0 - confidenceLevel) / 2;
+ final NormalDistribution normalDistribution = new NormalDistribution();
+ final double difference = normalDistribution.inverseCumulativeProbability(1 - alpha) *
+ FastMath.sqrt(1.0 / numberOfTrials * mean * (1 - mean));
+ return new ConfidenceInterval(mean - difference, mean + difference, confidenceLevel);
+ }
+
+ /**
+ * Create an Agresti-Coull binomial confidence interval for the true
+ * probability of success of an unknown binomial distribution with the given
+ * observed number of trials, successes and confidence level.
+ *
+ * @param numberOfTrials number of trials
+ * @param numberOfSuccesses number of successes
+ * @param confidenceLevel desired probability that the true probability of
+ * success falls within the returned interval
+ * @return Confidence interval containing the probability of success with
+ * probability {@code confidenceLevel}
+ * @throws MathIllegalArgumentException if the preconditions are not met
+ */
+ public ConfidenceInterval getAgrestiCoullInterval(int numberOfTrials, int numberOfSuccesses, double confidenceLevel) {
+ checkParameters(numberOfTrials, numberOfSuccesses, confidenceLevel);
+ final double alpha = (1.0 - confidenceLevel) / 2;
+ final NormalDistribution normalDistribution = new NormalDistribution();
+ final double z = normalDistribution.inverseCumulativeProbability(1 - alpha);
+ final double zSquared = FastMath.pow(z, 2);
+ final double modifiedNumberOfTrials = numberOfTrials + zSquared;
+ final double modifiedSuccessesRatio = (1.0 / modifiedNumberOfTrials) * (numberOfSuccesses + 0.5 * zSquared);
+ final double difference = z *
+ FastMath.sqrt(1.0 / modifiedNumberOfTrials * modifiedSuccessesRatio *
+ (1 - modifiedSuccessesRatio));
+ return new ConfidenceInterval(modifiedSuccessesRatio - difference, modifiedSuccessesRatio + difference,
+ confidenceLevel);
+ }
+
+ /**
+ * Create a Wilson score binomial confidence interval for the true
+ * probability of success of an unknown binomial distribution with the given
+ * observed number of trials, successes and confidence level.
+ *
+ * @param numberOfTrials number of trials
+ * @param numberOfSuccesses number of successes
+ * @param confidenceLevel desired probability that the true probability of
+ * success falls within the returned interval
+ * @return Confidence interval containing the probability of success with
+ * probability {@code confidenceLevel}
+ * @throws MathIllegalArgumentException if the preconditions are not met
+ */
+ public ConfidenceInterval getWilsonScoreInterval(int numberOfTrials, int numberOfSuccesses, double confidenceLevel) {
+ checkParameters(numberOfTrials, numberOfSuccesses, confidenceLevel);
+ final double alpha = (1.0 - confidenceLevel) / 2;
+ final NormalDistribution normalDistribution = new NormalDistribution();
+ final double z = normalDistribution.inverseCumulativeProbability(1 - alpha);
+ final double zSquared = FastMath.pow(z, 2);
+ final double mean = (double) numberOfSuccesses / (double) numberOfTrials;
+
+ final double factor = 1.0 / (1 + (1.0 / numberOfTrials) * zSquared);
+ final double modifiedSuccessRatio = mean + (1.0 / (2 * numberOfTrials)) * zSquared;
+ final double difference = z *
+ FastMath.sqrt(1.0 / numberOfTrials * mean * (1 - mean) +
+ (1.0 / (4 * FastMath.pow(numberOfTrials, 2)) * zSquared));
+
+ final double lowerBound = factor * (modifiedSuccessRatio - difference);
+ final double upperBound = factor * (modifiedSuccessRatio + difference);
+ return new ConfidenceInterval(lowerBound, upperBound, confidenceLevel);
+ }
+
+ /**
+ * Verifies that parameters satisfy preconditions.
+ *
+ * @param numberOfTrials number of trials (must be positive)
+ * @param numberOfSuccesses number of successes (must not exceed
+ * numberOfTrials)
+ * @param confidenceLevel confidence level (must be strictly between 0 and
+ * 1)
+ */
+ private void checkParameters(int numberOfTrials, int numberOfSuccesses, double confidenceLevel) {
+ if (numberOfTrials <= 0) {
+ throw new NotStrictlyPositiveException(LocalizedFormats.NUMBER_OF_TRIALS, numberOfTrials);
+ }
+ if (numberOfSuccesses < 0) {
+ throw new NotPositiveException(LocalizedFormats.NEGATIVE_NUMBER_OF_SUCCESSES, numberOfSuccesses);
+ }
+ if (numberOfSuccesses > numberOfTrials) {
+ throw new MathIllegalArgumentException(LocalizedFormats.NUMBER_OF_SUCCESS_LARGER_THAN_POPULATION_SIZE,
+ numberOfSuccesses, numberOfTrials);
+ }
+ if (confidenceLevel <= 0 || confidenceLevel >= 1) {
+ throw new MathIllegalArgumentException(LocalizedFormats.OUT_OF_BOUNDS_CONFIDENCE_LEVEL, confidenceLevel, 0,
+ 1);
+ }
+ }
+}
Added: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/stat/inference/ConfidenceInterval.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/stat/inference/ConfidenceInterval.java?rev=1533824&view=auto
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/stat/inference/ConfidenceInterval.java (added)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/stat/inference/ConfidenceInterval.java Sat Oct 19 20:37:13 2013
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.math3.stat.inference;
+
+import org.apache.commons.math3.exception.MathIllegalArgumentException;
+import org.apache.commons.math3.exception.util.LocalizedFormats;
+
+/**
+ * Represents an interval estimate of a population parameter.
+ *
+ * @version $Id$
+ * @since 3.3
+ */
+public class ConfidenceInterval {
+
+ /** Lower endpoint of the interval */
+ private double lowerBound;
+
+ /** Upper endpoint of the interval */
+ private double upperBound;
+
+ /**
+ * The asserted probability that the interval contains the population
+ * parameter
+ */
+ private double confidenceLevel;
+
+ /**
+ * Create a confidence interval with the given bounds and confidence level.
+ * <p>
+ * Preconditions:
+ * <ul>
+ * <li>{@code lower} must be strictly less than {@code upper}</li>
+ * <li>{@code confidenceLevel} must be strictly between 0 and 1 (exclusive)</li>
+ * </ul>
+ * </p>
+ *
+ * @param lowerBound lower endpoint of the interval
+ * @param upperBound upper endpoint of the interval
+ * @param confidenceLevel coverage probability
+ * @throws MathIllegalArgumentException if the preconditions are not met
+ */
+ public ConfidenceInterval(double lowerBound, double upperBound, double confidenceLevel) {
+ checkParameters(lowerBound, upperBound, confidenceLevel);
+ this.lowerBound = lowerBound;
+ this.upperBound = upperBound;
+ this.confidenceLevel = confidenceLevel;
+ }
+
+ /**
+ * @return the lower endpoint of the interval
+ */
+ public double getLowerBound() {
+ return lowerBound;
+ }
+
+ /**
+ * @return the upper endpoint of the interval
+ */
+ public double getUpperBound() {
+ return upperBound;
+ }
+
+ /**
+ * @return the asserted probability that the interval contains the
+ * population parameter
+ */
+ public double getConfidenceLevel() {
+ return confidenceLevel;
+ }
+
+ /**
+ * @return String representation of the confidence interval
+ */
+ @Override
+ public String toString() {
+ return "[" + lowerBound + ";" + upperBound + "] (confidence level:" + confidenceLevel + ")";
+ }
+
+ /**
+ * Verifies that (lower, upper) is a valid non-empty interval and confidence
+ * is strictly between 0 and 1.
+ *
+ * @param lower lower endpoint
+ * @param upper upper endpoint
+ * @param confidence confidence level
+ */
+ private void checkParameters(double lower, double upper, double confidence) {
+ if (lower >= upper) {
+ throw new MathIllegalArgumentException(LocalizedFormats.LOWER_BOUND_NOT_BELOW_UPPER_BOUND, lower, upper);
+ }
+ if (confidence <= 0 || confidence >= 1) {
+ throw new MathIllegalArgumentException(LocalizedFormats.OUT_OF_BOUNDS_CONFIDENCE_LEVEL, confidence, 0, 1);
+ }
+ }
+}
Modified: commons/proper/math/trunk/src/main/resources/assets/org/apache/commons/math3/exception/util/LocalizedFormats_fr.properties
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/resources/assets/org/apache/commons/math3/exception/util/LocalizedFormats_fr.properties?rev=1533824&r1=1533823&r2=1533824&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/resources/assets/org/apache/commons/math3/exception/util/LocalizedFormats_fr.properties (original)
+++ commons/proper/math/trunk/src/main/resources/assets/org/apache/commons/math3/exception/util/LocalizedFormats_fr.properties Sat Oct 19 20:37:13 2013
@@ -245,6 +245,7 @@ N_POINTS_GAUSS_LEGENDRE_INTEGRATOR_NOT_S
OBSERVED_COUNTS_ALL_ZERO = aucune occurrence dans le tableau des observations {0}
OBSERVED_COUNTS_BOTTH_ZERO_FOR_ENTRY = les occurrences observ\u00e9es sont toutes deux nulles pour l''entr\u00e9e {0}
BOBYQA_BOUND_DIFFERENCE_CONDITION = la diff\u00e9rence entre la contrainte sup\u00e9rieure et inf\u00e9rieure doit \u00eatre plus grande que deux fois le rayon de la r\u00e9gion de confiance initiale ({0})
+OUT_OF_BOUNDS_CONFIDENCE_LEVEL = niveau de confiance {0} hors domaine, doit \u00eatre entre {1} et {2}
OUT_OF_BOUNDS_QUANTILE_VALUE = valeur de quantile {0} hors bornes, doit \u00eatre dans l''intervalle ]0, 100]
OUT_OF_BOUND_SIGNIFICANCE_LEVEL = niveau de signification {0} hors domaine, doit \u00eatre entre {1} et {2}
SIGNIFICANCE_LEVEL = niveau de signification ({0})
Added: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/stat/inference/BinomialConfidenceIntervalTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/stat/inference/BinomialConfidenceIntervalTest.java?rev=1533824&view=auto
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/stat/inference/BinomialConfidenceIntervalTest.java (added)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/stat/inference/BinomialConfidenceIntervalTest.java Sat Oct 19 20:37:13 2013
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.math3.stat.inference;
+
+import org.apache.commons.math3.exception.MathIllegalArgumentException;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Test cases for the BinomialConfidenceInterval class.
+ */
+
+public class BinomialConfidenceIntervalTest {
+
+ protected BinomialConfidenceInterval testStatistic = new BinomialConfidenceInterval();
+
+ private final int successes = 50;
+
+ private final int trials = 500;
+
+ private final double confidenceLevel = 0.9;
+
+ @Test
+ public void testClopperPearsonInterval() {
+ ConfidenceInterval confidenceInterval = testStatistic.getClopperPearsonInterval(trials, successes,
+ confidenceLevel);
+ Assert.assertEquals(0.07873857, confidenceInterval.getLowerBound(), 1E-5);
+ Assert.assertEquals(0.1248658, confidenceInterval.getUpperBound(), 1E-5);
+
+ }
+
+ @Test
+ public void testNormalApproximationInterval() {
+ ConfidenceInterval confidenceInterval = testStatistic.getNormalApproximationInterval(trials, successes,
+ confidenceLevel);
+ Assert.assertEquals(0.07793197, confidenceInterval.getLowerBound(), 1E-5);
+ Assert.assertEquals(0.1220680, confidenceInterval.getUpperBound(), 1E-5);
+ }
+
+ @Test
+ public void testAgrestiCoullInterval() {
+ ConfidenceInterval confidenceInterval = testStatistic.getAgrestiCoullInterval(trials, successes,
+ confidenceLevel);
+ Assert.assertEquals(0.07993521, confidenceInterval.getLowerBound(), 1E-5);
+ Assert.assertEquals(0.1243704, confidenceInterval.getUpperBound(), 1E-5);
+ }
+
+ @Test
+ public void testWilsonScoreInterval() {
+ ConfidenceInterval confidenceInterval = testStatistic
+ .getWilsonScoreInterval(trials, successes, confidenceLevel);
+ Assert.assertEquals(0.08003919, confidenceInterval.getLowerBound(), 1E-5);
+ Assert.assertEquals(0.1242664, confidenceInterval.getUpperBound(), 1E-5);
+ }
+
+ @Test(expected = MathIllegalArgumentException.class)
+ public void testZeroConfidencelevel() {
+ testStatistic.getWilsonScoreInterval(trials, successes, 0d);
+ }
+
+ @Test(expected = MathIllegalArgumentException.class)
+ public void testOneConfidencelevel() {
+ testStatistic.getWilsonScoreInterval(trials, successes, 1d);
+ }
+
+ @Test(expected = MathIllegalArgumentException.class)
+ public void testZeroTrials() {
+ testStatistic.getWilsonScoreInterval(0, 0, confidenceLevel);
+ }
+
+ @Test(expected = MathIllegalArgumentException.class)
+ public void testNegativeSuccesses() {
+ testStatistic.getWilsonScoreInterval(trials, -1, confidenceLevel);
+ }
+
+ @Test(expected = MathIllegalArgumentException.class)
+ public void testSuccessesExceedingTrials() {
+ testStatistic.getWilsonScoreInterval(trials, trials + 1, confidenceLevel);
+ }
+}