Java Apache Commons getPercentile()MS Excel百分位数的不同结果

Jav*_*ock 11 java statistics excel apache-commons percentile

我有一个计算的算法percentile(85)Apache Commons一系列值(12个值)与阈值,为以后的评估作出决定.结果类似于Excel给出的结果,但不相等,有时这对我的应用程序至关重要,因为使用excel时结果不会超过阈值,并且使用Apache Commons Math Java,所以我获得了不同的输出.

这是一个例子:互联网流量(Mbps)每2小时

32,7076813360000000 41,2580429776000000 45,4453940200000000 48,8044409456000000 46,7462847936000000 49,8028100056000000 54,3719451144000000 41,9708134600000000 29,4371963240000000 22,4667255616000000 20,0388452248000000 28,7807757104000000

除以1000 Mb(电缆的容量)后,我计算职业的百分位数(85):

Excel:0,049153870117

Apache Commons Math:0.05003126676104001

我发现有可能改变百分位的实现(它不存在官方的)setPercentileImpl(),但我找不到任何如何做到的例子,或Excel算法(我是那个告诉实现).

对此有任何帮助都会受到欢迎.

谢谢.

Nic*_*cue 10

差异是微妙的,并且由于假设.最容易用3元素的情况来解释.假设你有三个元素(N = 3) a=x[0] < b=x[1] < c=x[2].Apache和Excel方法都说元素b是第50个百分位数(中位数).然而,他们ac.

所述的Apache方法(和由NIST页中引用的方法)说a是25百分和c是75%百分位数,因为是分空间成N + 1块,即,四等分.

Excel方法表示它a是第0百分位数和c第100百分位数,因为空间被分为N-1个区块,即一半.

因此,如果你想要Excel方法并且你不想自己编写代码,你可以从数组中删除最小和最大的元素,并调用Apache方法 - 它应该给你完全相同的结果,除了在超出终点的百分位数.

如果您想自己编写代码,请在下面给出一个简单的方法.请注意以下问题:

  • 这会对数组进行排序(因此对其进行更改)
  • 由于排序,这需要O(N log(N))时间.Apache方法使用快速选择算法,因此需要O(N)时间(谷歌"quickselect"如果你想了解更多)

代码(未测试或甚至编译,但应该给你一个想法).

// warning - modifies data 
double excelPercentile(double [] data, double percentile) { array
    Arrays.sort(data);
    double index = percentile*(data.length-1);
    int lower = (int)Math.floor(index);
    if(lower<0) { // should never happen, but be defensive
       return data[0];
    }
    if(lower>=data.length-1) { // only in 100 percentile case, but be defensive
       return data[data.length-1);
    }
    double fraction = index-lower;
    // linear interpolation
    double result=data[lower] + fraction*(data[lower+1]-data[lower]);
    return result;
 }
Run Code Online (Sandbox Code Playgroud)


Jav*_*ock 5

将溶液创建类PercentileExcel这几乎是从公共方法百分拷贝除了关于如何caculate位置的小的变化:

pos=(1+p*(n-1))/100;
Run Code Online (Sandbox Code Playgroud)

然后,您需要将此行添加到代码中,以便将新类用于百分位数:

setPercentileImpl(PercentileExcel);
Run Code Online (Sandbox Code Playgroud)


pbi*_*nie 5

org.apache.commons.math3.stat.descriptive.rank.Percentile已经支持 Excel 样式插值,您只需要启用它 EstimationType.R_7

public class PercentileExcel extends Percentile {
    public PercentileExcel() throws MathIllegalArgumentException {

    super(50.0,
          EstimationType.R_7, // use excel style interpolation
          NaNStrategy.REMOVED,
          new KthSelector(new MedianOf3PivotingStrategy()));
    }
}
Run Code Online (Sandbox Code Playgroud)