¿Box-Cox como transformación para variables independientes?

53

¿Existe una transformación similar a Box-Cox para variables independientes? Es decir, ¿una transformación que optimice la variable para que se ajuste más razonablemente a un modelo lineal?xy~f(x)

Si es así, ¿hay una función para realizar esto R?

Tal Galili
fuente
1
No conozco ninguna instalación para hacer esto Ry, pensando en ello por un momento, no estoy seguro exactamente cómo se haría esto en absoluto. ¿Qué criterios optimizaría para garantizar la transformación "más lineal"? es tentador pero, como se ve en mi respuesta aquí , solo no se puede usar para ver si se cumple el supuesto de linealidad de un modelo. ¿Tenías algunos criterios en mente? R 2R2R2
Macro
1
Tengo la impresión de que ya he visto un artículo hablando de eso. Quizás buscar más en Google con "covariable" en lugar de "variable independiente".
Stéphane Laurent
Creo que (de memoria ...) hay alguna implementación de esto en el paquete del automóvil (R). Pero también investigaría los gam como en el paquete gmcv.
kjetil b halvorsen
Un hilo que analiza la inferencia automática de los parámetros de Box-Cox (al transformar simultáneamente todas las variables independientes junto con la variable dependiente) ha aparecido en stats.stackexchange.com/questions/60431/… .
whuber

Respuestas:

72

John Tukey abogó por su " método de tres puntos " para encontrar nuevas expresiones de variables para linealizar las relaciones.

Ilustraré con un ejercicio de su libro, Exploratorio de Análisis de Datos . Estos son datos de presión de vapor de mercurio de un experimento en el que se varió la temperatura y se midió la presión de vapor.

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 relación es fuertemente no lineal: vea el panel izquierdo en la ilustración.

Parcelas

Debido a que este es un ejercicio exploratorio , esperamos que sea interactivo. Se le pide al analista que comience identificando tres puntos "típicos" en la trama : uno cerca de cada extremo y otro en el medio. Lo hice aquí y los marqué en rojo. (Cuando hice este ejercicio por primera vez hace mucho tiempo, utilicé un conjunto diferente de puntos pero obtuve los mismos resultados).

En el método de tres puntos, uno busca, por fuerza bruta o de otro modo, una transformación de Box-Cox que, cuando se aplica a una de las coordenadas, ya sea y o x, (a) colocará los puntos típicos aproximadamente en un la línea y (b) usa un poder "agradable", generalmente elegido de una "escalera" de poderes que el analista podría interpretar.

Por razones que se harán aparentes más adelante, he extendido la familia Box-Cox al permitir un "desplazamiento" para que las transformaciones tengan la forma

x(x+α)λ1λ.

Aquí hay una Rimplementación rápida y sucia . Primero encuentra una solución óptima , luego redondea al valor más cercano en la escalera y, sujeto a esa restricción, optimiza (dentro de límites razonables). Es increíblemente rápido porque todos los cálculos se basan en esos tres puntos típicos del conjunto de datos original. (Incluso puedes hacerlos con lápiz y papel, que es exactamente lo que hizo Tukey).λ α(λ,α)λα

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

Cuando el método de tres puntos se aplica a los valores de presión (y) en el conjunto de datos de vapor de mercurio, obtenemos el panel central de las gráficas.

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)

En este caso, parmsresulta igual : el método elige transformar la presión logarítmicamente.(0,0)

Hemos llegado a un punto análogo al contexto de la pregunta: por cualquier razón (generalmente para estabilizar la varianza residual), hemos reexpresado la variable dependiente , pero encontramos que la relación con una variable independiente no es lineal. Así que ahora pasamos a reexpresar la variable independiente en un esfuerzo por linealizar la relación. Esto se hace de la misma manera, simplemente invirtiendo los roles de x e y:

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

Se encuentra que los valores de parmspara la variable independiente (temperatura) son : en otras palabras, debemos expresar la temperatura como grados Celsius por encima de C y usar su recíproco (la potencia ). (Por razones técnicas, la transformación Box-Cox agrega además al resultado). La relación resultante se muestra en el panel derecho.- 254 - 1 1(1,253.75)25411


En este momento, cualquiera con la menor experiencia científica ha reconocido que los datos nos están "diciendo" que usemos temperaturas absolutas , donde el desplazamiento es lugar de porque esos serán físicamente significativos. (Cuando el último gráfico se vuelve a dibujar con un desplazamiento de lugar de , hay pocos cambios visibles. Un físico luego etiquetaría el eje x con : es decir, temperatura absoluta recíproca).254 273 254 1 / ( 1 - x )2732542732541/(1x)

