Box和Cox(1964)提出了一系列变换,旨在减少线性模型中误差的非正态性。这样做通常也会减少非线性。
这里有一份原始工作及其后续工作的简要概述:http://www.ime.usp.br/~abe/lista/pdfm9cJKUmFZp.pdf
但是您会注意到,控制lambda幂变换选择的对数似然函数依赖于基础模型的残差平方和(SO上没有LaTeX--请参见参考文献),因此不能在没有模型的情况下应用任何变换。
典型的应用如下:
library(MASS)
set.seed(1)
n <- 100
x <- runif(n, 1, 5)
y <- x^3 + rnorm(n)
m <- lm(y ~ x)
bc <- boxcox(y ~ x)
![enter image description here](https://istack.dev59.com/X7Jjh.webp)
(lambda <- bc$x[which.max(bc$y)])
[1] 0.4242424
powerTransform <- function(y, lambda1, lambda2 = NULL, method = "boxcox") {
boxcoxTrans <- function(x, lam1, lam2 = NULL) {
lam2 <- ifelse(is.null(lam2), 0, lam2)
if (lam1 == 0L) {
log(y + lam2)
} else {
(((y + lam2)^lam1) - 1) / lam1
}
}
switch(method
, boxcox = boxcoxTrans(y, lambda1, lambda2)
, tukey = y^lambda1
)
}
mnew <- lm(powerTransform(y, lambda) ~ x)
op <- par(pty = "s", mfrow = c(1, 2))
qqnorm(m$residuals); qqline(m$residuals)
qqnorm(mnew$residuals); qqline(mnew$residuals)
par(op)
![在此输入图片描述](https://istack.dev59.com/w4Uz2.webp)
正如您所看到的,这不是万能解决方案——只有一些数据可以有效地转换(通常λ小于-2或大于2是不应使用该方法的信号)。与任何统计方法一样,在实施之前请谨慎使用。
要使用两个参数的Box-Cox变换,请使用geoR
包找到λ值:
library("geoR")
bc2 <- boxcoxfit(x, y, lambda2 = TRUE)
lambda1 <- bc2$lambda[1]
lambda2 <- bc2$lambda[2]
修改:根据@Yui-Shiuan指出的,Tukey和Box-Cox实现的混淆已经修复。