Qarcher:python怎么计算相关系数、偏相关系数?zhuanlan.zhihu.com
import pandas as pd
import numpy as np
from scipy import stats
import stat
import math
import matplotlib.pyplot as plt
import seaborn as sns
x1=np.random.rand(10)
x2=np.random.rand(10)
x3=np.random.rand(10)
print(x1)
print(x2)
print(x3)
# 方法1:通过Pandas计算
df=pd.DataFrame([x1,x2,x3],index=[‘a’,’b’,’c’]).T
# 计算相关系数矩阵
corr=df.corr()
# 计算两列之间的相关系数
r_ab=df.a.corr(df.b)
r_ac=df.a.corr(df.c)
r_bc=df.b.corr(df.c)
# 计算偏方差
r_ab_c=(r_ab-r_ac*r_bc)/(((1-r_ac**2)**1/2)*((1-r_bc**2)**1/2))
# 方法2:通过numpy计算
lst=[x1,x2,x3]
# 生成相关系数矩阵
res=np.corrcoef(lst)
# 提取相关系数方式2
label=[‘a’,’b’,’c’]
corr=dict()
for row in range(res.shape[0]):
for col in range(res.shape[1]):
corr[‘r_{}{}’.format(label[row],label[col])]=res[row][col]
r_ab=corr[‘r_ab’]
r_ac=corr[‘r_ac’]
r_bc=corr[‘r_bc’]
r_ab_c=(r_ab-r_ac*r_bc)/(((1-r_ac**2)**1/2)*((1-r_bc**2)**1/2))
print(r_ab_c)
# 方法3:通过scipy计算
from scipy import stats
r_ab=stats.pearsonr(x1,x2)[0]
r_ac=stats.pearsonr(x1,x3)[0]
r_bc=stats.pearsonr(x2,x3)[0]
r_ab_c=(r_ab-r_ac*r_bc)/(((1-r_ac**2)**0.5)*((1-r_bc**2)**0.5))
print(‘ab_c的一阶偏相关系数为:’,r_ab_c)
# 方法4:自己写公式
def calc_corr(a, b):
a_avg = sum(a) / len(a)
b_avg = sum(b) / len(b)
# 计算分子,协方差————按照协方差公式,本来要除以n的,由于在相关系数中上下同时约去了n,于是可以不除以n
cov_ab = sum([(x – a_avg) * (y – b_avg) for x, y in zip(a, b)])
# 计算分母,方差乘积————方差本来也要除以n,在相关系数中上下同时约去了n,于是可以不除以n
sq = math.sqrt(sum([(x – a_avg) ** 2 for x in a]) * sum([(x – b_avg) ** 2 for x in b]))
corr_factor = cov_ab / sq
return corr_factor
r_ab=calc_corr(x1,x2)
r_ac=calc_corr(x1,x3)
r_bc=calc_corr(x2,x3)
r_ab_c=(r_ab-r_ac*r_bc)/(((1-r_ac**2)**1/2)*((1-r_bc**2)**1/2))
print(‘ab_c的一阶偏相关系数为:’,r_ab_c)