Box-Cox comme transformation pour les variables indépendantes?

53

Existe-t-il une transformation de type Box-Cox pour les variables indépendantes? C’est-à-dire une transformation qui optimise la variable manière à ce qu’elle corresponde mieux à un modèle linéaire?Xy~f(x)

Si oui, existe-t-il une fonction pour effectuer cela R?

Tal Galili
la source
1
Je ne connais aucun moyen de le faire Ret, y réfléchissant un instant, je ne sais pas exactement comment procéder. Quels critères optimiseriez-vous pour assurer la transformation "la plus linéaire"? est tentant mais, comme on le voit dans ma réponse ici , seul ne peut être utilisé pour voir si l'hypothèse de la linéarité d'un modèle est satisfaite. Aviez-vous des critères en tête? R2R2
Macro
1
J'ai l'impression que j'ai déjà vu un journal en parler. Peut-être que googler avec "covariable" au lieu de "variable indépendante" est plus judicieux.
Stéphane Laurent
Je pense (de mémoire ...) qu'il y a une implémentation de ceci dans le package voiture (R). Mais vous avez également enquêter sur les jeux comme dans le paquet gmcv.
kjetil b halvorsen
Un fil de discussion traitant de l'inférence automatique des paramètres Box-Cox (en transformant simultanément toutes les variables indépendantes avec la variable dépendante) est apparu à l' adresse stats.stackexchange.com/questions/60431/… .
whuber

Réponses:

72

John Tukey a préconisé sa " méthode en trois points " pour trouver des expressions de variables permettant de linéariser les relations.

Je vais illustrer avec un exercice de son livre, Exploratory Data Analysis . Ce sont des données de pression de vapeur de mercure provenant d'une expérience dans laquelle la température a été modifiée et la pression de vapeur a été mesurée.

pressure <- c(0.0004, 0.0013, 0.006, 0.03, 0.09, 0.28, 0.8, 1.85, 4.4, 
              9.2, 18.3, 33.7, 59, 98, 156, 246, 371, 548, 790) # mm Hg
temperature <- seq(0, 360, 20) # Degrees C

La relation est fortement non linéaire: voir le panneau de gauche dans l'illustration.

Parcelles

S'agissant d'un exercice exploratoire , nous nous attendons à ce qu'il soit interactif. On demande à l’analyste de commencer par identifier trois points «typiques» dans l’intrigue : un près de chaque extrémité et un au milieu. Je l'ai fait ici et les ai marqués en rouge. (Quand j'ai fait cet exercice pour la première fois il y a longtemps, j'ai utilisé un ensemble de points différent, mais suis arrivé aux mêmes résultats.)

Dans la méthode des trois points, on cherche - par force brute ou autrement - une transformation de Box-Cox qui, lorsqu'elle est appliquée à l' une des coordonnées - y ou x - (a) placera les points typiques approximativement sur un line et (b) utilise un "beau" pouvoir, généralement choisi parmi une "échelle" de pouvoirs pouvant être interprétés par l'analyste.

Pour des raisons qui apparaîtront plus tard, j'ai élargi la famille Box-Cox en autorisant un "décalage" afin que les transformations soient de la forme

X(X+α)λ-1λ.

