Python Statsmodels拟合0和1之间的分布

Python Statsmodels拟合0和1之间的分布,python,numpy,statistics,statsmodels,Python,Numpy,Statistics,Statsmodels,我正在尝试拟合一个beta分布,该分布应该在一个只有子范围内的样本的数据集上定义在0和1之间。我的问题是,使用fit()函数将导致仅在我的最小值和最大值之间定义拟合的PDF。 例如,如果我的数据集的样本数介于0.2和0.3之间,我得到的是一个定义在0.2和0.3之间的PDF,而不是应该在0和1之间的PDF。我使用的代码是: ps1 = beta.fit(selected, loc=0, scale=1) 我遗漏了什么吗?我想出了一个部分解决方案,可以解决这个问题:我复制我的样本(对于太小的数据

我正在尝试拟合一个beta分布,该分布应该在一个只有子范围内的样本的数据集上定义在0和1之间。我的问题是,使用
fit()
函数将导致仅在我的最小值和最大值之间定义拟合的PDF。 例如,如果我的数据集的样本数介于0.2和0.3之间,我得到的是一个定义在0.2和0.3之间的PDF,而不是应该在0和1之间的PDF。我使用的代码是:

ps1 = beta.fit(selected, loc=0, scale=1)

我遗漏了什么吗?

我想出了一个部分解决方案,可以解决这个问题:我复制我的样本(对于太小的数据集),并在0和1处添加虚拟样本。虽然这会增加拟合误差,但对于我的目的来说,它已经足够低了。 另外,我在谷歌小组中询问,结果发现效果很好,但它偶尔会给我一些错误。我希望这能帮助任何人解决这个问题

所以:

  • 你知道分布有a=0和b=1的上下限
  • 但样本中不包含任何接近这些限值的值
如果分布确实是β分布,并且α和β参数为0和1附近的密度为零,则可能发生这种情况

在这种情况下,我建议使用最大似然法,将活动参数限制为alpha和beta,使用已知的a和b参数

import openturns as ot
distribution = ot.Beta(3.0, 2.0, 0.0, 1.0)
sampleSize = 100
sample = distribution.getSample(sampleSize)
使用OpenTURNS的
MaximumLikelihoodFactory
类可以轻松实现这一点,该类具有
setKnownParameter
方法。该方法允许限制通过最大似然法优化的参数

为了重现这种情况,我使用以下参数创建了一个Beta发行版

import openturns as ot
distribution = ot.Beta(3.0, 2.0, 0.0, 1.0)
sampleSize = 100
sample = distribution.getSample(sampleSize)
用已知的a和b参数拟合Beta分布很简单

factory = ot.MaximumLikelihoodFactory(distribution)
factory.setKnownParameter([0.0, 1.0], [2, 3])
inf_distribution = factory.build(sample)
列表
[0.0,1.0]
包含a和b参数的值,索引
[2,3]
是Beta分布中参数的索引。 这将产生:

Beta(alpha = 3.02572, beta = 1.88172, a = 0, b = 1)

对于我模拟的样本。

向样本中添加0和1的解决方案与您所知道的分布一致,但与数据不一致。由于数据仅在[0,1]区间的子范围内,因此具有0和1限值的贝塔值在一般情况下应非常低。因此,对我来说,这听起来不是一个真正的解决方案。
beta
来自scipy.stats吗?您应该指定您正在使用的软件包。如果是scipy,则修复loc和scale,即
ps1=beta.fit(选中,floc=0,fscale=1)
Wow,非常感谢您的建议。我问这个问题已经有几年了,但巧合的是,我现在正在研究同一个问题,我会给你一个解决方案。