(data, numSamples = 1000, confidenceLevel = 0.95)
| 140 | } |
| 141 | |
| 142 | function bootstrapConfidenceInterval(data, numSamples = 1000, confidenceLevel = 0.95) { |
| 143 | let means = []; |
| 144 | let dataLength = data.length; |
| 145 | |
| 146 | for (let i = 0; i < numSamples; i++) { |
| 147 | let sample = []; |
| 148 | for (let j = 0; j < dataLength; j++) { |
| 149 | let randomIndex = Math.floor(RNG() * dataLength); |
| 150 | sample.push(data[randomIndex]); |
| 151 | } |
| 152 | let sampleMean = sample.reduce((a, b) => a + b, 0) / sample.length; |
| 153 | means.push(sampleMean); |
| 154 | } |
| 155 | |
| 156 | means.sort((a, b) => a - b); |
| 157 | let lowerBoundIndex = Math.floor((1 - confidenceLevel) / 2 * numSamples); |
| 158 | let upperBoundIndex = Math.floor((1 + confidenceLevel) / 2 * numSamples); |
| 159 | let mean = means.reduce((a, b) => a + b, 0) / means.length; |
| 160 | let lowerBound = means[lowerBoundIndex]; |
| 161 | let upperBound = means[upperBoundIndex]; |
| 162 | |
| 163 | return { mean: mean, lowerBound: lowerBound, upperBound: upperBound }; |
| 164 | } |
| 165 | |
| 166 | function calculateConfidenceInterval(data) { |
| 167 | let { mean, lowerBound, upperBound } = bootstrapConfidenceInterval(data); |
no test coverage detected