John Tukey defendeu seu " método dos três pontos " para encontrar re-expressões de variáveis para linearizar relacionamentos.
Ilustrarei com um exercício de seu livro, Análise Exploratória de Dados . Estes são dados de pressão de vapor de mercúrio de um experimento em que a temperatura foi variada e a pressão de vapor foi medida.
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
A relação é fortemente não linear: veja o painel esquerdo na ilustração.
Por ser um exercício exploratório , esperamos que seja interativo. Solicita-se ao analista que comece identificando três pontos "típicos" no gráfico : um próximo a cada extremidade e um no meio. Fiz isso aqui e os marquei em vermelho. (Quando fiz esse exercício há muito tempo, usei um conjunto diferente de pontos, mas cheguei aos mesmos resultados.)
No método dos três pontos, procura-se - por força bruta ou não - uma transformação Box-Cox que, quando aplicada a uma das coordenadas - y ou x - (a) coloca os pontos típicos aproximadamente em um linha e (b) usa um poder "legal", geralmente escolhido entre uma "escada" de poderes que pode ser interpretável pelo analista.
Por razões que se tornarão aparentes mais tarde, estendi a família Box-Cox, permitindo um "deslocamento" para que as transformações ocorram na 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 o método de três pontos é aplicado aos valores de pressão (y) no conjunto de dados de vapor de mercúrio, obtemos o painel do meio das plotagens.
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 )
Chegamos a um ponto análogo ao contexto da questão: por qualquer motivo (geralmente para estabilizar a variação residual), reexprimimos a variável dependente , mas descobrimos que a relação com uma variável independente é não linear. Então agora passamos a re-expressar a variável independente, em um esforço para linearizar a relação. Isso é feito da mesma maneira, apenas revertendo os papéis de xey:
parms <- threepoint(y[i3], temperature[i3])
x <- box.cox(temperature, parms)
parms
( - 1 , 253,75 )- 254- 11 1
2732542732541 / ( 1 - x )
- 2540 0
R
e, pensando nisso por um momento, não sei exatamente como alguém faria isso. Quais critérios você otimizaria para garantir a transformação "mais linear"? é tentador, mas, como visto na minha resposta aqui , sozinho não pode ser usado para ver se a suposição de linearidade de um modelo é satisfeita. Você tinha alguns critérios em mente?