scipy.stats.

boxcox_llf#

scipy.stats.boxcox_llf(lmb, data, *, axis=0, keepdims=False, nan_policy='propagate')[source]#

boxcox 对数似然函数。

参数:
lmb标量

Box-Cox 变换的参数。 详细信息请参阅 boxcox

data类数组

用于计算 Box-Cox 对数似然的数据。 如果 data 是多维的,则沿第一个轴计算对数似然。

axisint,默认值:0

如果为 int,则为沿其计算统计信息的输入的轴。 输入的每个轴切片(例如,行)的统计信息将出现在输出的相应元素中。 如果 None,则将在计算统计信息之前将输入展平。

nan_policy{‘propagate’, ‘omit’, ‘raise’

定义如何处理输入 NaN。

  • propagate:如果在计算统计信息的轴切片(例如,行)中存在 NaN,则输出的相应条目将为 NaN。

  • omit:在执行计算时将忽略 NaN。 如果在计算统计信息的轴切片中剩余的数据不足,则输出的相应条目将为 NaN。

  • raise:如果存在 NaN,将引发 ValueError

keepdimsbool,默认值:False

如果设置为 True,则会将缩小的轴作为大小为 1 的维度留在结果中。 使用此选项,结果将针对输入数组正确广播。

返回:
llffloat 或 ndarray

给定 lmbdata 的 Box-Cox 对数似然。 对于 1-D data 是浮点数,否则是数组。

注释

Box-Cox 对数似然函数 \(l\) 在这里定义为

\[l = (\lambda - 1) \sum_i^N \log(x_i) - \frac{N}{2} \log\left(\sum_i^N (y_i - \bar{y})^2 / N\right),\]

其中 \(N\) 是数据点 data 的数量,\(y\) 是 Box-Cox 转换后的输入数据。 这对应于原始数据 \(x\)轮廓对数似然,并删除了一些常数项。

示例

>>> import numpy as np
>>> from scipy import stats
>>> import matplotlib.pyplot as plt
>>> from mpl_toolkits.axes_grid1.inset_locator import inset_axes

生成一些随机变量,并为一系列 lmbda 值计算它们的 Box-Cox 对数似然值

>>> rng = np.random.default_rng()
>>> x = stats.loggamma.rvs(5, loc=10, size=1000, random_state=rng)
>>> lmbdas = np.linspace(-2, 10)
>>> llf = np.zeros(lmbdas.shape, dtype=float)
>>> for ii, lmbda in enumerate(lmbdas):
...     llf[ii] = stats.boxcox_llf(lmbda, x)

还可以使用 boxcox 找到最佳 lmbda 值

>>> x_most_normal, lmbda_optimal = stats.boxcox(x)

绘制对数似然作为 lmbda 的函数。 添加最佳 lmbda 作为一条水平线,以检查这是否真的是最佳值

>>> fig = plt.figure()
>>> ax = fig.add_subplot(111)
>>> ax.plot(lmbdas, llf, 'b.-')
>>> ax.axhline(stats.boxcox_llf(lmbda_optimal, x), color='r')
>>> ax.set_xlabel('lmbda parameter')
>>> ax.set_ylabel('Box-Cox log-likelihood')

现在添加一些概率图,以显示在对数似然最大化的地方,使用 boxcox 转换的数据看起来最接近正态

>>> locs = [3, 10, 4]  # 'lower left', 'center', 'lower right'
>>> for lmbda, loc in zip([-1, lmbda_optimal, 9], locs):
...     xt = stats.boxcox(x, lmbda=lmbda)
...     (osm, osr), (slope, intercept, r_sq) = stats.probplot(xt)
...     ax_inset = inset_axes(ax, width="20%", height="20%", loc=loc)
...     ax_inset.plot(osm, osr, 'c.', osm, slope*osm + intercept, 'k-')
...     ax_inset.set_xticklabels([])
...     ax_inset.set_yticklabels([])
...     ax_inset.set_title(r'$\lambda=%1.2f$' % lmbda)
>>> plt.show()
../../_images/scipy-stats-boxcox_llf-1.png