【SRCC】原公式和简化公式的介绍,需要注意简化公式使用的前提条件。

SRCC也有简称为SROCC,表示Separman correlation coefficient(斯皮尔曼系数)。
先贴上维基百科的链接:SRCC介绍-wiki
考虑到一些同学可能无法访问,下面简单介绍一下。

根据下图所示,SRCC其实就是等于用PLCC计算X和Y的排序中秩序相关性。
在这里插入图片描述
而PLCC公式如下
在这里插入图片描述
综上,SRCC为如下公式

公式一
在这里插入图片描述其中,r表示秩序

很多论文中使用如下公式表示SRCC(下图中红色方框公式),其实并不严谨:
公式二
公式2
如图中所示,只有当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的所有元素秩序中有相等的情况。公式一和公式二计算结果不一致。那么需要以公式一为准。

原理解释:
在这里插入图片描述
翻译如下
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值