protected internal override QuantileResult expectedShortfall(double level, DoubleArray sample) { ArgChecker.isTrue(level > 0, "Quantile should be above 0."); ArgChecker.isTrue(level < 1, "Quantile should be below 1."); int sampleSize = sampleCorrection(sample.size()); double[] order = createIndexArray(sample.size()); double[] s = sample.toArray(); DoubleArrayMath.sortPairs(s, order); double fractionalIndex = level * sampleSize; int index = (int)checkIndex(this.index(fractionalIndex), sample.size(), true); int[] indices = new int[index]; double[] weights = new double[index]; double interval = 1d / (double)sampleSize; double losses = s[0] * interval *indexShift(); for (int i = 0; i < index - 1; i++) { losses += s[i] * interval; indices[i] = (int)order[i]; weights[i] = interval; } losses += s[index - 1] * (fractionalIndex - index + 1 - indexShift()) * interval; indices[index - 1] = (int)order[index - 1]; weights[0] += interval * indexShift(); weights[index - 1] = (fractionalIndex - index + 1 - indexShift()) * interval; return(QuantileResult.of(losses / level, indices, DoubleArray.ofUnsafe(weights).dividedBy(level))); }
private void check_quantile(double level) { double[] w = METHOD.weights(DATA_123.size()); double qComputed = METHOD.quantileFromUnsorted(level, DATA_123); double WI1 = 0.0d; int nbW = 0; for (int i = 0; i < DATA_123.size(); i++) { if (DATA_123.get(i) > qComputed) { WI1 += w[i]; nbW++; } } assertTrue(WI1 < 1.0d - level, "Weight of tail lower than level"); double[] w2 = w.Clone(); double[] data = DATA_123.toArray(); DoubleArrayMath.sortPairs(data, w2); double WI = WI1 + w2[w.Length - 1 - nbW]; assertTrue(WI > 1.0d - level, "Weight of tail+1 larger than level"); double alpha = (WI - (1 - level)) / (WI - WI1); double qExpected = (1 - alpha) * data[w.Length - 1 - nbW] + alpha * data[w.Length - 1 - nbW + 1]; assertEquals(qComputed, qExpected, TOLERANCE_WEIGHT, "Quantile."); }
protected internal override QuantileResult quantile(double level, DoubleArray sample, bool isExtrapolated) { ArgChecker.isTrue(level > 0, "Quantile should be above 0."); ArgChecker.isTrue(level < 1, "Quantile should be below 1."); int sampleSize = sampleCorrection(sample.size()); double[] order = createIndexArray(sample.size()); double[] s = sample.toArray(); DoubleArrayMath.sortPairs(s, order); int index = (int)checkIndex(this.index(level * sampleSize), sample.size(), isExtrapolated); int[] ind = new int[1]; ind[0] = (int)order[index - 1]; return(QuantileResult.of(s[index - 1], ind, DoubleArray.of(1))); }