1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.math4.legacy.stat.interval;
18
19 import org.apache.commons.statistics.distribution.NormalDistribution;
20 import org.apache.commons.math4.core.jdkmath.JdkMath;
21
22
23
24
25
26
27
28
29
30 public class AgrestiCoullInterval implements BinomialConfidenceInterval {
31
32
33 @Override
34 public ConfidenceInterval createInterval(int numberOfTrials, int numberOfSuccesses, double confidenceLevel) {
35 IntervalUtils.checkParameters(numberOfTrials, numberOfSuccesses, confidenceLevel);
36 final double alpha = (1.0 - confidenceLevel) / 2;
37 final NormalDistribution normalDistribution = NormalDistribution.of(0, 1);
38 final double z = normalDistribution.inverseSurvivalProbability(alpha);
39 final double zSquared = JdkMath.pow(z, 2);
40 final double modifiedNumberOfTrials = numberOfTrials + zSquared;
41 final double modifiedSuccessesRatio = (1.0 / modifiedNumberOfTrials) * (numberOfSuccesses + 0.5 * zSquared);
42 final double difference = z *
43 JdkMath.sqrt(1.0 / modifiedNumberOfTrials * modifiedSuccessesRatio *
44 (1 - modifiedSuccessesRatio));
45 return new ConfidenceInterval(modifiedSuccessesRatio - difference, modifiedSuccessesRatio + difference,
46 confidenceLevel);
47 }
48 }