我一直在尝试用Python(使用numpy和scipy)实现Matlab的corr函数的这个变体,但似乎我自己无法解决它。我需要的是实现替代的 Matlab corr 实现:
[rho,pval] = corr(X,Y)
我将不胜感激任何帮助!
我尝试过的:
我尝试修改此处和此其他线程中发布的解决方案,但没有取得太大成功。例如,我能够将两个矩阵 X 和 Y 堆叠起来,并通过保留相关矩阵的一部分,我得到了正确的相关结果。然而,同样的技巧不适用于 p 值。实际上,其他线程中的两个解决方案都为我提供了(或多或少)正确的相关系数值,这很好,但我无法重现 p 值的 Matlab 实现的行为。
此外,here的解决方案旨在重现 corrcoef 的行为,根据 Matlab 的文档,它在计算相关性之前将输入矩阵转换为列向量。
另一方面,我也尝试在Matlab中对矩阵进行
hstack
,并再次得到相同的相关性答案,但是我在Python中得到的值与我在Python中得到的值之间的p值有很大不同MATLAB。这让我觉得问题可能出在计算的统计数据上。然而,根据 Matlab 文档,它使用:
corr 使用学生 t 分布计算 Pearson 相关性的 p 值以进行相关性变换
而且,从 SciPy 中的文档来看,我认为他们使用的是相同的测试,但我不是 100% 确定,因为参考文献是针对学生论文的,这是 Matlab 文档所说的使用的测试(学生的论文) r),但正如我所说,我根本不确定。
我认为最简单的方法是在 pandas 中使用 scipy.stats pearsonr 来实现,它返回成对的 rho 和 pval。我用下面的一些样本进行了测试,我相信结果与 matlab 结果相符
import numpy as np
from scipy.stats import pearsonr
import pandas as pd
X = np.array([
[0.5377, 0.3188, 3.5784, 0.7254],
[1.8339, -1.3077, 2.7694, -0.0631],
[-2.2588, -0.4336, -1.3499, 0.7147],
[0.8622, 0.3426, 3.0349, -0.2050]
])
Y1 = np.array([
[-0.1241, 0.6715, 0.4889, 0.2939],
[1.4897, -1.2075, 1.0347, -0.7873],
[1.4090, 0.7172, 0.7269, 0.8884],
[1.4172, 1.6302, -0.3034, -1.1471]
])
Y2 = Y1
Y2[:, 3] = Y2[:, 3] + X[:, 1]
df1 = pd.DataFrame(X)
df2 = pd.DataFrame(Y2)
coeffmat = np.zeros((df1.shape[1], df2.shape[1]))
pvalmat = np.zeros((df1.shape[1], df2.shape[1]))
for i in range(df1.shape[1]):
for j in range(df2.shape[1]):
corrtest = pearsonr(df1[df1.columns[i]], df2[df2.columns[j]])
coeffmat[i,j] = corrtest[0]
pvalmat[i,j] = corrtest[1]
dfcoeff = pd.DataFrame(coeffmat, columns=df2.columns, index=df1.columns)
print(dfcoeff)
dfpvals = pd.DataFrame(pvalmat, columns=df2.columns, index=df1.columns)
print(dfpvals)