三大统计学相关系数(pearson皮尔森、spearman斯皮尔曼、kendall肯德尔)

目录

1 person correlation coefficient(皮尔森相关性系数)

2 spearman correlation coefficient(斯皮尔曼相关性系数)

3 kendall correlation coefficient(肯德尔相关性系数) 

3.1 定义

3.2 Kendall系数的几种计算方法及其原理

3.3 示例

3.3.1 实例一(数值变量)

 3.3.2 示例二(定类变量)

4 python实现


        Kendall相关系数是对于定类变量的统计,pearson是对定距变量的统计,而spearman是对定序变量的统计。

1 person correlation coefficient(皮尔森相关性系数)

公式如下:

        重点关注第一个等号后面的公式。两个变量(X, Y)的皮尔森相关性系数(ρX,Y)等于它们之间的协方差cov(X,Y)除以它们各自标准差的乘积(σX, σY)。

        公式的分母是变量的标准差,这就意味着计算皮尔森相关性系数时,变量的标准差不能为0(分母不能为0),也就是说你的两个变量中任何一个的值不能都是相同的。如果没有变化,用皮尔森相关系数是没办法算出这个变量与另一个变量之间是不是有相关性的。

        就好比我们想研究人跑步的速度与心脏跳动的相关性,如果你无论跑多快,心跳都不变(即心跳这个变量的标准差为0),或者你心跳忽快忽慢的,却一直保持一个速度在跑(即跑步速度这个变量的标准差为0),那我们都无法通过皮尔森相关性系数的计算来判断心跳与跑步速度到底相不相关。

皮尔森相关性系数是协方差与标准差的比值,所以它对数据是有比较高的要求的:

  1. 实验数据通常假设是成对的来自于正态分布的总体。为啥通常会假设为正态分布呢?因为我们在求皮尔森相关性系数以后,通常还会用t检验之类的方法来进行皮尔森相关性系数检验,而 t检验是基于数据呈正态分布的假设的。 
  2. 实验数据之间的差距不能太大,或者说皮尔森相关性系数受异常值的影响比较大。比如刚才心跳与跑步的例子,万一这个人的心脏不太好,跑到一定速度后承受不了,突发心脏病,那这时候我们会测到一个偏离正常值的心跳(过快或者过慢,甚至为0),如果我们把这个值也放进去进行相关性分析,它的存在会大大干扰计算的结果的。
  3. 两个变量的观测值是成对的,每对观测值之间相互独立。
  4. 两个变量的标准差不为0。

             

2 spearman correlation coefficient(斯皮尔曼相关性系数)

        斯皮尔曼相关性系数,通常也叫斯皮尔曼秩相关系数。“秩”,可以理解成就是一种顺序或者排序,那么它就是根据原始数据的排序位置进行求解,这种表征形式就没有了求皮尔森相关性系数时那些限制。下面来看一下它的计算公式: 

         

         计算过程就是:首先对两个变量(X, Y)的数据进行排序,然后记下排序以后的位置(X’, Y’),(X’, Y’)的值就称为秩次,秩次的差值就是上面公式中的di,n就是变量中数据的个数,最后带入公式就可求解结果。举个例子吧,假设我们实验的数据如下: 

        带入公式,求得斯皮尔曼相关性系数:ρs= 1-6*(1+1+1+9)/6*35=0.657

        也就是说,我们不用管X和Y这两个变量具体的值到底差了多少,只需要算一下它们每个值所处的排列位置的差值,就可以求出相关性系数了。

        而且,即便在变量值没有变化的情况下,也不会出现像皮尔森系数那样分母为0而无法计算的情况。另外,即使出现异常值,由于异常值的秩次通常不会有明显的变化(比如过大或者过小,那要么排第一,要么排最后),所以对斯皮尔曼相关性系数的影响也非常小!

       由于斯皮尔曼相关性系数没有那些数据条件要求,适用的范围就广多了。在我们生物实验数据分析中,尤其是在分析多组学交叉的数据中说明不同组学数据之间的相关性时,使用的频率很高。

3 kendall correlation coefficient(肯德尔相关性系数) 

3.1 定义

        kendall秩相关系数(R)是指设有n个统计对象,每个对象有两个属性的系数。将所有统计对象按属性1取值排列,不失一般性,设此时属性2取值的排列是乱序的。设P为两个属性值排列大小关系一致的统计对象对数。

        Kendall(肯德尔)系数的定义:n个同类的统计对象按特定属性排序,其他属性通常是乱序的。同序对(concordant pairs)和异序对(discordant pairs)之差与总对数(n*(n-1)/2)的比值定义为Kendall(肯德尔)系数。

1)如果两个属性排名是相同的,系数为1 ,两个属性正相关。

2)如果两个属性排名完全相反,系数为-1 ,两个属性负相关

3)如果排名是完全独立的,系数为0。

         斯皮尔曼等级相关系数对数据条件的要求没有皮尔逊相关系数严格,只要两个变量的观测值是成对的等级评定资料,或者是由连续变量观测资料转化得到的等级资料,不论两个变量的总体分布形态、样本容量的大小如何,都可以用斯皮尔曼等级相关系数来进行研究。

