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

Posted

技术标签:

【中文标题】在 R 中寻找 Box-Cox 变换的最佳 Lambda【英文标题】:Finding Optimal Lambda for Box-Cox Transform in R 【发布时间】: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)

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

【问题讨论】:

【参考方案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)

【讨论】:

嗨,你知道R中BoxCox.lambda的手动公式吗?我想通过手动计算得到 lambda。谢谢 嗨,@Shieryn,BoxCox.lambda 的代码位于以下源文件 github.com/robjhyndman/forecast/blob/master/R/guerrero.R 的底部

以上是关于在 R 中寻找 Box-Cox 变换的最佳 Lambda的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中使用 Box-Cox 幂变换

R box-cox变换 《回归分析与线性统计模型》page100

R语言构建回归模型诊断(正态性无效)进行变量变换使用car包中的powerTransform函数对目标变量进行Box-Cox变换(Box–Cox transform to normality)

Box-Cox变换

机器学习基础 - 偏度正态化以及 Box-Cox 变换

结构化数据转换(Box-Cox)