『Statistics』 三大相关性检验

三个相关性系数(pearson, spearman, kendall)反应的都是两个变量之间变化趋势的方向以及程度,其值范围为-1到+1,0表示两个变量不相关,正值表示正相关,负值表示负相关,值越大表示相关性越强。

通常情况下通过以下取值范围判断变量的相关强度:
0.8-1.0 极强相关
0.6-0.8 强相关
0.4-0.6 中等程度相关
0.2-0.4 弱相关
0.0-0.2 极弱相关或无相关

一、皮尔森相关性系数

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

计算公式

$$
\begin{align}
\rho_{X, Y}& = \frac{\operatorname{cov}(X, Y)}{\sigma_{X} \sigma_{Y}} \ & = \frac{E\left(\left(X-\mu_{X}\right)\left(Y-\mu_{Y}\right)\right)}{\sigma_{X} \sigma_Y} \& = \frac{E(X Y)-E(X) E(Y)}{\sqrt{E\left(X^{2}\right)-E^{2}(X)} \sqrt{E\left(Y^{2}\right)-E^{2}(Y)}}
\end{align}
$$

统计学之三大相关性系数(pearson、spearman、kendall)
重点关注第一个等号后面的公式,最后面的是推导计算,暂时不用管它们。看到没有,两个变量(X, Y)的皮尔森相关性系数($ρ_{X,Y}$)等于它们之间的协方差cov(X,Y)除以它们各自标准差的乘积(σX, σY)。

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

数据要求

  • 正态分布
    它是协方差与标准差的比值,并且在求皮尔森相关性系数以后,通常还会用t检验之类的方法来进行皮尔森相关性系数检验,而 t 检验是基于数据呈正态分布的假设的。
  • 实验数据之间的差距不能太大
    比如:研究人跑步的速度与心脏跳动的相关性,如果人突发心脏病,心跳为0(或者过快与过慢),那这时候我们会测到一个偏离正常值的心跳,如果我们把这个值也放进去进行相关性分析

代码示例

import pandas as pd
import numpy as np

#原始数据
X1=pd.Series([1, 2, 3, 4, 5, 6])
Y1=pd.Series([0.3, 0.9, 2.7, 2, 3.5, 5])

X1.mean() #平均值# 3.5
Y1.mean() #2.4
X1.var() #方差#3.5
Y1.var() #2.9760000000000004

X1.std() #标准差不能为0# 1.8708286933869707
Y1.std() #标准差不能为0#1.725108692227826
X1.cov(Y1) #协方差#3.0600000000000005

X1.corr(Y1,method="pearson") #皮尔森相关性系数 #0.948136664010285
X1.cov(Y1)/(X1.std()*Y1.std()) #皮尔森相关性系数 # 0.948136664010285

二、斯皮尔曼相关性系数

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

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

计算公式

$$
\rho_{s}=1-\frac{6 \sum d_{i}^{2}}{n\left(n^{2}-1\right)}
$$

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

20170816145416809

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

数据要求

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

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

由于斯皮尔曼相关性系数没有那些数据条件要求,适用的范围就广多了。

实例代码

import pandas as pd
import numpy as np

#原始数据
X1=pd.Series([1, 2, 3, 4, 5, 6])
Y1=pd.Series([0.3, 0.9, 2.7, 2, 3.5, 5])

#处理数据删除Nan
x1=X1.dropna()
y1=Y1.dropna()
n=x1.count()
x1.index=np.arange(n)
y1.index=np.arange(n)

#分部计算
d=(x1.sort_values().index-y1.sort_values().index)**2
dd=d.to_series().sum()

p=1-n*dd/(n*(n**2-1))

#s.corr()函数计算
r=x1.corr(y1,method='spearman')
print(r,p) #0.942857142857143 0.9428571428571428

三、肯德尔相关性系数

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

在统计学中,肯德尔相关系数是以Maurice Kendall命名的,并经常用希腊字母τ(tau)表示其值。肯德尔相关系数是一个用来测量两个随机变量相关性的统计值。一个肯德尔检验是一个无参数假设检验,它使用计算而得的相关系数去检验两个随机变量的统计依赖性。肯德尔相关系数的取值范围在-1到1之间,当τ为1时,表示两个随机变量拥有一致的等级相关性;当τ为-1时,表示两个随机变量拥有完全相反的等级相关性;当τ为0时,表示两个随机变量是相互独立的。

肯德尔相关性系数,又称肯德尔秩相关系数,它也是一种秩相关系数,不过它所计算的对象是分类变量

计算公式

假设两个随机变量分别为X、Y(也可以看做两个集合),它们的元素个数均为N,两个随即变量取的第i(1<=i<=N)个值分别用$Xi、Yi$表示。X与Y中的对应元素组成一个元素对集合XY,其包含的元素为(Xi, Yi)(1<=i<=N)。当集合XY中任意两个元素$(Xi, Yi)$与$(Xj, Yj)$的排行相同时(也就是说当出现情况1或2时;情况1:Xi>Xj且Yi>Yj,情况2:Xi<Xj且Yi<Yj),这两个元素就被认为是一致的。当出现情况3或4时(情况3:Xi>Xj且Yi<Yj,情况4:Xi<Xj且Yi>Yj),这两个元素被认为是不一致的。当出现情况5或6时(情况5:Xi=Xj,情况6:Yi=Yj),这两个元素既不是一致的也不是不一致的。

