我给出了一个24个数字的排序数组到d3.quantile
并要求它计算第一个四分位数值。由于数组可以被均分为4组6个值,我的假设是结果是arr [5]和arr [6]的平均值,但这不是我得到的。
var arr = [89.7, 93.2, 94, 94.3, 94.5, 95.4, 95.9, 96.1, 96.4, 96.5, 96.9, 96.9, 97.3, 97.6, 97.6, 97.6, 97.8, 98.3, 98.3, 98.4, 98.5, 98.5, 98.6, 98.6];
var myAssumption = (arr[5] + arr[6]) / 2; // 95.65
var d3Result = d3.quantile(arr, 0.25); // 95.775
d3分位数函数是否使用更复杂的算法? This Wikipedia article列出了几个选项,但我不确定使用哪个(或者为什么一种算法优于另一种算法)。
答案 0 :(得分:1)
结果不正确,这是期望值。
如果您查看链接的Wikipedia页面,您会在类型列中看到“R-7”(它写成“R-7,Excel, SciPy-(1,1),Maple-6“)。这是d3.quantile()
函数使用的算法。
查看d3.quantile()
的源代码:
export default function(values, p, valueof) {
if (valueof == null) valueof = number;
if (!(n = values.length)) return;
if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);
if (p >= 1) return +valueof(values[n - 1], n - 1, values);
var n,
i = (n - 1) * p,
i0 = Math.floor(i),
value0 = +valueof(values[i0], i0, values),
value1 = +valueof(values[i0 + 1], i0 + 1, values);
return value0 + (value1 - value0) * (i - i0);
}
所以,在你的情况下,我们将:
i = (24 - 1) * 0.25
// ^--- the length of the array
这为我们提供了5.75
(和5
为Math.floor(i)
)。
然后返回的值(函数中的value0 + (value1 - value0) * (i - i0)
)将为:
95.4 + (95.9 - 95.4) * (5.75 - 5)
这给了我们你看到的结果:
95.775
以下是正在运行的演示:
var arr = [89.7, 93.2, 94, 94.3, 94.5, 95.4, 95.9, 96.1, 96.4, 96.5, 96.9, 96.9, 97.3, 97.6, 97.6, 97.6, 97.8, 98.3, 98.3, 98.4, 98.5, 98.5, 98.6, 98.6];
var d3Result = d3.quantile(arr, 0.25);
console.log(d3Result)
<script src="https://d3js.org/d3.v4.min.js"></script>