相関の行列を計算しようとしており、相関の高いものを見つけるためにp値に基づいて相関をフィルタリングしようとしています。NaN値を持つデータフレームの相関行列(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オーバーラップ(COL AおよびCOL 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値を計算することです。私はこれを行うための組み込みメソッドを見つけられませんでした。しかし、pandas columns correlation with statistical significanceから、@BKayはp値を計算するループを提供しました。このメソッドは、3つ未満のオーバーラップがある場合エラーを発生させます。私はエラー例外を追加することによっていくつかの変更を行いました。 (〜5000行×500列の私の本当のデータフレームである)
ValueError: zero-size array to reduction operation maximum which has no identity
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値の行列を出力しますが、元のデータフレームの増加の大きさはときに極端に遅くなります。大規模なデータフレームの場合、このp値マトリックスを効率的に取得するにはどうすればよいでしょうか。
私はこの方法が良い方法であると思います。 Googleで掘り下げた後、私はより良い解決策を見いだせなかった。 –