在 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变换 《回归分析与线性统计模型》page100
R语言构建回归模型诊断(正态性无效)进行变量变换使用car包中的powerTransform函数对目标变量进行Box-Cox变换(Box–Cox transform to normality)