transformacion studio cox con r transformation

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

Por favor, corrígeme si lo entendí mal.