重み付き共分散の計算をサポートするPython統計パッケージはありますか(つまり、各観測値には重みがあります)?残念ながら、numpy.covはウェイトをサポートしていません。
できれば、numpy / scipyフレームワークの下で作業する(つまり、numpy配列を使用して計算を高速化できる)。
どうもありがとう!
重み付き共分散の計算をサポートするPython統計パッケージはありますか(つまり、各観測値には重みがあります)?残念ながら、numpy.covはウェイトをサポートしていません。
できれば、numpy / scipyフレームワークの下で作業する(つまり、numpy配列を使用して計算を高速化できる)。
どうもありがとう!
statsmodelsは、で共分散計算を重み付けしていstats
ます。
ただし、直接計算することもできます。
# -*- coding: utf-8 -*-
"""descriptive statistic with case weights
Author: Josef Perktold
"""
import numpy as np
from statsmodels.stats.weightstats import DescrStatsW
np.random.seed(987467)
x = np.random.multivariate_normal([0, 1.], [[1., 0.5], [0.5, 1]], size=20)
weights = np.random.randint(1, 4, size=20)
xlong = np.repeat(x, weights, axis=0)
ds = DescrStatsW(x, weights=weights)
print 'cov statsmodels'
print ds.cov
self = ds #alias to use copied expression
ds_cov = np.dot(self.weights * self.demeaned.T, self.demeaned) / self.sum_weights
print '\nddof=0'
print ds_cov
print np.cov(xlong.T, bias=1)
# calculating it directly
ds_cov0 = np.dot(self.weights * self.demeaned.T, self.demeaned) / \
(self.sum_weights - 1)
print '\nddof=1'
print ds_cov0
print np.cov(xlong.T, bias=0)
これは印刷します:
cov statsmodels
[[ 0.43671986 0.06551506]
[ 0.06551506 0.66281218]]
ddof=0
[[ 0.43671986 0.06551506]
[ 0.06551506 0.66281218]]
[[ 0.43671986 0.06551506]
[ 0.06551506 0.66281218]]
ddof=1
[[ 0.44821249 0.06723914]
[ 0.06723914 0.68025461]]
[[ 0.44821249 0.06723914]
[ 0.06723914 0.68025461]]
エディトリアルノート
最初の回答は、その間に修正されたstatsmodelsのバグを指摘しました。
バージョン1.10以降、 numpy.covは「aweights」引数を使用した加重共分散計算をサポートしています。