【问题标题】:Get partial correlations matrix from pandas dataframe using spearman使用 spearman 从 pandas 数据框中获取偏相关矩阵
【发布时间】:2022-09-27 16:41:44
【问题描述】:

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

我正在使用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 的所有其他列的协方差?

    标签: python pandas correlation pingouin


    【解决方案1】:

    如果您可以添加表的前 n 行来重新创建数据框,那将会很有帮助。

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

    看看这里的例子 https://pingouin-stats.org/generated/pingouin.partial_corr.html

    【讨论】:

    • 如果您导入包 pingouin,则从其中导入数据帧:pg.read_dataset('partial_corr')
    【解决方案2】:

    当这对变量与其余变量拟合时,您可以使用偏相关矩阵只是残差的相关矩阵这一事实(请参阅here)。

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

    这是一个例子虹膜数据集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
    

    【讨论】:

    • 谢谢@Mortz,我无法运行您的代码,是否更正:将 iris_x 更改为 iris_data 是否正确? (更改 z = [[col for col in iris_x.columns if col not in xy] for xy in xy_combinations])
    • 是的,没错。抱歉,错过了。现在修复了
    猜你喜欢
    • 2015-02-10
    • 2019-09-26
    • 2016-07-07
    • 2021-02-13
    • 1970-01-01
    • 2022-08-19
    • 2015-06-08
    • 2017-07-01
    • 1970-01-01
    相关资源
    最近更新 更多