boxcox#
- scipy.stats.boxcox(x, lmbda=None, alpha=None, optimizer=None)[源代码][源代码]#
返回通过Box-Cox幂变换转换的数据集。
- 参数:
- xndarray
要转换的输入数组。
如果 lmbda 不是 None,这是
scipy.special.boxcox
的别名。如果x < 0
则返回 nan;如果x == 0 且 lmbda < 0
则返回 -inf。如果 lmbda 是 None,数组必须为正数、一维且非恒定。
- lmbda标量,可选
如果 lmbda 为 None(默认),找到使对数似然函数最大化的 lmbda 值,并将其作为第二个输出参数返回。
如果 lmbda 不是 None,则对该值进行转换。
- alphafloat, 可选
如果 lmbda 为 None 且
alpha
不为 None(默认),则返回 lmbda 的100 * (1-alpha)%
置信区间作为第三个输出参数。必须在 0.0 和 1.0 之间。如果 lmbda 不是 None,
alpha
将被忽略。- 优化器, 可选可调用,可选
如果 lmbda 为 None,optimizer 是用于找到使负对数似然函数最小化的 lmbda 值的标量优化器。optimizer 是一个可调用对象,接受一个参数:
- 乐趣可调用
目标函数,在给定的 lmbda 值处评估负对数似然函数
并返回一个对象,例如
scipy.optimize.OptimizeResult
的实例,该对象在属性 x 中保存了 lmbda 的最优值。更多信息请参见
boxcox_normmax
中的示例或scipy.optimize.minimize_scalar
的文档。如果 lmbda 不是 None,则 optimizer 将被忽略。
- 返回:
注释
Box-Cox 变换由以下公式给出:
y = (x**lmbda - 1) / lmbda, for lmbda != 0 log(x), for lmbda = 0
boxcox
要求输入数据为正。有时,Box-Cox 变换提供了一个偏移参数来实现这一点;boxcox
则不提供。这种偏移参数相当于在调用boxcox
之前给 x 加上一个正的常数。当提供
alpha
时返回的置信限给出了以下区间:\[llf(\hat{\lambda}) - llf(\lambda) < \frac{1}{2}\chi^2(1 - \alpha, 1),\]使用
llf
作为对数似然函数,以及 \(\chi^2\) 作为卡方函数。参考文献
G.E.P. Box 和 D.R. Cox,“转换分析”,《皇家统计学会杂志 B 辑》,26,211-252(1964)。
示例
>>> from scipy import stats >>> import matplotlib.pyplot as plt
我们从非正态分布中生成一些随机变量,并为其制作概率图,以显示其在尾部是非正态的:
>>> fig = plt.figure() >>> ax1 = fig.add_subplot(211) >>> x = stats.loggamma.rvs(5, size=500) + 5 >>> prob = stats.probplot(x, dist=stats.norm, plot=ax1) >>> ax1.set_xlabel('') >>> ax1.set_title('Probplot against normal distribution')
我们现在使用
boxcox
来转换数据,使其最接近正态分布:>>> ax2 = fig.add_subplot(212) >>> xt, _ = stats.boxcox(x) >>> prob = stats.probplot(xt, dist=stats.norm, plot=ax2) >>> ax2.set_title('Probplot after Box-Cox transformation')
>>> plt.show()