2017-09-18 3 views
1

24個の数値のソートされた配列をd3.quantileに与えて、それに第1四分位の値を計算するよう依頼しています。配列は6つの値の4つのグループに均等に分割することができるので、結果はarr [5]とarr [6]の平均になりますが、それは私が得たものではありません。d3.quantileがQ1を間違って計算しているようです

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にはいくつかのオプションが列挙されていますが、どちらが使用されているのか(なぜ1つのアルゴリズムが別のアルゴリズムに優先するのか)はわかりません。

答えて

1

結果が間違っていない、それは期待値です。

あなたがリンクされているWikipediaページを見れば、あなたは(それが「R-7、エクセル、SciPy-(1,1)書かれてタイプ欄に "R-7" を参照してくださいよ、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); 
} 

だから、あなたのケースでは、我々が持っているでしょう:私たち5.75(およびMath.floor(i)として5)を与える

i = (24 - 1) * 0.25 
// ^--- the length of the array 

その後(関数内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>

+1

美しい答え。ありがとう! – carpiediem

関連する問題