如何计算 Pearson 相关矩阵并仅保留重要值?

Posted

技术标签:

【中文标题】如何计算 Pearson 相关矩阵并仅保留重要值?【英文标题】:How can I compute the Pearson correlation matrix and retain only significant values? 【发布时间】:2020-04-12 10:39:57 【问题描述】:

我有一个 4×3 矩阵 X,并希望通过计算 X 的所有 3 个可能列组合之间的相关性来形成 3×3 Pearson 相关矩阵 C。但是,C 中对应于统计上不显着的相关性的条目应设置为零。

我知道如何在scipy.stats 中使用pearsonr 获得成对相关性和显着性值。例如,

import numpy as np
from scipy.stats.stats import pearsonr

X = np.array([[1, 1, -2], [0, 0, 0], [0, .2, 1], [5, 3, 4]])
pearsonr(X[:, 0], X[:, 1])

返回(0.9915008164289165, 0.00849918357108348)X 的第一列和第二列之间的相关性约为 0.9915,p 值为 0.0085。

我可以使用嵌套循环轻松获得所需的矩阵:

    C 预填充为 3×3 零矩阵。 嵌套循环的每一遍将对应于X 的两列。如果 p 值小于或等于我的阈值,例如 0.01,则对应于这对列的 C 条目将设置为成对相关。

我想知道是否有更简单的方法。我知道在 Pandas 中,我可以在基本上一行中创建相关矩阵 C

import pandas as pd

df = pd.DataFrame(data=X)
C_frame = df.corr(method='pearson') 
C = C_frame.to_numpy()

有没有办法在没有循环的情况下获取 p 值的矩阵或数据框P?如果是这样,如果P 中的相应p 值超过我的阈值,我如何将C 的每个条目设置为零?

【问题讨论】:

C_frame.where(C_frame>0.99)? @QuangHoang。这根本不是一回事 ***.com/questions/52741236/… 是相关的。高度投票的答案显示了如何使用 method 参数返回 p-values 而不是相关系数。您可以将其用于mask 您的df.corr() 结果。虽然它仍然是一个循环...... 仅供参考:***.com/a/38946645/1217358 【参考方案1】:

查看pearsonr 的文档会发现用于计算相关性的公式。使用向量化得到矩阵每一列之间的相关性应该不会太难。

虽然您可以使用 pandas 计算 C 的值,但我将展示整个过程的纯 numpyan 实现。

首先,计算 r 值:

X = np.array([[1,  1, -2],
              [0,  0,  0],
              [0, .2,  1],
              [5,  3,  4]])
n = X.shape[0]

X -= X.mean(axis=0)
s = (X**2).sum(axis=0)
r = (X[..., None] * X[..., None, :]).sum(axis=0) / np.sqrt(s[:, None] * s[None, :])

考虑到 scipy 中存在 beta 分布,计算 p 值变得很简单。直接取自文档:

dist = scipy.stats.beta(n/2 - 1, n/2 - 1, loc=-1, scale=2)
p = 2 * dist.cdf(-abs(r))

您可以使用您的阈值从p 轻松制作一个蒙版,并将其应用于r 以制作C

mask = (p <= 0.01)
C = np.zeros_like(r)
C[mask] = r[mask]

更好的选择可能是就地修改您的r

r[p > 0.1] = 0

函数形式:

def non_trivial_correlation(X, threshold=0.1):
    n = X.shape[0]
    X = X - X.mean(axis=0) # Don't modify the original
    x = (X**2).sum(axis=0)
    r = (X[..., None] * X[..., None, :]).sum(axis=0) / np.sqrt(s[:, None] * s[None, :])
    p = 2 * scipy.stats.beta(n/2 - 1, n/2 - 1, loc=-1, scale=2).cdf(-abs(r))
    r[p > threshold] = 0
    return r

【讨论】:

以上是关于如何计算 Pearson 相关矩阵并仅保留重要值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在正确视图中创建 pearson 相关矩阵

R语言使用cov函数计算矩阵或者dataframe数据变量之间的协方差cor函数计算相关性cor函数通过method参数指定相关性相关性计算方法Pearson,Spearman, Kendall

R语言使用cov函数计算矩阵或者dataframe数据变量之间的协方差cor函数计算相关性cor函数通过method参数指定相关性相关性计算方法Pearson,Spearman, Kendall

PEARSON函数计算自变量因变量相关系数

初学python,怎样用python做pearson相关系数的检验呢,求指导啊

SPSS中pearson(皮尔逊相关系数)看r值还是P值,确定相关性