【问题标题】:Statsmodels fit distribution among 0 and 1Statsmodels 拟合 0 和 1 之间的分布
【发布时间】:2017-01-18 15:37:03
【问题描述】:

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

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

我错过了什么吗?

【问题讨论】:

  • beta 来自 scipy.stats 吗?你应该指定你正在使用哪个包。
  • 如果是scipy,则修复loc和scale,即ps1 = beta.fit(selected, floc=0, fscale=1)

标签: python numpy statistics statsmodels


【解决方案1】:

所以:

  • 你知道分布有 a=0 和 b=1 上下界,
  • 但样本不包含任何接近这些限制的值。

如果分布确实是 Beta 分布,并且 alpha 和 beta 参数使得 0 和 1 附近的密度为零,则可能会发生这种情况。

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

使用 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)

使用我模拟的样本。

【讨论】:

  • 哇,非常感谢您的建议。我问这个问题已经有几年了,但巧合的是,我现在正在处理同样的问题,我会给你的解决方案一个旋转。
【解决方案2】:

我想出了一个对我有用的部分解决方案:我复制我的样本(对于太小的数据集)并在 0 和 1 处添加虚拟样本。虽然这会增加拟合误差,但它足够低为了我的目的。 此外,我在 Google 群组中询问并得到 this answer 工作正常,但它偶尔会给我一些错误。我希望这可以帮助任何人解决这个问题。

【讨论】:

  • 样本加0加1的解与你所知道的分布一致,但与数据不一致。由于数据仅位于 [0, 1] 区间的子范围内,因此具有 0 和 1 限制的 Beta 的可能性通常应该非常低。因此,这对我来说听起来不是一个真正的解决方案。
猜你喜欢
  • 1970-01-01
  • 2016-04-17
  • 2014-08-18
  • 2017-06-11
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 2014-08-30
相关资源
最近更新 更多