Transformação tipo Box-Cox para variáveis ​​independentes?

53

Existe uma transformação semelhante a Box-Cox para variáveis ​​independentes? Ou seja, uma transformação que otimiza a variável para que ela se ajuste de forma mais razoável a um modelo linear?xy~f(x)

Em caso afirmativo, existe uma função para executar isso R?

Tal Galili
fonte
11
Não conheço nenhum recurso para fazer isso Re, 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? R2R2
Macro
11
Estou com a impressão de que já vi um jornal falando sobre isso. Talvez pesquisar com "covariável" em vez de "variável independente" seja mais criterioso.
Stéphane Laurent
Eu acho que (de memória ...) existe alguma implementação disso no pacote do carro (R). Mas você também investigaria os gam's como no pacote gmcv.
Kjetil b halvorsen
Um tópico que discute a inferência automática dos parâmetros Box-Cox ( transformando simultaneamente todas as variáveis ​​independentes e a variável dependente) apareceu em stats.stackexchange.com/questions/60431/… .
whuber

Respostas:

72

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.

Parcelas

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)25411


2732542732541/(1x)

2540

whuber
fonte
2
Olá querido Whuber. Que resposta interessante, eu li com prazer, obrigado! (e eu também vai jogar com ele um pouco para ver como ele poderia caber a questão que eu estou trabalhando com)
Tal Galili
3
n2data <- cbind(temperature, pressure)R
2
@landroni Poderes fracionais integrais e pequenos geralmente surgem em teorias físicas, químicas e biológicas, bem como por considerações geométricas. (Por exemplo, quando uma variável é um volume, sua raiz cúbica é um comprimento - que é interpretável - enquanto, digamos, sua sétima raiz não possui uma interpretação geométrica simples.) Outros poderes raramente têm essa interpretação.
whuber
3
@ Frank Isso mesmo; é explícita e descaradamente uma técnica exploratória. Observe que nem mesmo afirma ser preditivo. A exploração só pode sugerir maneiras de prosseguir. É possível imaginar alocar quatro df do seu orçamento de modelagem para estimar essas transformações - e a estimativa pode ser incorporada automaticamente ao algoritmo de ajuste usando a abordagem de Tukey ou de outra forma (ML é uma possibilidade óbvia).
whuber
5
YYλ
11

Dê uma olhada nesses slides em "Diagnóstico de regressão", de John Fox (disponível aqui , completo com referências), que discutem brevemente a questão da transformação da não linearidade. Ele cobre a "regra de abaulamento" de Tukey para selecionar transformações de poder (abordadas pela resposta aceita), mas também menciona as famílias de transformações Box-Cox e Yeo-Johnson. Veja a Seção 3.6 dos slides. Para uma análise mais formal do mesmo autor, ver J. Fox, Análise de Regressão Aplicada e Modelos Lineares Generalizados, Segunda Edição (Sage, 2008) .

Quanto aos pacotes R reais que ajudam nisso, dê uma olhada absoluta no pacote para carro , de autoria de J. Fox e S. Weisberg. Este pacote acompanha J. Fox e S. Weisberg, um companheiro de regressão aplicada à regressão aplicada, segunda edição (Sage, 2011) , outra leitura obrigatória. Usando esse pacote, você pode começar basicPower()(transformações simples de energia), bcPower()(transformações Box-Cox) e yjPower()(transformações Yeo-Johnson). Há também powerTransform () :

A função powerTransform é usada para estimar transformações normalizadas de uma variável aleatória univariada ou multivariada.

Verifique os dois livros para obter mais detalhes sobre a teoria por trás dessas transformações e sobre abordagens computacionais.

landroni
fonte
9

X

Frank Harrell
fonte