Transformação Box-Cox

Em estatística, uma transformação de potência é uma família de funções que são aplicadas para criar a transformação monotônica de dados usando funções de potência. Esta é uma técnica de transformação de dados útil usada para estabilizar a variância, tornar os dados mais semelhantes à distribuição normal, melhorar a validade das medidas de associação (como a correlação de Pearson entre as variáveis) e para outros procedimentos de estabilização de dados.

Histogramas de um conjunto de dados original e sua tranformação, gráfico para escolha de lambda e probabilidade normal. Fonte: Engineering Statistics

Tanto a forma linear quanto a logarítmica são dois casos particulares de uma família mais extensa de transformações não-lineares. A transformação de potência é definida como uma função de variação contínua, em relação ao parâmetro de potência λ (lambda), ou seja, xλ. Uma classe geral de transformação que pode ser utilizada é a de Box-Cox, definida por:

\(f_\lambda(x)=\frac{x^\lambda-1}{\lambda}\) para \(\lambda\neq0\)

\(f_0(x)=log(x)\) para \(\lambda=0\)

A transformação de Box-Cox recebeu o nome dos estatísticos que a formularam, George E. P. Box y David Cox, em artigo de 1964 (“An Analysis of Transformations”). É bastante conhecida no meio econométrico e usada para enfrentar problemas de heterocedasticidade (quando o modelo de hipótese matemático apresenta variâncias para Y e X(X1, X2, X3,…, Xn) não iguais para todas as observações) e/ou falta de normalidade.

A escolha do melhor valor de lambda pode ser automatizada. Na linguagem R, sua implementação pode ser feita através do pacote “forecast”, através da função “BoxCox.lambda()”. Veja esse exemplo de uso envolvendo modelagem e previsão de série temporal usando modelo ARIMA:

# Importar bibliotecas
require(forecast)
# Calcular melhor valor de lambda para a série temporal
lambda = BoxCox.lambda(serie_temporal)
# Calcular modelo ARIMA via decomposição STL e fazer previsão para os próximos 5 tempos
model = stlf(serie_temporal, lambda = lambda, h = 5, method = 'arima', s.window = 'periodic')
# Selecionar previsão
forecast = model$mean

No python, o pacote “scipy” possui a função “boxcox()” para transformar os dados e “inv_boxcox()” para inverter a transformação – mais informações na documentação do scipy (stats.boxcox e stats.inv_boxcox). Veja esse exemplo de uso baseado no script em R:

# Importar bibliotecas
from scipy.stats import boxcox
from scipy.special import inv_boxcox
from pmdarima.arima import ARIMA
# Calcular melhor valor de lambda para a série temporal
serie_temporal2, lambda_boxcox = boxcox(serie_temporal)
# Calcular modelo ARIMA
model = auto_arima(serie_temporal)
# Fazer previsão para os próximos 5 tempos
forecast = model.predict(n_periods=5)
# Inverter transformação
final_forecast = inv_boxcox(forecast[0], lambda_boxcox)

É indicado deixar o valor de lambda restrito entre 0 e 1 (ou 0,5 e 1,0 se os dados incluíssem valores de zero), caso contrário podem resultar em previsões muito erráticas (principalmente quando os valores de lambda estavam abaixo de 0,5).

Fontes

Espalhe a mensagem

3 comentários

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.