Voici une Rimplémentation rapide et sale . Il trouve d'abord une solution optimale , puis arrondit à la valeur la plus proche de l'échelle et, sous réserve de cette restriction, optimise (dans des limites raisonnables). C'est incroyablement rapide, car tous les calculs sont basés sur ces trois points typiques du jeu de données d'origine. (Vous pouvez les faire avec un crayon et du papier, même, c'est exactement ce que Tukey a fait.)(λ,α)λα

box.cox <- function(x, parms=c(1,0)) {
  lambda <- parms[1]
  offset <- parms[2]
  if (lambda==0) log(x+offset) else ((x+offset)^lambda - 1)/lambda
}
threepoint <- function(x, y, ladder=c(1, 1/2, 1/3, 0, -1/2, -1)) {
  # x and y are length-three samples from a dataset.
  dx <- diff(x)
  f <- function(parms) (diff(diff(box.cox(y, parms)) / dx))^2
  fit <- nlm(f, c(1,0))
  parms <- fit$estimate #$
  lambda <- ladder[which.min(abs(parms[1] - ladder))]
  if (lambda==0) offset = 0 else {
    do <- diff(range(y))
    offset <- optimize(function(x) f(c(lambda, x)), 
                       c(max(-min(x), parms[2]-do), parms[2]+do))$minimum    
  }
  c(lambda, offset)
}

Lorsque la méthode des trois points est appliquée aux valeurs de pression (y) dans le jeu de données de vapeur de mercure, nous obtenons le panneau central des tracés.

data <- cbind(temperature, pressure)
n <- dim(data)[1]
i3 <- c(2, floor((n+1)/2), n-1)
parms <- threepoint(temperature[i3], pressure[i3])
y <- box.cox(pressure, parms)

Dans ce cas, parmsest égal à : la méthode choisit de log-transformer la pression.(0,0)

Nous avons atteint un point analogue au contexte de la question: pour une raison quelconque (généralement pour stabiliser la variance résiduelle), nous avons ré-exprimé la variable dépendante , mais nous trouvons que la relation avec une variable indépendante est non linéaire. Nous passons maintenant à la ré-expression de la variable indépendante dans le but de linéariser la relation. Ceci est fait de la même manière, en inversant simplement les rôles de x et y:

parms <- threepoint(y[i3], temperature[i3])
x <- box.cox(temperature, parms)

Les valeurs de parmspour la variable indépendante (température) sont : en d’autres termes, nous devrions exprimer la température en degrés Celsius supérieurs à C et utiliser sa réciproque (la puissance ). (Pour des raisons techniques, la transformation Box-Cox ajoute en outre au résultat.) La relation résultante est affichée dans le panneau de droite.(-1,253.75)-254-11


À ce jour, quiconque ayant le moins de connaissances scientifiques a reconnu que les données nous "indiquaient" qu'il fallait utiliser des températures absolues - où le décalage est de au lieu de car elles auront une signification physique. (Lorsque le dernier tracé est redessiné en utilisant un décalage de au lieu de , il y a peu de changement visible. Un physicien étiqueterait alors l'axe des x avec : c'est-à-dire la température absolue réciproque.)2732542732541/(1-X)

C'est un bel exemple de la manière dont l'exploration statistique doit interagir avec la compréhension du sujet de l'enquête . En fait, les températures absolues réciproques apparaissent tout le temps dans les lois physiques. En conséquence, en utilisant uniquement des méthodes EDA simples pour explorer cet ensemble de données centenaire, nous avons redécouvert la relation de Clausius-Clapeyron : le logarithme de la pression de vapeur est une fonction linéaire de la température absolue réciproque. Non seulement cela, nous avons une estimation pas très mauvaise du zéro absolu (-254degrés C), à partir de la pente du graphique de droite, on peut calculer l'enthalpie spécifique de vaporisation et, comme il se trouve, une analyse minutieuse des résidus permet d'identifier une valeur aberrante (la valeur à une température de degré C), nous montre comment l'enthalphyie de la vaporisation varie (très légèrement) avec la température (violant ainsi la loi des gaz parfaits), et peut finalement nous donner des informations précises sur le rayon effectif des molécules de mercure! Tout cela à partir de 19 points de données et quelques compétences de base en EDA.0

whuber
la source
2
Bonjour cher Whuber. Quelle réponse intéressante, je la lis avec plaisir, merci! (et je vais aussi jouer un peu avec elle pour voir comment cela pourrait correspondre à la question avec laquelle je travaille)
Tal Galili
3
n2data <- cbind(temperature, pressure)R
2
@landroni Des puissances intégrales et de petites fractions apparaissent souvent dans les théories physiques, chimiques et biologiques, ainsi que dans le cadre de considérations géométriques. (Par exemple, lorsqu'une variable est un volume, sa racine cubique est une longueur, ce qui peut être interprétée, alors que, par exemple, sa septième racine n'a pas d'interprétation géométrique simple.) Les autres puissances ont rarement une telle interprétation.
whuber
3
@ Frank C'est vrai; c'est explicitement et incontestablement une technique exploratoire. Notez qu'il ne prétend même pas être prédictif. L'exploration ne peut que suggérer des moyens de procéder. Il est toutefois envisageable d'affecter quatre df de votre budget de modélisation à l'estimation de ces transformations, et l'estimation pourrait être incorporée automatiquement dans l'algorithme d'ajustement à l'aide de l'approche de Tukey ou autrement (ML est une possibilité évidente).
whuber
5
YYλ
11

Jetez un coup d’œil à ces diapositives sur les "diagnostics de régression" de John Fox (disponibles ici , complétées de références), qui traitent brièvement de la question de la transformation de la non-linéarité. Il couvre la "règle bombée" de Tukey pour la sélection des transformations de puissance (abordée dans la réponse acceptée), mais mentionne également les familles de transformations Box-Cox et Yeo-Johnson. Voir la section 3.6 des diapositives. Pour une interprétation plus formelle du même auteur, voir J. Fox, Analyse de régression appliquée et modèles linéaires généralisés, Deuxième édition (Sage, 2008) .

En ce qui concerne les packages R qui vous aident, jetez un coup d’œil sur le package voiture , rédigé par J. Fox et S. Weisberg. Ce paquetage accompagne J. Fox et S. Weisberg, Un compagnon à la régression appliquée, Deuxième édition, (Sage, 2011) , un autre livre à lire absolument. En utilisant ce package, vous pouvez partir de basicPower()(transformations de puissance simples), bcPower()(transformations Box-Cox) et yjPower()(transformations Yeo-Johnson). Il y a aussi powerTransform () :

La fonction powerTransform permet d'estimer les transformations de normalisation d'une variable aléatoire univariée ou multivariée.

Consultez les deux ouvrages pour plus de détails sur la théorie derrière ces transformations et sur les approches informatiques.

Landroni
la source