Расчет процентиля для каждого значения в списке

Я искал способ вычислить процентильный ранг для каждого значения в заданном списке, и пока безуспешно.

org.apache.commons.math3 дает вам способ получить p-й процентиль из списка значений, но я хочу противоположного. Я хочу иметь рейтинг для каждого значения в списке. Кто-нибудь знает о библиотеке или способе достижения этого в математике Apache Commons?

Например: учитывая список значений {1,2,3,4,5}, я хотел бы иметь процентильный ранг для каждого значения с максимальным процентилем, равным 99 или 100, и минимальным, равным 0 или 1.

Обновленный код:

public class TestPercentile {

public static void main(String args[]) {
    double x[] = { 10, 11, 12, 12, 12, 12, 15, 18, 19, 20 };
    calculatePercentiles(x);
}

public static void calculatePercentiles(double[] arr) {
    for (int i = 0; i < arr.length; i++) {
        int count = 0;
        int start = i;
        if (i > 0) {
            while (i > 0 && arr[i] == arr[i - 1]) {
                count++;
                i++;
            }
        }
        double perc = ((start - 0) + (0.5 * count));
        perc = perc / (arr.length - 1);
        for (int k = 0; k < count + 1; k++)
            System.out.println("Percentile for value " + (start + k + 1)
                    + " = " + perc * 100);
    }
}}

Sample Output: 
Percentile for value 1 = 0.0
Percentile for value 2 = 11.11111111111111
Percentile for value 3 = 22.22222222222222
Percentile for value 4 = 50.0
Percentile for value 5 = 50.0
Percentile for value 6 = 50.0
Percentile for value 7 = 50.0
Percentile for value 8 = 77.77777777777779
Percentile for value 9 = 88.88888888888889
Percentile for value 10 = 100.0

Может ли кто-нибудь сообщить мне, правильно ли это и есть ли библиотека для более чистого выполнения этого?

Спасибо!


person LizardKing    schedule 09.12.2013    source источник
comment
Как насчет того, чтобы показать, что вы пробовали   -  person Jorge Campos    schedule 10.12.2013
comment
Я сделал обновления!   -  person LizardKing    schedule 10.12.2013


Ответы (1)


Это действительно зависит от вашего определения процентиля. Ниже приведено решение с использованием заголовка NaturalRanking и изменение масштаба до интервала 0–1. Приятно, что в NaturalRanking уже реализовано несколько стратегий для обработки одинаковых значений и нанов.

import java.util.Arrays;
import org.apache.commons.math3.stat.ranking.NaNStrategy;
import org.apache.commons.math3.stat.ranking.NaturalRanking;
import org.apache.commons.math3.stat.ranking.TiesStrategy;

public class Main {

    public static void main(String[] args) {
        double[] arr = {Double.NaN, 10, 11, 12, 12, 12, 12, 15, 18, 19, 20};

        PercentilesScaledRanking ranking = new PercentilesScaledRanking(NaNStrategy.REMOVED, TiesStrategy.MAXIMUM);
        double[] ranks = ranking.rank(arr);

        System.out.println(Arrays.toString(ranks));
        //prints:
        //[0.1, 0.2, 0.6, 0.6, 0.6, 0.6, 0.7, 0.8, 0.9, 1.0]
    }
}

class PercentilesScaledRanking extends NaturalRanking {

    public PercentilesScaledRanking(NaNStrategy nanStrategy, TiesStrategy tiesStrategy) {
        super(nanStrategy, tiesStrategy);
    }

    @Override
    public double[] rank(double[] data) {
        double[] rank = super.rank(data);
        for (int i = 0; i < rank.length; i++) {
            rank[i] = rank[i] / rank.length;
        }
        return rank;
    }
}
person Josef Borkovec    schedule 03.01.2014