我正在尝试在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)
所以也许我会在某个门槛下找到一个值。这段代码显然会产生错误。
答案 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)