使用`scipy.stats.binned_statistic`标准化分箱值的标准偏差

时间:2018-02-26 21:20:15

标签: python statistics binning

当我将数据相应地分配到scipy.stats.binned_statisticsee here for example)时,如何获得平均分箱值的错误(即标准偏差)?

例如,如果我将数据分类如下:

windspeed = 8 * np.random.rand(500)
boatspeed = .3 * windspeed**.5 + .2 * np.random.rand(500)
bin_means, bin_edges, binnumber = stats.binned_statistic(windspeed,
             boatspeed, statistic='median', bins=[1,2,3,4,5,6,7])
plt.figure()
plt.plot(windspeed, boatspeed, 'b.', label='raw data')
plt.hlines(bin_means, bin_edges[:-1], bin_edges[1:], colors='g', lw=5,
        label='binned statistic of data')
plt.legend()

如何获得bin_means上的标准差?

2 个答案:

答案 0 :(得分:0)

解决这个问题的方法是从直方图构建概率密度估计(这只是对直方图进行适当标准化的问题),然后计算标准偏差或估计密度的任何其他统计量。

适当的归一化是使直方图下的面积为1所需的任何值。对于计算密度估计的统计数据,从统计量的定义起作为integral(p(x)*f(x), x, -infinity, +infinity),用{的密度估计值替换{ {1}}以及p(x)所需的任何内容,例如f(x)x获取第一和第二时刻,从中计算方差,然后计算标准差。

明天我会发布一些公式,或者也许其他人想在此期间尝试一下。你可能能够查找一些公式,但我的建议是在尝试查找之前总是试着找出答案。

答案 1 :(得分:0)

也许我回答得有点晚了,但是我想知道如何做同样的事情并遇到这个问题。我认为可以使用stats.binned_statistic_2d进行计算,但是我还没有弄清楚。到目前为止,我是手动计算的,就像这样(请注意,在我的代码中,我使用固定数量的等间距垃圾箱):

windspeed = 8 * numpy.random.rand(500)
boatspeed = .3 * windspeed**.5 + .2 * numpy.random.rand(500)
bin_means, bin_edges, binnumber = stats.binned_statistic(windspeed,
         boatspeed, statistic='median', bins=10)

stds = []

# Match each value to the bin number it belongs to
pairs = zip(boatspeed, binnumber)

# Calculate stdev for all elements inside each bin
for n in list(set(binnumber)):  # Iterate over each bin
    in_bin = [x for x, nbin in pairs if nbin == n]  # Get all elements inside bin n
    stds.append(numpy.std(in_bin))

# Calculate the locations of the bins' centers, for plotting
bin_centers = []

for i in range(len(bin_edges) -  1):
    center = bin_edges[i] + (float(bin_edges[i + 1]) - float(bin_edges[i]))/2.
    bin_centers.append(center)

# Plot means
pyplot.figure()
pyplot.hlines(bin_means, bin_edges[:-1], bin_edges[1:], colors='g', lw=5,
    label='binned statistic of data')

# Plot stdev as vertical lines, probably can also be done with errorbar
pyplot.vlines(bin_centers, bin_means - stds, bin_means + stds)

pyplot.legend()
pyplot.show()

结果图(减去数据点): enter image description here

您必须小心使用垃圾箱。在我正在使用的代码中,其中一个垃圾箱没有要点,因此我必须相应地调整对stdev的计算。