如何高效地获取带有 NaN 值数据框的相关矩阵(包含 p 值)?

7
我将尝试计算相关矩阵,并根据p值过滤相关性,以找出高度相关的对。

为了解释我的意思,假设我有一个像这样的数据框。

df

    A       B       C       D
0   2       NaN     2       -2
1   NaN     1       1       1.1
2   1       NaN     NaN     3.2
3   -4      NaN     2       2
4   NaN     1       2.1     NaN
5   NaN     3       1       1
6   3       NaN     0       NaN

对于相关系数,我使用了pd.corr()方法。该方法可以处理包含NaN值的数据框,更重要的是,它容忍具有0重叠的一对列(列A和列B):

rho = df.corr()

       A          B            C           D
A   1.000000     NaN       -0.609994    0.041204
B   NaN          1.0       -0.500000    -1.000000
C   -0.609994    -0.5       1.000000    0.988871
D   0.041204     -1.0       0.988871    1.000000

挑战在于计算 p-value,我没有找到内置的方法来做这个。然而,从pandas columns correlation with statistical significance中,@BKay提供了一种循环计算 p-value 的方法。如果少于3个重叠,这种方法会报错。因此,我进行了一些修改,添加了错误异常处理。

ValueError: 长度为零的数组执行最大操作,而没有身份标识

pval = rho.copy()
for i in range(df.shape[1]): # rows are the number of rows in the matrix.
    for j in range(df.shape[1]):
        try:
            df_ols = pd.ols(y=df.iloc[:,i], x=df.iloc[:,j], intercept=True)
            pval.iloc[i,j]  = df_ols.f_stat['p-value']
        except ValueError:
            pval.iloc[i,j]  = None

pval
        A        B            C           D
A   0.000000    NaN         0.582343    0.973761
B   NaN         0.000000    0.666667    NaN
C   0.582343    0.666667    0.000000    0.011129
D   0.973761    NaN         0.011129    0.000000

这个方法输出一个p值矩阵,但是当原始数据框的大小增加时(我的真实数据框约为5000行x500列),它会变得非常缓慢。你有什么建议可以高效地获得大型数据框的p值矩阵?


我猜这个方法最终证明是一个好方法。在谷歌上搜索后,我没有找到更好的解决方案。 - ju.
2个回答

3

这个问题最终得到了一个好的解决方案。


1

看起来Pandas不再支持OLS,所以我通过稍微修改的版本进行了传递,应该能够得到相同的结果:

# Use this package for OLS
import statsmodels.formula.api as sm

pval = rho.copy()

for i in range(df.shape[1]): # rows are the number of rows in the matrix.
    for j in range(df.shape[1]):
        try:
            y = df.columns[i]
            x = df.columns[j]
            df_ols = sm.ols(formula = 'Q("{}") ~ Q("{}")'.format(y,x), data = df).fit()
            pval.iloc[i,j]  = df_ols.pvalues[1]
        except ValueError:
            pval.iloc[i,j]  = None

pval
sns.heatmap(pval,
            center = 0,
            cmap="Blues",
            annot = True)

plt.show()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接