我有一个矩阵data
,有 m 行和 n 列。我曾经使用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 矩阵,一个具有相关系数,另一个具有相应的p值),而不必手动遍历所有行对?
8条答案
按热度按时间rlcwz9us1#
我今天遇到了同样的问题。
在谷歌上搜索了半个小时后,我在numpy/scipy库中找不到任何代码可以帮助我做到这一点。
所以我写了我自己版本的corrcoef
字符串
第一个版本使用np.corrcoef的结果,然后基于corrcoef矩阵的三角形上值计算p值。
第二个循环版本只是遍历行,手动执行pearsonr。
型
测试通过了,它们是一样的。
型
我的MacBook上的性能与100 x2500矩阵相比
corrcoef需要0.06608104705810547秒循环=10
corrcoef_loop需要7.585600137710571秒loops=10
kiayqfof2#
最简单的方法可能是在
pandas
中构建方法.corr
,以获取r:字符串
使用t检验获得p值:
型
你也可以使用你在OP中提到的
scipy.stats.pearsonr
:型
p4tfgftt3#
有点黑客和可能效率低下,但我认为这可能是你正在寻找的:
字符串
Scipy's pdist是一个非常有用的函数,主要用于计算n维空间中观测值之间的成对距离。
但它允许用户自定义可调用的“距离度量”,可以利用它来执行任何类型的成对操作。结果以压缩的距离矩阵形式返回,可以使用Scipy的“squareform”函数轻松地将其更改为方阵形式。
wmtdaxz34#
如果你不需要使用pearson correlation coefficient,你可以使用spearman correlation coefficient,因为它返回相关矩阵和p值(注意,前者要求你的数据是正态分布的,而斯皮尔曼相关是一个非参数测量,因此不假设你的数据是正态分布的)。示例代码:
字符串
n8ghc7c15#
这与MATLAB中的corrcoef性能完全相同:
要使此功能工作,您需要安装pandas和scipy。
字符串
abithluo6#
这里是@CT Zhu的答案的最小版本。我们不需要
pandas
,因为相关性可以直接从numpy
计算,这应该更快,因为我们不需要转换为一个矩阵的步骤字符串
bxpogfeg7#
如果有人有类似的问题,但你的矩阵是一个pd.DataFrame对象,我写了下面的代码:
字符串
qlzsbp2j8#
我有办法!我需要对大小为2000 x30,000的数组执行此操作,使用上述方法或双循环是不可行的,特别是当似乎有一个明显的解决方案我错过了。所以我研究了scipy的Pearson Correlation实现,以了解他们如何计算p值,看看我是否可以优化它为2-d数组。在笔记中,他们解释说,他们估计皮尔逊相关系数(r)的PDF,并从这个“r”计算双侧p值。
假设x和y是独立的正态分布(因此总体相关系数为0),样本相关系数r的概率密度函数为:
$$ f(r) = \frac{\left ( 1-r^2 \right )^{\frac{n}{2}-2}}{B\left ( \frac{1}{2},\frac{n}{2}-1 \right )}$$的
其中n是样本数,B是beta函数。这有时被称为r的精确分布。对于具有相关系数r的给定样本,p值是从具有零相关性的总体中抽取的随机样本x'和y'的abs(r ')大于或等于abs(r)的概率。
这很容易应用于2-d数组,我很惊讶他们在np. corrcoef中没有这个功能。
字符串
以下内容直接摘自Scipy的pearsonr笔记
型
这个方法几乎是即时的,大约和 np.corrcoef 一样快。我通过比较双循环的方式检查了值是否正确,得到了这个。
型