Pearson(皮尔逊)相关系数

皮尔逊相关也称为积差相关(或积矩相关)是英国统计学家皮尔逊于20世纪提出的一种计算直线相关的方法。
假设有两个变量X、Y,那么两变量间的皮尔逊相关系数可通过以下公式计算:
皮尔逊相关系数Java 皮尔逊相关系数定义式_协方差
其中E是数学期望,cov表示协方差.
适用范围:
当两个变量的标准差都不为零时,相关系数才有定义,皮尔逊相关系数适用于:
(1)、两个变量之间是线性关系,都是连续数据。
(2)、两个变量的总体是正态分布,或接近正态的单峰分布。
(3)、两个变量的观测值是成对的,每对观测值之间相互独立。
证明:
在证明之前,先介绍一下协方差的定义:
皮尔逊相关系数Java 皮尔逊相关系数定义式_正态分布_02
将上式右侧括号中的各项乘开,并利用数学期望的性质,可得到一个较为实用的计算皮尔逊相关系数Java 皮尔逊相关系数定义式_协方差_03的公式
皮尔逊相关系数Java 皮尔逊相关系数定义式_协方差_04
根据协方差的定义,可以验证协方差的下述性质:
(1)皮尔逊相关系数Java 皮尔逊相关系数定义式_数学期望_05
(2)皮尔逊相关系数Java 皮尔逊相关系数定义式_皮尔逊相关系数Java_06
(3)皮尔逊相关系数Java 皮尔逊相关系数定义式_皮尔逊相关系数Java_07
(4)皮尔逊相关系数Java 皮尔逊相关系数定义式_协方差_08
皮尔逊相关系数Java 皮尔逊相关系数定义式_皮尔逊相关系数Java_09
(5)若皮尔逊相关系数Java 皮尔逊相关系数定义式_协方差_10皮尔逊相关系数Java 皮尔逊相关系数定义式_正态分布_11相互独立,则皮尔逊相关系数Java 皮尔逊相关系数定义式_皮尔逊相关系数Java_12
(6)若皮尔逊相关系数Java 皮尔逊相关系数定义式_皮尔逊相关系数Java_13存在,则有:
皮尔逊相关系数Java 皮尔逊相关系数定义式_协方差_14
特别地,有
皮尔逊相关系数Java 皮尔逊相关系数定义式_正态分布_15
定义
皮尔逊相关系数
皮尔逊相关系数Java 皮尔逊相关系数定义式_数学期望_16
(1)若皮尔逊相关系数Java 皮尔逊相关系数定义式_协方差_10皮尔逊相关系数Java 皮尔逊相关系数定义式_正态分布_11相互独立,则皮尔逊相关系数Java 皮尔逊相关系数定义式_数学期望_19
(2)皮尔逊相关系数Java 皮尔逊相关系数定义式_数学期望_20
(3)皮尔逊相关系数Java 皮尔逊相关系数定义式_协方差_21的充要条件是:存在常数皮尔逊相关系数Java 皮尔逊相关系数定义式_正态分布_22使得皮尔逊相关系数Java 皮尔逊相关系数定义式_皮尔逊相关系数Java_23
证明:
皮尔逊相关系数Java 皮尔逊相关系数定义式_协方差_21等价与皮尔逊相关系数Java 皮尔逊相关系数定义式_数学期望_25。考虑如下的一元二次方程
皮尔逊相关系数Java 皮尔逊相关系数定义式_数学期望_26
条件皮尔逊相关系数Java 皮尔逊相关系数定义式_数学期望_25又等价于上述二次方程只有重根皮尔逊相关系数Java 皮尔逊相关系数定义式_协方差_28,即:
皮尔逊相关系数Java 皮尔逊相关系数定义式_数学期望_29
而上式等价于
皮尔逊相关系数Java 皮尔逊相关系数定义式_正态分布_30
注意到皮尔逊相关系数Java 皮尔逊相关系数定义式_正态分布_31,故上式等价于
皮尔逊相关系数Java 皮尔逊相关系数定义式_数学期望_32
根据方差的性质知,皮尔逊相关系数Java 皮尔逊相关系数定义式_数学期望_32的充要条件是皮尔逊相关系数Java 皮尔逊相关系数定义式_数学期望_34,亦即
皮尔逊相关系数Java 皮尔逊相关系数定义式_皮尔逊相关系数Java_35
皮尔逊相关系数Java 皮尔逊相关系数定义式_数学期望_36,于是,便证明了皮尔逊相关系数Java 皮尔逊相关系数定义式_协方差_21的充要条件是:存在常数皮尔逊相关系数Java 皮尔逊相关系数定义式_正态分布_22使得皮尔逊相关系数Java 皮尔逊相关系数定义式_皮尔逊相关系数Java_23
使用python实现皮尔逊相关系数

