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个百分位数(中位数).然而,他们a和c.
所述的Apache方法(和由NIST页中引用的方法)说a是25百分和c是75%百分位数,因为是分空间成N + 1块,即,四等分.
Excel方法表示它a是第0百分位数和c第100百分位数,因为空间被分为N-1个区块,即一半.
因此,如果你想要Excel方法并且你不想自己编写代码,你可以从数组中删除最小和最大的元素,并调用Apache方法 - 它应该给你完全相同的结果,除了在超出终点的百分位数.
如果您想自己编写代码,请在下面给出一个简单的方法.请注意以下问题:
代码(未测试或甚至编译,但应该给你一个想法).
// 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)
将溶液创建类PercentileExcel这几乎是从公共方法百分拷贝除了关于如何caculate位置的小的变化:
pos=(1+p*(n-1))/100;
Run Code Online (Sandbox Code Playgroud)
然后,您需要将此行添加到代码中,以便将新类用于百分位数:
setPercentileImpl(PercentileExcel);
Run Code Online (Sandbox Code Playgroud)
类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)