MySQL中的Spearman相关系数-如何计算平均评分?

问题描述 投票:0回答:1

如何计算等值的平均排名?

我正在尝试编写一个计算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查询。我的想法是写一个查询来计算...

mysql sql correlation rank
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.