2016-07-28 10 views
3

パンダと加重相関係数を計算する方法はありますか?私はRにそのような方法があることを見ました。 また、相関のp値を取得したいと思います。これは私もRで見つけられませんでした 重み付き相関の説明については、Wikipediaにリンクしてください:https://en.wikipedia.org/wiki/Pearson_product-moment_correlation_coefficient#Weighted_correlation_coefficientパンダとの加重相関係数

答えて

5

これを実装するPythonパッケージはわかりませんが、独自の実装をロールするのはかなり簡単です。 Wikipediaの記事の命名規則を使用して:

def m(x, w): 
    """Weighted Mean""" 
    return np.sum(x * w)/np.sum(w) 

def cov(x, y, w): 
    """Weighted Covariance""" 
    return np.sum(w * (x - m(x, w)) * (y - m(y, w)))/np.sum(w) 

def corr(x, y, w): 
    """Weighted Correlation""" 
    return cov(x, y, w)/np.sqrt(cov(x, x, w) * cov(y, y, w)) 

私はできるだけ密接に一致上記の関数を作るためにウィキペディアで数式を試してみましたが、いくつかの潜在的な単純化とパフォーマンスの改善があります。たとえば、@Alberto Garcia-Rabosoが指摘しているように、m(x, w)は実際にはnp.average(x, weights=w)なので、実際には関数を書く必要はありません。

この関数は、計算を行うだけでかなり裸である。計算を行う前に、入力を配列にすることを検討することをお勧めします。たとえば、x = np.asarray(x)は、リストが渡された場合にこれらの関数が機能しないためです。同じ長さ、非ヌル値などを持つすべての入力を検証するための追加チェックも実装できます。

使用例:

# Initialize a DataFrame. 
np.random.seed([3,1415]) 
n = 10**6 
df = pd.DataFrame({ 
    'x': np.random.choice(3, size=n), 
    'y': np.random.choice(4, size=n), 
    'w': np.random.random(size=n) 
    }) 

# Compute the correlation. 
r = corr(df['x'], df['y'], df['w']) 

p値についての議論hereがあります。ジェネリック計算のようには見えず、実際にウェイトをどのようにしているかによって異なります。

+1

'np.average'は' mights(x、w) 'を' np.average(x、weights = w) 'として定義できるように' weights'引数を受け入れます。 –

+0

@ AlbertoGarcia-Raboso:ありがとう、私はそれについての発言を追加しました。一貫性のために、リンクされたウィキペディアの記事の数式にできるだけ近い形で一致するようにコードをそのまま残しました。 – root

関連する問題