【发布时间】: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。这根本不是一回事
-
stackoverflow.com/questions/52741236/… 是相关的。高度投票的答案显示了如何使用
method参数返回p-values而不是相关系数。您可以将其用于mask您的df.corr()结果。虽然它仍然是一个循环......
标签: python pandas numpy matrix pearson-correlation