John Tukey ha sostenuto il suo " metodo a tre punti " per trovare re-espressioni di variabili per linearizzare le relazioni.
Illustrerò con un esercizio tratto dal suo libro, Exploratory Data Analysis . Questi sono i dati sulla pressione del vapore di mercurio da un esperimento in cui è stata variata la temperatura e misurata la pressione del vapore.
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 relazione è fortemente non lineare: vedere il riquadro di sinistra nell'illustrazione.
Poiché si tratta di un esercizio esplorativo , ci aspettiamo che sia interattivo. All'analista viene chiesto di iniziare identificando tre punti "tipici" nella trama : uno vicino ad ogni estremità e uno al centro. L'ho fatto qui e li ho contrassegnati in rosso. (Quando ho fatto questo esercizio per la prima volta molto tempo fa, ho usato una serie diversa di punti ma sono arrivato agli stessi risultati.)
Nel metodo a tre punti, si cerca - con la forza bruta o in altro modo - una trasformazione Box-Cox che, quando applicata a una delle coordinate - y o x - (a) posizionerà i punti tipici approssimativamente su un line e (b) usa un potere "piacevole", di solito scelto da una "scala" di poteri che potrebbero essere interpretabili dall'analista.
Per ragioni che appariranno in seguito, ho esteso la famiglia Box-Cox consentendo un "offset" in modo che le trasformazioni siano nella forma
x → ( x + α )λ- 1λ.
R
( λ , α )λα
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)
}
Quando il metodo a tre punti viene applicato ai valori di pressione (y) nel set di dati del vapore di mercurio, otteniamo il pannello centrale dei grafici.
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)
parms
( 0 , 0 )
Abbiamo raggiunto un punto analogo al contesto della domanda: per qualsiasi motivo (di solito per stabilizzare la varianza residua), abbiamo ri-espresso la variabile dipendente , ma scopriamo che la relazione con una variabile indipendente non è lineare. Quindi ora passiamo a ri-esprimere la variabile indipendente nel tentativo di linearizzare la relazione. Questo viene fatto allo stesso modo, semplicemente invertendo i ruoli di xey:
parms <- threepoint(y[i3], temperature[i3])
x <- box.cox(temperature, parms)
parms
( - 1 , 253,75 )- 254- 11
2732542732541 / ( 1 - x )
- 2540
R
e, pensandoci per un momento, non sono sicuro di come si farebbe. Quali criteri ottimizzeresti per garantire la trasformazione "più lineare"? è allettante ma, come si vede nella mia risposta qui , R 2 da solo non può essere utilizzato per vedere se l'assunzione di linearità di un modello è soddisfatta. Hai in mente alcuni criteri?