Как я могу рассчитать средний рейтинг равных значений?
Я пытаюсь написать запрос MySQL, который вычисляет коэффициент корреляции Спирмена. Моя идея состоит в том, чтобы написать запрос, который вычисляет коэффициент корреляции Пирсона и использует RANK () OVER (ORDER BY X) для ранжирования значений перед вычислением.
Мне удалось заставить это работать, см. Код ниже. Но моя проблема в том, что все значения, которые были одинаковыми до ранжирования, после ранжирования становятся одинаковыми. Мои исследования говорят мне, что равные значения должны получать средний рейтинг всех равных значений. Как это можно включить в мой запрос?
Мой код:
#setting values
SELECT
@ax := avg(ranked_x) AS avg_x,
@ay := avg(ranked_y) AS avg_y,
@div := (stddev_samp(ranked_x) * stddev_samp(ranked_y)) AS stddev
FROM
(SELECT
RANK() OVER(ORDER BY x) as ranked_x,
RANK() OVER(ORDER BY y) as ranked_y
FROM table) AS D;
#calculating the correlation coefficient with the values from the last query
SELECT
sum( ( ranked_x - @ax ) * (ranked_y - @ay) ) / ((count(*) -1) * @div) AS correlation
FROM
(SELECT
RANK() OVER(ORDER BY x) as ranked_x,
RANK() OVER(ORDER BY y) as ranked_y
FROM table) AS D;
Пример:
Набор данных с отдельными значениями, такими как [2, 16, 27, 28, 42], будет ранжирован [1, 2, 3, 4, 5]. Набор данных с несколькими идентичными значениями, такими как [2, 2, 6, 6, 6], будет иметь рейтинг [1,5, 1,5, 4, 4, 4].
Это потому, что две двойки занимает первое и второе места, а среднее значение между 1 и 2 составляет 1,5. Три четверки - это числа 3, 4 и 5, и среднее из этих трех значений равно 4.