在R中寻找Box-Cox变换的最优Lambda

时间:2014-10-28 20:11:26

标签: r optimization normalization

我正在尝试在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)

所以也许我会在某个门槛下找到一个值。这段代码显然会产生错误。

2 个答案:

答案 0 :(得分:13)

请注意,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])

我认为这个功能最重要的部分并不是它找到了最好的&#34; lambda,但它找到了lambda的置信区间,然后鼓励你思考不同的变换意味着什么,并将其与数据背后的科学相结合。如果&#34;最好&#34;你的数据的lambda是0.41,但是间隔包含0.5并且有科学推理为什么平方根变换有意义,那么为什么使用0.41而不是0.5?

答案 1 :(得分:11)

要在矢量上应用box cox变换,请使用r:

中的预测包
library(forecast)
# to find optimal lambda
lambda = BoxCox.lambda( vector )
# now to transform vector
trans.vector = BoxCox( vector, lambda)