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.
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 R
implé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, parms
est é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 parms
pour 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
R
et, 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?