如何计算等值的平均排名?
我正在尝试编写一个计算Spearman相关系数的MySQL查询。我的想法是编写一个计算Pearson相关系数的查询,并使用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]。
这是因为两个2的排名分别为1和2,而1和2之间的平均值为1.5。三个4的排名分别为3,4和5,这三个值的平均值为4。
如何计算等值的平均排名?我正在尝试编写一个计算Spearman相关系数的MySQL查询。我的想法是写一个查询来计算...