简介:我有一个超过30 000个值的列表,范围从0到47,例如[0,0,0,0,...,1,1,1,1,...,2,2,2,2, ......,47等]是连续分布 .
问题:基于我的分布,我想计算任何给定值的p值(看到更大值的概率) . 例如,正如您所见,0的p值接近1,较高的数值的p值趋于0 .
我不知道我是否正确,但是为了确定概率,我认为我需要将我的数据拟合到最适合描述我的数据的理论分布 . 我认为需要某种拟合优度测试来确定最佳模型 .
有没有办法在Python中实现这样的分析(Scipy或Numpy)?你能举个例子吗?
谢谢!
6 回答
具有平方误差和(SSE)的分布拟合
这是对Saullo's answer的更新和修改,它使用当前scipy.stats distributions的完整列表,并返回分布's histogram and the data'直方图之间的分布最少的SSE .
示例配件
使用El Niño dataset from statsmodels,分布是合适的并且确定错误 . 返回具有最小错误的分布 .
所有发行版
最佳配送
示例代码
有82 implemented distribution functions in SciPy 0.12.0 . 您可以使用fit() method测试其中一些数据是如何适合您的数据的 . 请查看以下代码了解更多详情:
参考文献:
- Fitting distributions, goodness of fit, p-value. Is it possible to do this with Scipy (Python)?
- Distribution fitting with Scipy
这里有一个列表,其中包含Scipy 0.12.0(VI)中可用的所有分布函数的名称:
@Saullo Castro提到的
fit()
方法提供了最大似然估计(MLE) . 数据的最佳分布是给出最高的分布,可以通过几种不同的方式确定:例如1,给你最高对数可能性的那个 .
2,给你最小的AIC,BIC或BICc值的那个(参见wiki:http://en.wikipedia.org/wiki/Akaike_information_criterion,基本上可以看作是参数数量调整的对数似然,因为预计更多参数的分布更合适)
3,最大化贝叶斯后验概率的那个 . (见维基:http://en.wikipedia.org/wiki/Posterior_probability)
当然,如果您已经有一个应该描述数据的分布(基于您特定领域的理论)并且想要坚持这一点,那么您将跳过识别最佳拟合分布的步骤 .
scipy
没有计算对数似然的函数(虽然提供了MLE方法),但硬代码很容易:参见Is the build-in probability density functions ofscipy.stat.distributions
slower than a user provided one?AFAICU,您的发行版是离散的(除了离散之外) . 因此,只计算不同值的频率并将其标准化应足以满足您的需要 . 所以,举一个例子来证明这一点:
因此,看到高于
1
的值的概率很简单(根据complementary cumulative distribution function (ccdf):请注意ccdf与survival function (sf)密切相关,但它也使用离散分布定义,而sf仅针对连续分布定义 .
这听起来像是概率密度估计问题 .
另见http://jpktd.blogspot.com/2009/03/using-gaussian-kernel-density.html .
如果我不理解您的需要,请原谅我,但是如何将数据存储在字典中,其中键是0到47之间的数字,并且值是原始列表中相关键的出现次数?
因此,您的似然p(x)将是大于x的键除以30000的所有值的总和 .