【问题标题】:How to get the multiple lambda value in box-cox transformation?如何在 box-cox 变换中获得多个 lambda 值?
【发布时间】:2020-11-21 07:50:21
【问题描述】:

我正在尝试使用下面提到的代码获取 lambda 值,但是在进行逆变换时,由于 lambda 的负值,我们得到的转换后的值太高。如何获得正 lambda 值或倍数? python from scipy.stats import boxcox from scipy.special import inv_boxcox y =[90,20,30,40,50] y,fitted_lambda= boxcox(y,lmbda=None) fitted_lambda 输出:-0.24598892144685428

在这里,我希望 lambda 值为正,或者如果我有 lambda 值列表来选择最佳值。

【问题讨论】:

    标签: python scipy statistics


    【解决方案1】:

    首先,声明“我希望 lambda 值为正”完全没有意义; Box-Cox 变换是一个定义明确的数学运算,它会返回什么并不取决于我们想要或喜欢什么。

    第二,根据documentation

    如果 lmbda 为 None,则找到最大化对数似然函数的 lambda,并将其作为第二个输出参数返回。

    因此,也不是任何 list 返回值 - 仅返回 单个(最佳)值。

    第三,Box-Cox 不是灵丹妙药;很可能是数据的结果转换不适合您的情况(正如您在此处暗示的那样)。

    现在,果然还是照SciPy documentation

    Box-Cox 变换由下式给出:

    y = (x**lmbda - 1) / lmbda,  for lmbda > 0
        log(x),                  for lmbda = 0
    

    似乎永远不会期望lmbda 为负数;这是一个谜,但很可能只是特定 SciPy 文档页面中的一个错误,它应该是 lmbda != 0 而不是 lmbda > 0 [UPDATE:确实如此,见下面的 cmets]。

    对此的证实:

    最后,在 R 中重现您的实验很简单,以交叉检查您返回的结果:

    library(forecast)
    data = c(90,20,30,40,50) # your data
    lmbda = BoxCox.lambda(data,method="loglik")
    lmbda
    # result:
    [1] -0.25
    

    在所使用的数值精度范围内,它实际上与您报告的 -0.24598892144685428fitted_lambda 值相同(known fact 此处 forecast R 包的数值精度较低比 SciPy 的)。

    总而言之,这里似乎没有任何真正的问题(编码问题或其他问题)需要解决,只是 Box-Cox 转换可能不适合/不适合您的情况。

    【讨论】:

    • 你是对的:lmbda > 0 行是boxcox 文档字符串中的错误。这应该很快就会解决。
    • 使用单个字符修复的拉取请求:github.com/scipy/scipy/pull/12650
    • @WarrenWeckesser 很酷 - 你为我节省了打开问题的时间 :)
    猜你喜欢
    • 2011-08-27
    • 2014-12-24
    • 2015-07-13
    • 1970-01-01
    • 2014-12-11
    • 2016-03-04
    • 2015-09-29
    • 2019-12-25
    • 1970-01-01
    相关资源
    最近更新 更多