我将尝试计算相关矩阵,并根据p值过滤相关性,以找出高度相关的对。
挑战在于计算 p-value,我没有找到内置的方法来做这个。然而,从pandas columns correlation with statistical significance中,@BKay提供了一种循环计算 p-value 的方法。如果少于3个重叠,这种方法会报错。因此,我进行了一些修改,添加了错误异常处理。
为了解释我的意思,假设我有一个像这样的数据框。
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值矩阵?