def mean(x):#期望
    return sum(x)/len(x)
def de_mean(x):
  x_bar = mean(x)
  return [x_i - x_bar for x_i in x]
# 辅助计算函数 dot product 、sum_of_squares
def dot(v, w):
  return sum(v_i * w_i for v_i, w_i in zip(v, w))
def sum_of_squares(v):
  return dot(v, v)
# 方差
def variance(x):
  n = len(x)
  deviations = de_mean(x)
  return sum_of_squares(deviations) / (n - 1)
# 标准差
import math
def standard_deviation(x):
  return math.sqrt(variance(x))
# 协方差
def covariance(x, y):
  n = len(x)
  return dot(de_mean(x), de_mean(y)) / (n -1)
# 相关系数
def correlation(x, y):
  stdev_x = standard_deviation(x)
  stdev_y = standard_deviation(y)
  if stdev_x > 0 and stdev_y > 0:
    return covariance(x, y) / stdev_x / stdev_y
  else:
    return 0

Spearman Rank(斯皮尔曼等级)相关系数

在统计学中,斯皮尔曼等级相关系数以Charles Spearman命名,并经常用希腊字母ρ(rho)表示其值。斯皮尔曼等级相关系数用来估计两个变量X、Y之间的相关性,其中变量间的相关性可以使用单调函数来描述。如果两个变量取值的两个集合中均不存在相同的两个元素,那么,当其中一个变量可以表示为另一个变量的很好的单调函数时(即两个变量的变化趋势相同),两个变量之间的ρ可以达到+1或-1。
假设两个随机变量分别为X、Y(也可以看做两个集合),它们的元素个数均为N,两个随即变量取的第i(1<=i<=N)个值分别用Xi、Yi表示。对X、Y进行排序(同时为升序或降序),得到两个元素排行集合x、y,其中元素xi、yi分别为Xi在X中的排行以及Yi在Y中的排行。将集合x、y中的元素对应相减得到一个排行差分集合d,其中di=xi-yi,1<=i<=N。随机变量X、Y之间的斯皮尔曼等级相关系数可以由x、y或者d计算得到,其计算方式如下所示:
由排行差分集合d计算而得(公式一):
皮尔逊相关系数Java 皮尔逊相关系数定义式_数学期望_40
斯皮尔曼等级相关系数公式一
由排行集合x、y计算而得(斯皮尔曼等级相关系数同时也被认为是经过排行的两个随即变量的皮尔逊相关系数,以下实际是计算x、y的皮尔逊相关系数)(公式二):
皮尔逊相关系数Java 皮尔逊相关系数定义式_数学期望_41
斯皮尔曼等级相关系数公式二
这里需要注意:当变量的两个值相同时,它们的排行是通过对它们取平均得到的。
适用范围
斯皮尔曼等级相关系数对数据条件的要求没有皮尔逊相关系数严格,只要两个变量的观测值是成对的等级评定资料,或者是由连续变量观测资料转化得到的等级资料,不论两个变量的总体分布形态、样本容量的大小如何,都可以用斯皮尔曼等级相关系数来进行研究。
spearman相关系数的python实现

#序列:Series 用于存储一行或者一列的数据,以及与之相关的索引集合
#(类似于列表,但是有索引)
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-6*dd/(n*(n**2-1))
r=x1.corr(y1,method='spearman')
print(r,p) #0.942857142857143 0.9428571428571428

