我有一个m行和n列的矩阵 data
. 我曾经使用np.corrcoef来计算所有行对之间的相关系数:
import numpy as np
data = np.array([[0, 1, -1], [0, -1, 1]])
np.corrcoef(data)
现在我还想看看这些系数的p值 . np.corrcoef
不提供这些; scipy.stats.pearsonr . 但是, scipy.stats.pearsonr
不接受输入矩阵 .
有一种快速的方法可以计算所有行对的系数和p值(例如,到达m m矩阵为2 m,一个具有相关系数,另一个具有相应的p值),而无需手动完成所有对?
4 回答
这样做的最有效的方法可能是
pandas
中的buildin方法.corr
,得到r:要使用t检验获得p值:
您也可以使用OP中提到的
scipy.stats.pearsonr
:我今天遇到了同样的问题 .
经过半小时的谷歌搜索,我在numpy / scipy库中找不到任何代码可以帮我做到这一点 .
所以我写了自己的 corrcoef 版本
第一个版本使用np.corrcoef的结果,然后根据corrcoef矩阵的三角形上限值计算p值 .
第二个循环版本只是遍历行,手动执行pearsonr .
测试通过,他们是一样的 .
我的Macbook对100x2500矩阵的性能
有点hackish和可能效率低下,但我认为这可能是你正在寻找的:
Scipy's pdist是一个非常有用的函数,主要用于查找n维空间中观测值之间的成对距离 .
但它允许用户定义可调用'distance metrics',可以利用它来执行任何类型的成对操作 . 结果以压缩距离矩阵形式返回,可以使用Scipy's 'squareform' function轻松更改为方形矩阵形式 .
如果您不必使用pearson correlation coefficient,则可以使用spearman correlation coefficient,因为它返回相关矩阵和p值(请注意,前者要求您的数据是正态分布的,而spearman相关是非参数度量,因此,不假设您的数据正常分布) . 示例代码: