两个矩阵之间所有对的p值以实现matlab的corr函数

问题描述 投票:0回答:1

我一直在尝试用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),但正如我所说,我根本不确定。

python numpy matlab statistics
1个回答
0
投票

我认为最简单的方法是在 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)
© www.soinside.com 2019 - 2024. All rights reserved.