3.2 Kendall系数的几种计算方法及其原理

 

 

3.3 示例

3.3.1 实例一(数值变量)

    假如我们设一组8人的身高和体重在那里A的人是最高的,第三重,等等:

         我们看到,有一些相关的两个排名之间的相关性,可以使用肯德尔头系数,客观地衡量对应。

         注意,A最高,但体重排名为 3 ,比体重排名为 4,5,6,7,8 的重,贡献5个同序对,即AB,AE,AF,AG,AH。同理,我们发现B、C、D、E、F、G、H分别贡献4、5、4、3、1、0、0个同序对,因此,同序对数

           P = 5 + 4 + 5 + 4 + 3 + 1 + 0 + 0 = 22.

          异序对数 Q=28-22 (总对数减去同序对数为异序对数)

        因而R=((22-6)/28)=0.57。这一结果显示出强大的排名之间的规律,符合预期。

 3.3.2 示例二(定类变量)

        比如10个病人做检查,检查结果数据如下:

        相关性的测量是基于数据的,就是两变量都是数据才能计算其相关性。性别请先自行转换成数值比如0和1,再进行计算,正确的结果是这样的:

         按身高排了个序:

        

一致性C:

         比如病人1的性别0<病人2的性别1,且身高130<病人2的身高145,则病人1、2是一致性的1对,解释起来即病人1、2的性别和身高的排序或称之为序列是一致的。

        同理,病人1与病人10、6、9、7都能结成一致性的对,这时一致性对数已经等于5.

        那么同理,病人5与病人2、10、6、9、7,病人8与病人6、9、7,病人3与病人7,病人4与病人7都是一致的。

        这么加起来C=15.

不一致性D:

        比如病人2的性别1>病人8的性别0,而身高145<病人8的156,则病人2、8是不一致的一对。

        就不继续往下同理了,反正加起来D=10.

即不是一致,也不是不一致:

         比如病人1的性别0=病人5的性别0,比如病人2的性别1=病人10的性别1,比如病人6、9性别身高都相等,那么他们既不是一致的,也不是不一致的。

         所以这么看其原理,跟spearman倒有点相似,都是基于对变量的顺序进行的分析。

再说N3,N2,N1。

N3==45,N=样本数目10。

N2、N1就比较复杂,它们各指向一个变量,随便吧比如N2指向性别:

N2=,s是指性别中拥有相同元素的小集合的个数,显然是2个,第1个集合是5个0,第2个集合是5个1,v就是每个集合中元素的个数,显然2个集合中元素的个数都是5,N2=20.

N1与N2一样的公式,只是它指向身高,那身高中拥有相同元素的小集合就1个,集合中就2个元素,所以N1=1.

以上,各代入,计算出结果就行。

4 python实现

import copy
import numpy as np
from scipy.stats import pearsonr
from scipy.stats import spearmanr
from scipy.stats import kendalltau


def pearson_prac(data1, data2):
    """
    皮尔逊两关系数
    :return:
    """
    # 法一
    res = np.corrcoef(data1, data2)
    print(res)
    # 返回的矩阵结果:
    # r[i][j]分别为第i组数据和第j组数据的⽪尔逊积矩相关系数:
    # r[0][0]计算的是第[0]组数组和第[0]组数据的相关系数, 也就是, 结果当然是1.
    # r[0][1]计算的是第[0]组数组和第[1]组数据的相关系数,
    # r[1][0]计算的是第[1]组数组和第[0]组数据的相关系数

    # 法二

    corr, p = pearsonr(data1, data2)
    print(corr, p, sep="\n")


def spearmanr_prac(data1, data2):
    corr, p = spearmanr(data1, data2)
    print(corr, p, sep="\n")


def kendall_prac(data1, data2):
    """
    """
    corr, p = kendalltau(data1, data2)
    print(corr, p, sep="\n")

    if abs(corr) > 0.5 and p < 0.05:
        print("trend")
    else:
        print("no-trend")


if __name__ == "__main__":
    # 两列相同的数
    data1 = np.random.randint(6, 10, 300)
    data2 = copy.deepcopy(data1)

    # 两列随机数
    # data = np.random.randint(6, 10, (300, 2))  # 生成随机数
    # data1 = data[:, 0]
    # data2 = data[:, 1]

    # 每列数字相同
    # data1 = [1] * 100
    # data2 = [2] * 100

    pearson_prac(data1, data2)
    spearmanr_prac(data1, data2)
    kendall_prac(data1, data2)


时间序列分析之趋势判断 – 标点符

统计学之三大相关性系数(pearson、spearman、kendall) - 程序员大本营

Kendall相关系数详解-案例版 - 知乎

kendall秩相关系数_百度百科

Kendall系数的几种计算方法及其原理.pdf​​​​​​​:有道云笔记

猜你喜欢

转载自blog.csdn.net/weixin_39910711/article/details/124656070
今日推荐