这里有三个公式计算肯德尔相关系数的值:

公式一:
$$
T a u-b=\frac{C-D}{\sqrt{(N 3-N)(N 3-N 2)}}
$$
其中C表示XY中拥有一致性的元素对数(两个元素为一对);D表示XY中拥有不一致性的元素对数。

注意:这一公式仅适用于集合X与Y中均不存在相同元素的情况(集合中各个元素唯一)。

公式二:
$$
T a u-b=\frac{C-D}{\sqrt{(N 3-N 1)(N 3-N 2)}}
$$

注意:这一公式适用于集合X或Y中存在相同元素的情况(当然,如果X或Y中均不存在相同的元素时,公式二便等同于公式一)。

其中C、D与公式一中相同;
$$
N 3=\frac{1}{2} N(N-1), \quad N 1=\sum_{i=1}^{s} \frac{1}{2} U_{i}\left(U_{i}-1\right) \quad, \quad N 2=\sum_{i=1}^{t} \frac{1}{2} V_{i}\left(V_{i}-1\right)
$$
N1、N2分别是针对集合X、Y计算的,现在以计算N1为例(N2的计算可以类推,在集合Y的基础上计算而得):

X集合中所有重复元素个数:将X中的相同元素分别组合成小集合,s表示集合X中拥有的小集合数(例如X包含元素:1 2 3 4 3 3 2,那么这里得到的s则为2,因为只有2、3有相同元素),Ui表示第i个小集合所包含的元素数。

公式三:
$$
T a u-c=\frac{C-D}{\frac{1}{2} N^{2} \frac{M-1}{M}}
$$
注意:这一公式中没有再考虑集合X、或Y中存在相同元素给最后的统计值带来的影响。公式三的这一计算形式仅适用于用表格表示的随机变量X、Y之间相关系数的计算(下面将会介绍)。

参数M稍后会做介绍。

通常人们会将两个随机变量的取值制作成一个表格,例如有10个样本,对每个样本进行两项指标测试X、Y(指标X、Y的取值均为1到3)。根据样本的X、Y指标取值,得到以下二维表格(表):

1551331-20200306200737036-367067751

由表可以得到X及Y的可以以集合的形式表示为:

X={1, 1, 2, 2, 2, 2, 2, 3, 3, 3};

Y={1, 2, 1, 1, 2, 2, 3, 2, 3, 3};

得到X、Y的集合形式后就可以使用以上的公式一或公式二计算X、Y的肯德尔相关系数了(注意公式一、二的适用条件)。

这里需要注意的是:公式二也可以用来计算表格形式表示的二维变量的肯德尔相关系数,不过它一般用来计算由正方形表格表示的二维变量的肯德尔相关系数,公式三则只是用来计算由长方形表格表示的二维变量的Kendall相关系数。这里给出公式三中字母M的含义,M表示长方形表格中行数与列数中较小的一个。表的行数及列数均为三。

适用范围

肯德尔相关系数与斯皮尔曼相关系数对数据条件的要求相同。

代码示例

Dataframe.corr(method='kendall'), 返回相关关系矩阵

from scipy.stats import kendalltau

kendalltau(x, y) 返回系数和P值
from pandas import DataFrame
import pandas as pd
x=[a for a in range(100)]
#构造一元二次方程,非线性关系
def y_x(x):
    return 2*x**2+4
y=[y_x(i) for i in x]

data=DataFrame({'x':x,'y':y})

#查看data的数据结构
data.head()
Out[34]: 
   x   y
0  0   4
1  1   6
2  2  12
3  3  22
4  4  36

data.corr()
Out[35]: 
          x         y
x  1.000000  0.967736
y  0.967736  1.000000

data.corr(method='spearman')
Out[36]: 
     x    y
x  1.0  1.0
y  1.0  1.0

data.corr(method='kendall')
Out[37]: 
     x    y
x  1.0  1.0
y  1.0  1.0

因为y经由函数构造出来,x和y的相关系数为1,但从实验结构可知pearson系数,针对非线性数据有一定的误差。

四、案例

举个例子说一下这三者分别适用的情况,主要说一下kendall,毕竟其他两个上期已经讲过了。比如10个病人做检查,检查结果数据如下:

v2-543cdbc8d92f50eedf062d67c966703a_720w

a 身高与体重的相关性,pearson相关系数

b 身高与病情程度的相关性,spearman或者kendall相关系数

c 性别与身高的相关性,Kendall相关系数

d 性别与病情程度的相关性,Kendall相关系数

像b情况为什么两者都适用呢?是因为此时初步诊断这个变量即可以看作定类变量,也可以看作定序变量,至少我个人是这么理解的,但有兴趣和有空闲的同学不妨试验一下结果如何。

性别请先自行转换成数值,比如0和1,再进行计算。

参考

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2019-2021 HG | 访问人数: | 浏览次数:

请我喝瓶农夫三拳吧~

支付宝
微信