con - transformacion box cox en r studio
Cómo utilizar la transformación de potencia de Box-Cox en R (2)
Necesito transformar algunos datos en una ''forma normal'' y leí que Box-Cox puede identificar el exponente a usar para transformar los datos.
Por lo que entendi
car::boxCoxVariable(y)
se usa para variables de respuesta en modelos lineales, y
MASS::boxcox(object)
para una fórmula u objeto modelo ajustado. Entonces, debido a que mis datos son la variable de un marco de datos, la única función que encontré que podría usar es:
car::powerTransform(dataframe$variable, family="bcPower")
¿Es eso correcto? ¿O me estoy perdiendo algo?
La segunda pregunta es sobre qué hacer después de obtener el
Estimated transformation parameters
dataframe$variable
0.6394806
¿Debería simplemente multiplicar la variable por este valor? Así lo hice:
aaa = 0.6394806
dataframe$variable2 = (dataframe$variable)*aaa
y luego ejecuto la prueba de shapiro-wilks para determinar la normalidad, pero una vez más, mis datos no parecen seguir una distribución normal:
shapiro.test(dataframe$variable2)
data: dataframe$variable2
W = 0.97508, p-value < 2.2e-16
Box y Cox (1964) sugirieron una familia de transformaciones diseñadas para reducir la no normalidad de los errores en un modelo lineal. Resulta que al hacer esto, a menudo también se reduce la no linealidad.
Aquí hay un buen resumen del trabajo original y todo el trabajo realizado desde: http://www.ime.usp.br/~abe/lista/pdfm9cJKUmFZp.pdf
Sin embargo, notará que la función de probabilidad de registro que rige la selección de la transformada de potencia lambda depende de la suma residual de cuadrados de un modelo subyacente (sin LaTeX en SO - vea la referencia), por lo que no se puede aplicar ninguna transformación sin modelo.
Una aplicación típica es la siguiente:
library(MASS)
# generate some data
set.seed(1)
n <- 100
x <- runif(n, 1, 5)
y <- x^3 + rnorm(n)
# run a linear model
m <- lm(y ~ x)
# run the box-cox transformation
bc <- boxcox(y ~ x)
(lambda <- bc$x[which.max(bc$y)])
[1] 0.4242424
powerTransform <- function(y, lambda1, lambda2 = NULL, method = "boxcox") {
boxcoxTrans <- function(x, lam1, lam2 = NULL) {
# if we set lambda2 to zero, it becomes the one parameter transformation
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
)
}
# re-run with transformation
mnew <- lm(powerTransform(y, lambda) ~ x)
# QQ-plot
op <- par(pty = "s", mfrow = c(1, 2))
qqnorm(m$residuals); qqline(m$residuals)
qqnorm(mnew$residuals); qqline(mnew$residuals)
par(op)
Como puede ver, esto no es una solución mágica: solo algunos datos pueden transformarse de manera efectiva (por lo general, una lambda de menos de -2 o mayor de 2 es una señal de que no debe usar el método). Al igual que con cualquier método estadístico, use con precaución antes de implementar.
Para usar los dos parámetros de transformación de Box-Cox, use el paquete geoR
para encontrar las lambdas:
library("geoR")
bc2 <- boxcoxfit(x, y, lambda2 = TRUE)
lambda1 <- bc2$lambda[1]
lambda2 <- bc2$lambda[2]
EDITS: Conflación de la implementación de Tukey y Box-Cox como lo señaló @ Yui-Shiuan solucionado.
De acuerdo con la fórmula de transformación de Box-cox en el artículo de Box, George EP; Cox, DR (1964). "Un análisis de las transformaciones" , creo que la publicación de mlegge podría necesitar una pequeña edición. La transformación y debería ser (y ^ (lambda) -1) / lambda en lugar de y ^ (lambda). (En realidad, y ^ (lambda) se llama transformación de Tukey, que es otra fórmula de transformación distinta).
Por lo tanto, el código debe ser:
(trans <- bc$x[which.max(bc$y)])
[1] 0.4242424
# re-run with transformation
mnew <- lm(((y^trans-1)/trans) ~ x) # Instead of mnew <- lm(y^trans ~ x)
Más información
Implementación correcta de la fórmula de transformación de Box-Cox por boxcox () en R:
https://www.r-bloggers.com/on-box-cox-transform-in-regression-models/Una gran comparación entre la transformación de Box-Cox y la transformación de Tukey. http://onlinestatbook.com/2/transformations/box-cox.html
También se puede encontrar la fórmula de transformación de Box-Cox en Wikipedia: en.wikipedia.org/wiki/Power_transform#Box.E2.80.93Cox_transformation
Por favor, corrígeme si lo entendí mal.