首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用spearman从熊猫数据中提取偏相关矩阵

利用spearman从熊猫数据中提取偏相关矩阵
EN

Stack Overflow用户
提问于 2022-09-07 10:17:16
回答 2查看 186关注 0票数 0

我想得到一个部分相关的矩阵(对于所有对),消除所有其他列的影响。

我使用的是pingouin,但是函数

代码语言:javascript
复制
df.pcorr().round(3)

只适用于pearson correlation

以下是代码:

代码语言:javascript
复制
#!pip install pingouin

import pandas as pd 
import pingouin as pg

df = pg.read_dataset('partial_corr')
print (df.pcorr().round(3)) #LIKE THIS BUT USING SPEARMAN CORRELATION

OUT: #like this one except obtained with SPEARMAN 
         x      y    cv1    cv2    cv3
x    1.000  0.493 -0.095  0.130 -0.385
y    0.493  1.000 -0.007  0.104 -0.002
cv1 -0.095 -0.007  1.000 -0.241 -0.470
cv2  0.130  0.104 -0.241  1.000 -0.118
cv3 -0.385 -0.002 -0.470 -0.118  1.00

问题:如何使用SPEARMAN为熊猫数据建立偏相关矩阵,排除所有其他列的协方差?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-23 16:12:08

您可以使用这样的事实:当变量对与其余变量进行拟合时,偏相关矩阵就是残差的相关矩阵(参见这里)。

你需要得到所有的对- (itertools.combinations在这里会有帮助)和拟合线性回归(sklearn),得到spearman相关性的残差,然后重塑数据得到矩阵。

下面是与Iris Dataset一起的sklearn示例。

代码语言:javascript
复制
import pandas as pd
from sklearn.datasets import load_iris
from itertools import combinations
from sklearn import linear_model

#data
iris_data = load_iris()
iris_data = pd.DataFrame(iris_data['data'], columns=iris_data['feature_names'])

#get all the pairs of variables
xy_combinations = list(combinations(iris_data.columns, 2))
z = [[col for col in iris_data.columns if col not in xy] for xy in xy_combinations]
xyz_combinations = list(zip(xy_combinations, z))

#Compute spearman correlation
def part_corr(xyz):
    var1, var2, rest = *xyz[0], xyz[1]
    var1_reg = linear_model.LinearRegression().fit(iris_data[rest], iris_data[var1])
    var2_reg = linear_model.LinearRegression().fit(iris_data[rest], iris_data[var2])
    var1_res = iris_data[var1] - var1_reg.predict(iris_data[rest])
    var2_res = iris_data[var2] - var2_reg.predict(iris_data[rest])
    part_corr_df = pd.concat([var1_res, var2_res], axis=1).corr(method='spearman')
    return part_corr_df.unstack()

# Reshaping data for square matrix form
part_corr_df = pd.DataFrame(pd.concat(list(map(part_corr, xyz_combinations))), columns=['part_corr']).reset_index()
part_corr_matrix = part_corr_df.pivot_table(values='part_corr', index='level_0', columns='level_1')
part_corr_matrix

输出

代码语言:javascript
复制
level_1            petal length (cm)  petal width (cm)  sepal length (cm)  sepal width (cm)
level_0                                                                                    
petal length (cm)           1.000000          0.862649           0.681566         -0.633985
petal width (cm)            0.862649          1.000000          -0.303597          0.362407
sepal length (cm)           0.681566         -0.303597           1.000000          0.615629
sepal width (cm)           -0.633985          0.362407           0.615629          1.000000
票数 1
EN

Stack Overflow用户

发布于 2022-09-23 16:01:12

如果您可以添加表的前n行以重新创建dataframe,这将是很有帮助的。

但是,可以通过传递pingouin.partial_corr()参数来使用method='spearman'计算偏相关。

看看这里的例子,corr.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73633787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档