如何在Python中计算非高斯分布的中位数及其68%置信区间?

4
我有一个数据集,它是一个numpy数组,例如a=[a1,a2,.....],还有数据的权重w=[w1,w2,w3...]。我使用numpy直方图包计算了直方图,得到了hist数组。现在我想计算这个概率分布函数的中位数和中位数周围68%的轮廓线。请记住,我的数据集不是高斯分布。有人能帮忙吗?我正在使用Python。

1
看看这个问题 - sascha
1
只是确认一下,对于您的数据集,w1表示a1的可能性有多大,以此类推? - Ulrich Stern
1
如果权重表示值的可能性,那么你并没有一个“样本”,而是对于总体(在这种情况下是离散随机变量)的描述,因此自助法不是正确的方法。关于置信区间,计算并不困难,但仅仅使用“numpy.percentile”似乎不太对。稍后会发布答案。 - Ulrich Stern
@UlrichStern 我所做的是先计算加权中位数,然后将我的数据数组分成围绕中位数的两部分,这就是中位数的定义。然后我使用numpy百分位数计算了中位数两侧的34%。我将与您发布的答案进行比较。 - Arpan Das
1
手动计算68%置信区间应按以下方式进行:创建(ai, wi)对并按ai排序。然后,从中位数开始,在每个方向上以sum(wi)的34%前进。这将是维基百科上加权中位数计算到置信区间的扩展。需要考虑边缘情况/值(请注意,例如维基百科有两种中位数情况),因此我很高兴scipy.stats有置信区间计算。 :) - Ulrich Stern
显示剩余4条评论
1个回答

7

这里提供一种使用scipy.stats.rv_discrete的解决方案:

from __future__ import division, print_function
import numpy as np, scipy.stats as st

# example data set
a = np.arange(20)
w = a + 1

# create custom discrete random variable from data set
rv = st.rv_discrete(values=(a, w/w.sum()))

# scipy.stats.rv_discrete has methods for median, confidence interval, etc.
print("median:", rv.median())
print("68% CI:", rv.interval(0.68))

输出反映了示例数据集中不均匀的权重:

median: 13.0
68% CI: (7.0, 18.0)

非常感谢。这真的很有用,而且更加干净地完成了我需要做的事情。 - Arpan Das

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接