【问题标题】:Finding Optimal Lambda for Box-Cox Transform in R在 R 中寻找 Box-Cox 变换的最佳 Lambda
【发布时间】:2014-12-24 09:41:42
【问题描述】:

我正在尝试在 R 中转换向量中的数据。

这不适用于线性回归,因此我没有预测变量和响应关系。我只是使用一个模型,通过规范化我的数据来提高准确性。 (因此我不能使用 boxcox 函数,因为它只适用于线性模型)。

我要转换的数据是:

vect
 [1]  99.64  49.71 246.84  96.17  16.67 352.00 421.25  81.77 105.00  37.85

我看过这个post

不清楚正在做什么以及如何使用优化功能,但我确实设法修改了该功能以创建一个我想最小化的功能。

xskew <- function(data,par) {
abs(skewness((data^par-1)/par)) }

我想为 lambda 输入一系列值(可能介于 0.5 和 1 之间,跳跃为 0.01)并找出其中哪个值最小化了我的数据集的 xskew。

我曾尝试使用 optim 函数执行此操作,但没有运气,所以我认为这可能不是适合我的函数。 如何执行此计算?

编辑:我想要一些类似的东西:

 x <- seq(0.51,0.99,by=0.01)
 which(xskew(vect,x) < 0.05)

所以也许我会找到一个低于某个阈值的值。这段代码显然会产生错误。

【问题讨论】:

    标签: r optimization normalization


    【解决方案1】:

    请注意,y~1 在 R 中算作线性模型,因此您可以使用 MASS 中的 boxcox 函数:

    tmp <- exp(rnorm(10))
    out <- boxcox(lm(tmp~1))
    range(out$x[out$y > max(out$y)-qchisq(0.95,1)/2])
    

    我认为该函数最重要的部分不是找到“最佳” lambda,而是找到 lambda 的置信区间,然后鼓励您思考不同转换的含义并将其与数据背后的科学。如果您的数据的“最佳”lambda 是 0.41,但区间包含 0.5,并且有科学推理为什么平方根变换有意义,那么为什么使用 0.41 而不是 0.5?

    【讨论】:

    • 如何获得置信区间的极限数值?
    • @Michal,它们是使用似然比检验的概念构建的。本质上,限制是 x 值的 range 对应于最大值 chisq(0.95,1)/2 内的 y 值。请参阅上面的编辑。
    【解决方案2】:

    要对向量应用 box cox 变换,请使用 r 中的预测包:

    library(forecast)
    # to find optimal lambda
    lambda = BoxCox.lambda( vector )
    # now to transform vector
    trans.vector = BoxCox( vector, lambda)
    

    【讨论】:

    猜你喜欢
    • 2015-09-29
    • 2019-12-25
    • 1970-01-01
    • 2016-03-04
    • 2020-11-21
    • 2014-12-11
    • 2011-08-27
    • 2015-07-13
    • 1970-01-01
    相关资源
    最近更新 更多