我想得到一个部分相关的矩阵(对于所有对),消除所有其他列的影响。
我使用的是pingouin,但是函数
df.pcorr().round(3)只适用于pearson correlation。
以下是代码:
#!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为熊猫数据建立偏相关矩阵,排除所有其他列的协方差?
发布于 2022-09-23 16:12:08
您可以使用这样的事实:当变量对与其余变量进行拟合时,偏相关矩阵就是残差的相关矩阵(参见这里)。
你需要得到所有的对- (itertools.combinations在这里会有帮助)和拟合线性回归(sklearn),得到spearman相关性的残差,然后重塑数据得到矩阵。
下面是与Iris Dataset一起的sklearn示例。
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输出
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发布于 2022-09-23 16:01:12
如果您可以添加表的前n行以重新创建dataframe,这将是很有帮助的。
但是,可以通过传递pingouin.partial_corr()参数来使用method='spearman'计算偏相关。
看看这里的例子,corr.html
https://stackoverflow.com/questions/73633787
复制相似问题