2016-06-23 11 views
3

相関の行列を計算しようとしており、相関の高いものを見つけるために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値マトリックスを効率的に取得するにはどうすればよいでしょうか。

+0

私はこの方法が良い方法であると思います。 Googleで掘り下げた後、私はより良い解決策を見いだせなかった。 –

答えて

2

この質問は良い解決策であることが判明しました。

関連する問題