statsmodels.sandbox.distributions.transformed.LogTransf_gen.fit

LogTransf_gen.fit(data, *args, **kwds)

返回从数据中估计的形状(如适用)、位置和尺度参数。默认的估计方法是最大似然估计(MLE),但也可以使用矩法(MM)。

拟合的起始估计值由输入参数给出;对于未提供起始估计值的任何参数,将调用 self._fitstart(data) 来生成这些估计值。

可以通过传递关键字参数 f0, f1, …, fn(用于形状参数) 和 flocfscale(分别用于位置和尺度参数)来将一些参数固定为特定值。

Parameters:
dataarray_like or CensoredData instance

用于估计分布参数的数据。

arg1, arg2, arg3,…floats, optional

任何形状特征参数的初始值(未提供的参数将通过调用 _fitstart(data) 来确定)。 无默认值。

**kwdsfloats, optional
  • loc: 分布位置参数的初始猜测。

  • scale: 分布的尺度参数的初始猜测。

特殊的关键字参数被识别为固定某些参数:

  • f0…fn : 保持各自的形状参数固定。 或者,可以通过名称指定要固定的形状参数。 例如,如果 self.shapes == "a, b"fafix_a 等同于 f0,而 fbfix_b 等同于 f1

  • floc : 将位置参数固定为指定值。

  • fscale : 固定比例参数为指定值。

  • 优化器:要使用的优化器。优化器必须将func和起始位置作为前两个参数, 加上args(用于传递给要优化的函数的额外参数)和dispfit方法调用优化器时使用disp=0来抑制输出。 优化器必须返回估计的参数。

  • 方法 : 使用的方法。默认是“MLE”(最大似然估计);“MM”(矩法)也是可用的。

Returns:
parameter_tupletuple of floats

任何形状参数(如适用)的估计值,随后是位置和尺度的估计值。对于大多数随机变量,将返回形状统计量,但也有例外(例如 norm)。

Raises:
TypeError, ValueError

如果输入无效

~scipy.stats.FitError

如果拟合失败或生成的拟合结果无效

注释

使用 method="MLE"(默认),拟合是通过最小化负对数似然函数来计算的。对于超出分布支持范围的观测值,会应用一个大的有限惩罚(而不是无限负对数似然)。

使用 method="MM",拟合是通过最小化前 k 个原始(接近零)数据矩与相应分布矩之间的相对误差的 L2 范数来计算的,其中 k 是非固定参数的数量。 更准确地说,目标函数是:

(((data_moments - dist_moments)
  / np.maximum(np.abs(data_moments), 1e-8))**2).sum()

其中常数 1e-8 避免了在数据矩消失的情况下除以零。通常,这个误差范数可以减少到零。 请注意,标准矩方法可能会产生一些数据超出拟合分布支持范围的参数;此实现不会对此进行任何预防。

对于任一方法, 返回的答案不能保证是全局最优的;它 可能只是局部最优的,或者优化可能完全失败。 如果数据包含任何 np.nannp.inf-np.inffit 方法将引发 RuntimeError

当将一个CensoredData实例传递给data时,对数似然函数定义为:

\[\begin{split}l(\pmb{\theta}; k) & = \sum \log(f(k_u; \pmb{\theta})) + \sum \log(F(k_l; \pmb{\theta})) \\ & + \sum \log(1 - F(k_r; \pmb{\theta})) \\ & + \sum \log(F(k_{\text{high}, i}; \pmb{\theta}) - F(k_{\text{low}, i}; \pmb{\theta}))\end{split}\]

其中 \(f\)\(F\) 分别是拟合函数的概率密度函数和累积分布函数,\(\pmb{\theta}\) 是参数向量,\(u\) 是未删失观测值的索引,\(l\) 是左删失观测值的索引,\(r\) 是右删失观测值的索引,下标“low”/“high”表示区间删失观测值的端点,\(i\) 是区间删失观测值的索引。

示例

生成一些数据以拟合:从beta分布中抽取随机变量

>>> import numpy as np
>>> from scipy.stats import beta
>>> a, b = 1., 2.
>>> rng = np.random.default_rng(172786373191770012695001057628748821561)
>>> x = beta.rvs(a, b, size=1000, random_state=rng)

现在我们可以拟合所有四个参数(ablocscale):

>>> a1, b1, loc1, scale1 = beta.fit(x)
>>> a1, b1, loc1, scale1
(1.0198945204435628, 1.9484708982737828, 4.372241314917588e-05, 0.9979078845964814)

拟合也可以使用自定义优化器来完成:

>>> from scipy.optimize import minimize
>>> def custom_optimizer(func, x0, args=(), disp=0):
...     res = minimize(func, x0, args, method="slsqp", options={"disp": disp})
...     if res.success:
...         return res.x
...     raise RuntimeError('optimization routine failed')
>>> a1, b1, loc1, scale1 = beta.fit(x, method="MLE", optimizer=custom_optimizer)
>>> a1, b1, loc1, scale1
(1.0198821087258905, 1.948484145914738, 4.3705304486881485e-05, 0.9979104663953395)

我们也可以利用一些关于数据集的先验知识:让我们保持locscale固定:

>>> a1, b1, loc1, scale1 = beta.fit(x, floc=0, fscale=1)
>>> loc1, scale1
(0, 1)

我们也可以通过使用f-关键词来保持形状参数固定。要使第零个形状参数a等于1,使用f0=1或者等效地,fa=1

>>> a1, b1, loc1, scale1 = beta.fit(x, fa=1, floc=0, fscale=1)
>>> a1
1

并非所有分布都会返回形状参数的估计值。例如,norm 只返回位置和尺度的估计值:

>>> from scipy.stats import norm
>>> x = norm.rvs(a, b, size=1000, random_state=123)
>>> loc1, scale1 = norm.fit(x)
>>> loc1, scale1
(0.92087172783841631, 2.0015750750324668)

Last update: Oct 16, 2024