Este es un buen ejemplo de cómo la exploración estadística necesita interactuar con la comprensión del tema de investigación . De hecho, las temperaturas absolutas recíprocas aparecen todo el tiempo en las leyes físicas. En consecuencia, utilizando solo métodos EDA simples para explorar este conjunto de datos simple y centenario, hemos redescubierto la relación Clausius-Clapeyron : el logaritmo de la presión de vapor es una función lineal de la temperatura absoluta recíproca. No solo eso, tenemos una estimación no muy mala del cero absoluto (0254grados C), a partir de la pendiente de la gráfica de la derecha podemos calcular la entalpía específica de vaporización y, como resultado, un análisis cuidadoso de los residuos identifica un valor atípico (el valor a una temperatura de grados C), nos muestra cómo la entalfía de la vaporización varía (muy levemente) con la temperatura (violando así la Ley de los gases ideales) y, en última instancia, puede darnos información precisa sobre el radio efectivo de las moléculas de gas de mercurio. Todo eso desde 19 puntos de datos y algunas habilidades básicas en EDA.0

whuber
fuente
2
Hola querido whuber Qué respuesta tan interesante, lo leí con gusto, ¡gracias! (y también jugaré un poco con él para ver cómo podría encajar el problema con el que estoy trabajando)
Tal Galili
3
@Andre Para usar la última parte de este código, necesita vincular las variables x e y en una matriz por , como en . (Esto se hizo para que coincida con la forma en que los datos (x, y) generalmente se almacenan , ya sea como una matriz o marco de datos). Pido disculpas por omitir ese paso y he editado la respuesta para incluirla: vea si eso funciona. 2n2data <- cbind(temperature, pressure)R
whuber
2
@landroni Los poderes fraccionales integrales y pequeños a menudo surgen en las teorías físicas, químicas y biológicas, así como a través de consideraciones geométricas. (Por ejemplo, cuando una variable es un volumen, su raíz cúbica es una longitud, que es interpretable, mientras que, por ejemplo, su séptima raíz no tiene una interpretación geométrica simple). Otras potencias rara vez tienen tal interpretación.
whuber
3
@Frank Eso es correcto; Es explícita y descaradamente una técnica exploratoria. Tenga en cuenta que ni siquiera pretende ser predictivo. La exploración solo puede sugerir formas de proceder. Sin embargo, es posible imaginar la asignación de cuatro df de su presupuesto de modelado para estimar estas transformaciones, y la estimación podría incorporarse automáticamente en el algoritmo de ajuste utilizando el enfoque de Tukey o de otra manera (ML es una posibilidad obvia).
whuber
55
No tienen en cuenta la incertidumbre (cantidad muy significativa de) en la transformación menos que el centrado de y la estimación de sean partes explícitas de la matriz de información. Y λYYλ
Frank Harrell
11

Eche un vistazo a estas diapositivas sobre "Diagnóstico de regresión" de John Fox (disponible desde aquí , completa con referencias), que discuten brevemente el tema de la transformación de la no linealidad. Cubre la "regla abultada" de Tukey para seleccionar las transformaciones de poder (abordada por la respuesta aceptada), pero también menciona las familias de transformaciones de Box-Cox y Yeo-Johnson. Ver la Sección 3.6 de las diapositivas. Para una toma más formal del mismo autor, ver J. Fox, Análisis de regresión aplicada y modelos lineales generalizados, Segunda edición (Sage, 2008) .

En cuanto a los paquetes R reales que ayudan con esto, eche un vistazo al paquete del automóvil , creado por J. Fox y S. Weisberg. Este paquete acompaña a J. Fox y S. Weisberg, An R Companion to Applied Regression, Second Edition, (Sage, 2011) , otra lectura obligada. Con ese paquete puede comenzar desde basicPower()(transformaciones de potencia simples), bcPower()(transformaciones de Box-Cox) y yjPower()(transformaciones de Yeo-Johnson). También hay powerTransform () :

La función powerTransform se usa para estimar las transformaciones de normalización de una variable aleatoria univariada o multivariada.

Consulte ambos libros para obtener más detalles sobre la teoría detrás de estas transformaciones y sobre los enfoques computacionales.

Landroni
fuente
9

Hay muchas ventajas en hacer que la estimación de las transformaciones covariables sea una parte formal del proceso de estimación. Esto reconocerá el número de parámetros involucrados y produjo una buena cobertura de intervalo de confianza y preservación de errores tipo I. Las splines de regresión son algunos de los mejores enfoques. Y las splines funcionarán con valores cero y negativos de diferencia de los enfoques logarítmicos.X

Frank Harrell
fuente