Je dois transformer certaines données en une "forme normale" et j'ai lu que Box-Cox peut identifier l'exposant à utiliser pour transformer les données.
Pour ce que j'ai compris
car::boxCoxVariable(y)
est utilisé pour les variables de réponse dans les modèles linéaires, et
MASS::boxcox(object)
pour une formule ou un objet modèle ajusté. Donc, comme mes données sont la variable d’une base de données, la seule fonction que j’ai pu utiliser est la suivante:
car::powerTransform(dataframe$variable, family="bcPower")
Est-ce exact? Ou est-ce que je manque quelque chose?
La deuxième question concerne ce qu'il faut faire après avoir obtenu le
Estimated transformation parameters
dataframe$variable
0.6394806
Devrais-je simplement multiplier la variable par cette valeur? Je l'ai fait:
aaa = 0.6394806
dataframe$variable2 = (dataframe$variable)*aaa
et puis je lance le test shapiro-wilks pour la normalité, mais là encore, mes données ne semblent pas suivre une distribution normale:
shapiro.test(dataframe$variable2)
data: dataframe$variable2
W = 0.97508, p-value < 2.2e-16
Box et Cox (1964) ont suggéré une famille de transformations visant à réduire la non-normalité des erreurs dans un modèle linéaire. En fin de compte, cela réduit souvent également la non-linéarité.
Voici un bon résumé du travail original et de tout le travail effectué depuis: http://www.ime.usp.br/~abe/lista/pdfm9cJKUmFZp.pdf
Vous remarquerez cependant que la fonction log-vraisemblance régissant la sélection de la transformation de puissance lambda dépend de la somme des carrés résiduels d’un modèle sous-jacent (pas de LaTeX sur SO - voir le référence), aucune transformation ne peut donc être appliquée sans modèle.
Une application typique est la suivante:
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)
Comme vous pouvez le constater, ce n'est pas une solution miracle, seules certaines données peuvent être transformées de manière efficace (un lambda inférieur à -2 ou supérieur à 2 indique généralement que vous ne devez pas utiliser cette méthode). Comme avec toute méthode statistique, utilisez-la avec prudence avant de la mettre en œuvre.
Pour utiliser la transformation Box-Cox à deux paramètres, utilisez le package geoR
pour rechercher les lambdas:
library("geoR")
bc2 <- boxcoxfit(x, y, lambda2 = TRUE)
lambda1 <- bc2$lambda[1]
lambda2 <- bc2$lambda[2]
EDITS: Conflation de la mise en œuvre de Tukey et Box-Cox comme l'a souligné @ Yui-Shiuan fixée.
Selon la formule de transformation de Box-cox dans l'article Box, George E. P .; Cox, D. R. (1964). "Une analyse des transformations", je pense que le post de mlegge pourrait devoir être légèrement modifié. Le y transformé devrait être (y ^ (lambda) -1)/lambda au lieu de y ^ (lambda) . (En fait, y ^ (lambda) est appelée transformation de Tukey, qui est une autre formule de transformation distincte.)
Le code devrait donc être:
(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)
Implémentation correcte de la formule de transformation Box-Cox par boxcox () dans R:
https://www.r-bloggers.com/on-box-cox-transform-in-regression-models/
Une excellente comparaison entre la transformation Box-Cox et la transformation Tukey. http://onlinestatbook.com/2/transformations/box-cox.html
On peut également trouver la formule de transformation Box-Cox sur Wikipedia: en.wikipedia.org/wiki/Power_transform#Box.E2.80.93Cox_transformation
S'il vous plaît, corrigez-moi si je vous ai mal compris.