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 public class WilsonScoreInterval implements BinomialConfidenceInterval {
29
30
31 @Override
32 public ConfidenceInterval createInterval(int numberOfTrials, int numberOfSuccesses, double confidenceLevel) {
33 IntervalUtils.checkParameters(numberOfTrials, numberOfSuccesses, confidenceLevel);
34 final double alpha = (1 - confidenceLevel) / 2;
35 final NormalDistribution normalDistribution = NormalDistribution.of(0, 1);
36 final double z = normalDistribution.inverseSurvivalProbability(alpha);
37 final double zSquared = z * z;
38 final double oneOverNumTrials = 1d / numberOfTrials;
39 final double zSquaredOverNumTrials = zSquared * oneOverNumTrials;
40 final double mean = oneOverNumTrials * numberOfSuccesses;
41
42 final double factor = 1 / (1 + zSquaredOverNumTrials);
43 final double modifiedSuccessRatio = mean + zSquaredOverNumTrials / 2;
44 final double difference = z * JdkMath.sqrt(oneOverNumTrials * mean * (1 - mean) +
45 (oneOverNumTrials * zSquaredOverNumTrials / 4));
46
47 final double lowerBound = factor * (modifiedSuccessRatio - difference);
48 final double upperBound = factor * (modifiedSuccessRatio + difference);
49 return new ConfidenceInterval(lowerBound, upperBound, confidenceLevel);
50 }
51 }