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

Mic*_*hal 7 optimization r 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
Run Code Online (Sandbox Code Playgroud)

我看过这篇文章.

目前还不清楚正在做什么以及如何使用优化功能但是我确实设法修改了函数以创建一个我想最小化的函数.

xskew <- function(data,par) {
abs(skewness((data^par-1)/par)) }
Run Code Online (Sandbox Code Playgroud)

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

我试过用optim函数做这个,但没有运气,所以我不认为这对我来说可能是正确的功能.我该如何进行此计算?

编辑:我想要的是:

 x <- seq(0.51,0.99,by=0.01)
 which(xskew(vect,x) < 0.05)
Run Code Online (Sandbox Code Playgroud)

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

Gre*_*now 13

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

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

我认为该函数最重要的部分并不是找到一个"最好的"lambda,而是找到lambda的置信区间,然后鼓励你思考不同的转换意味着什么,并将其与后面的科学结合起来.数据.如果你的数据的"最佳"lambda是0.41,但是间隔包含0.5并且有科学推理为什么平方根变换有意义,那么为什么使用0.41而不是0.5?


The*_*eMI 11

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

library(forecast)
# to find optimal lambda
lambda = BoxCox.lambda( vector )
# now to transform vector
trans.vector = BoxCox( vector, lambda)
Run Code Online (Sandbox Code Playgroud)