SRCC也有简称为SROCC,表示Separman correlation coefficient(斯皮尔曼系数)。
先贴上维基百科的链接:SRCC介绍-wiki
考虑到一些同学可能无法访问,下面简单介绍一下。
根据下图所示,SRCC其实就是等于用PLCC计算X和Y的排序中秩序相关性。
而PLCC公式如下
综上,SRCC为如下公式
公式一
其中,r表示秩序
很多论文中使用如下公式表示SRCC(下图中红色方框公式),其实并不严谨:
公式二
如图中所示,只有当X和Y中各自的秩序都不相等时候,公式一才能转换为公式二。
注意: 我们计算秩的时候,若一个X中某个数xi是相等的,则秩序要用平均值表示。Y同理。
举例:
X=[1, 2, 3, 3, 4]
y=[5, 6, 7, 8, 9]
那么秩序为
RX=[1, 2, 3.5, 3.5, 4]
RY=[1, 2, 3, 4, 5]
可以看到本来X中的两个3的秩序为3和4,但是实际需要写成3和4的平均值3.5
那么秩序存在相同的情况了。这时候公式一就不能转换为上述公式二了。
下面将与scipy.stats.mstats.spearmanr进行验证:
借用老哥的数据,这里引用一下链接:斯皮尔曼等级相关系数Spearman’s rank correlation coefficient
import scipy
# 验证一,X和Y中的数据都不相同,因此秩序都不相等
def testSRCC(self):
x = [106, 86, 100, 101, 99, 103, 97, 113, 112, 110]
y = [7, 0, 27, 50, 28, 29, 20, 12, 6, 17]
print("srcc=", scipy.stats.mstats.spearmanr(x, y))
# x1和y1对应元素在x与y中的两种排序
x1 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10],dtype='float64')
y1 = np.array([1, 6, 8, 7, 10, 9, 3, 5, 2, 4],dtype='float64')
n = 10
rho = 1 - 6 * sum((y1 - x1) ** 2) / n / (n ** 2 - 1)
print("rho", rho)
# 表示x1和x2的平均值
x_mean = sum(x1)/len(x1)
y_mean = sum(y1)/len(y1)
son = sum((x1-x_mean)*(y1-y_mean))
mother = (sum((x1-x_mean)**2))**(0.5) * (sum((y1-y_mean)**2))**(0.5)
hand_srcc = son / mother
print("hand_srcc2=", hand_srcc)
输出结果:
srcc= SpearmanrResult(correlation=-0.17575757575757575, pvalue=0.6271883447764844)
rho -0.17575757575757578
hand_srcc2= -0.17575757575757575
由此看出,当X和Y中没有相等的秩序时,两个公式相等,可以除了精度问题外,基本一致。公式一和公式二可以互换。
import scipy
# 验证而,X中的数据存在相同,因此X秩序存在相等的情况
# 将X中86该为97后,x1中相应97的秩序变为平均值(1+2)/2=1.5
def testSRCC(self):
x = [106, 97, 100, 101, 99, 103, 97, 113, 112, 110]
y = [7, 0, 27, 50, 28, 29, 20, 12, 6, 17]
print("srcc=", scipy.stats.mstats.spearmanr(x, y))
# x1和y1对应元素在x与y中的两种排序
x1 = np.array([1.5, 1.5, 3, 4, 5, 6, 7, 8, 9, 10],dtype='float64')
y1 = np.array([1, 6, 8, 7, 10, 9, 3, 5, 2, 4],dtype='float64')
n = 10
rho = 1 - 6 * sum((y1 - x1) ** 2) / n / (n ** 2 - 1)
print("rho", rho)
# 表示x1和x2的平均值
x_mean = sum(x1)/len(x1)
y_mean = sum(y1)/len(y1)
son = sum((x1-x_mean)*(y1-y_mean))
mother = (sum((x1-x_mean)**2))**(0.5) * (sum((y1-y_mean)**2))**(0.5)
hand_srcc = son / mother
print("hand_srcc2=", hand_srcc)
输出结果:
srcc= SpearmanrResult(correlation=-0.20668788485122197, pvalue=0.5666951380068741)
rho -0.2030303030303029
hand_srcc2= -0.20668788485122194
由此看出,当X中存在相同的数,即X的所有元素秩序中有相等的情况。公式一和公式二计算结果不一致。那么需要以公式一为准。
原理解释:
翻译如下