皮尔逊相关系数与斯皮尔曼等级相关系数

一、皮尔逊相关系数(Pearson)

假设有两个变量X、Y,那么两变量间的皮尔逊相关系数可通过以下公式计算:

其中E是数学期望,cov表示协方差.
适用范围:
当两个变量的标准差都不为零时,相关系数才有定义,皮尔逊相关系数适用于:
(1)、两个变量之间是线性关系,都是连续数据。
(2)、两个变量的总体是正态分布,或接近正态的单峰分布。
(3)、两个变量的观测值是成对的,每对观测值之间相互独立。

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)

假设两个长度为N的向量X和Y,即X和Y中包含N个元素,计算两个向量X和Y的相关性,可以根据以下步骤计算:

step1:将两个列向量X和Y对应的元素Xi和Yi转换为在各自列向量中的排名,记为R(Xi)和R(Yi

step2:   根据下面公式,计算两个列向量X和Y中对应元素的R(Xi)和R(Yi) 之间的差异d,并相加

             

step3:最后,根据下面公式计算出两个列向量之间的相关性Rs

            

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

#序列: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

 

posted @ 2020-04-27 21:25  光彩照人  阅读(4024)  评论(0编辑  收藏  举报