是否有用于分箱数据的sci.stats.moment函数?

时间:2017-11-30 13:50:03

标签: python numpy scipy

我正在寻找计算第n个中心力矩的函数 (与scipy.stats.moment中的一个相同) 对于我的分档数据(在numpy.histogram函数之外)。

# Generate normal distributed data
import numpy as np
import matplotlib.pyplot as plt
data = np.random.normal(size=500,loc=1,scale=2)
H = np.histogram(data,bins=50) 
plt.scatter(H[1][:-1],H[0])
plt.show()

对于我的上面的代码示例,前四个时刻的结果应为(0,4,0,48),因为sigma = 2(对于中心时刻)。

1 个答案:

答案 0 :(得分:1)

使用分箱数据与使用加权数据基本相同。一个使用每个bin的中点作为数据点,并将该bin的计数作为其权重。如果scipy.stats.moment支持权重,我们可以直接进行此计算。按原样,使用支持权重的方法numpy.average

midpoints = 0.5 * (H[1][1:] + H[1][:-1])
ev = np.average(midpoints, weights = H[0])
print(ev)
for k in range(2, 5):
  print(np.average((midpoints - ev)**k, weights = H[0]))

输出(显然是随机的):

1.08242834443
4.21602099286
0.713129264647
51.6257736139

我没有打印居中的第1时刻(按构造为0),而是打印预期值。从理论上讲,这些是1,4,8,48,但对于任何给定的样本,都会有一些与分布参数的偏差。

(*)不完全正确。在方差公式中,我没有包括校正因子n/(n-1)(其中n是数据集的总大小,即权重之和)。该因子调整sample variance,因此它成为人口方差的无偏估计。如果你愿意,你可以加入它。高阶矩可能需要进行类似的调整(如果目标是使用无偏估计量),但我必须仔细研究,无论如何这不是统计站点。