function rank(array) {
var i, j, count, index, pos, posSum, val, sorted = array.slice(0).sort(function (a, b) {
return a - b;
});
for (i = 0; i < array.length; i++) {
val = array[i];
if (typeof val != "number") {
continue;
}
array[i] = null;
if (array.indexOf(val) == -1) {
array[i] = {value: sorted.indexOf(val) + 1};
} else {
array[i] = val;
pos = sorted.indexOf(val);
posSum = 0;
count = 0;
index = [];
for (j = 0; j < array.length; j++) {
if (array[j] === val) {
++count;
++pos;
posSum += pos;
array[j] = null;
index.push(j);
}
}
val = posSum / count;
for (j = 0; j < index.length; j++) {
array[index[j]] = {value: val};
}
}
}
for (i = 0; i < array.length; i++) {
array[i] = array[i].value;
}
return array;
}
alert(rank([1, 3, 52, 6, 100, 64, 71, 100, 100, 100]).join(", "));
Сообщение от http://wiki.myword.ru/index.php/Корреляция_ранговая
|
Процедура ранжирования начинается с расположения переменных по возрастанию их значений. Разным значениям присваиваются ранги, обозначаемые натуральными числами. Если встречаются несколько равных по значению переменных, им присваивается усредненный ранг.
|
4-й (с нуля), 7-й, 8-й и 9-й элементы массива имеют одинаковые значения, а так же 4-й элемент является 7-м (с единицы) по возрастанию, следовательно остальные получают ранг 8, 9 и 10, но нам нужен их усредненный ранг: (7 + 8 + 9 + 10) / 4 = 8,5.
Простого алгоритма не нагуглил, пришлось делать самому. Может кому еще пригодится)
rank correlation