Kendall Rank(肯德尔等级)相关系数

在统计学中,肯德尔相关系数是以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),这两个元素既不是一致的也不是不一致的。

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

公式一:

皮尔逊相关系数Java 皮尔逊相关系数定义式_数学期望_42

其中C表示XY中拥有一致性的元素对数(两个元素为一对);D表示XY中拥有不一致性的元素对数。

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

公式二:

皮尔逊相关系数Java 皮尔逊相关系数定义式_协方差_43

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

其中C、D与公式一中相同;

皮尔逊相关系数Java 皮尔逊相关系数定义式_协方差_44

皮尔逊相关系数Java 皮尔逊相关系数定义式_正态分布_45

皮尔逊相关系数Java 皮尔逊相关系数定义式_皮尔逊相关系数Java_46

N1、N2分别是针对集合X、Y计算的,现在以计算N1为例,给出N1的由来(N2的计算可以类推):

将X中的相同元素分别组合成小集合,s表示集合X中拥有的小集合数(例如X包含元素:1 2 3 4 3 3 2,那么这里得到的s则为2,因为只有2、3有相同元素)皮尔逊相关系数Java 皮尔逊相关系数定义式_数学期望_47表示第i个小集合所包含的元素数。N2在集合Y的基础上计算而得。

公式三:

公式三适用于表格行随机变量X、Y之间相关系数的计算。

皮尔逊相关系数Java 皮尔逊相关系数定义式_数学期望_48

表格举例如下:

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

皮尔逊相关系数Java 皮尔逊相关系数定义式_数学期望_49


公式三中字母M的含义,M表示长方形表格中行数与列数中较小的一个。表1的行数及列数均为三。

由表1可以得到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的肯德尔相关系数了(注意公式一、二的适用条件)。

当然如果给定X、Y的集合形式,那么也是很容易得到它们的表格形式的。

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

适用范围

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

kendall相关系数的matlab实现

function coeff = myKendall(X , Y)
if length(X) ~= length(Y)
    error('两个数值数列的维数不相等');
    return;
end

%将X变为行序列(如果X已经是行序列则不作任何变化)
if size(X , 1) ~= 1
    X = X';
end
%将Y变为行序列(如果Y已经是行序列则不作任何变化)
if size(Y , 1) ~= 1
    Y = Y';
end

N = length(X); %得到序列的长度
XY = [X ; Y]; %得到合并序列
C = 0; %一致性的数组对数
D = 0; %不一致性的数组对数
N1 = 0; %集合X中相同元素总的组合对数
N2 = 0; %集合Y中相同元素总的组合对数
N3 = 0; %合并序列XY的总对数
XPair = ones(1 , N); %集合X中由相同元素组成的各个子集的元素数
YPair = ones(1 , N); %集合Y中由相同元素组成的各个子集的元素数
cont = 0; %用于计数

%计算C与D
for i = 1 : N - 1
    for j = i + 1 : N
        if abs(sum(XY(: , i) ~= XY(: , j))) == 2 
            switch abs(sum(XY(: , i) > XY(: , j)))
                case 0
                    C = C + 1;
                case 1
                    D = D + 1;
                case 2
                    C = C + 1;
            end
        end
    end
end

%计算XPair中各个元素的值
while length(X) ~= 0
    cont = cont + 1;
    index = find(X == X(1));
    XPair(cont) = length(index);
    X(index) = [];
end
%计算YPair中各个元素的值
cont = 0;
while length(Y) ~= 0
    cont = cont + 1;
    index = find(Y == Y(1));
    YPair(cont) = length(index);
    Y(index) = [];
end

%计算N1、N2及N3的值
N1 = sum(0.5 * (XPair .* (XPair - 1)));
N2 = sum(0.5 * (YPair .* (YPair - 1)));
N3 = 0.5 * N * (N - 1);

coeff = (C - D) / sqrt((N3 - N1) * (N3 - N2));

end %函数myKendall结束