Log Transformations are often recommended for skewed data, such as monetary measures or certain biological and demographic measures. Os dados de transformação de log geralmente têm o efeito de espalhar aglomerados de dados e reunir dados de dispersão. Por exemplo, abaixo está um histograma das áreas de todos os 50 estados dos EUA. Ele é inclinado para a direita devido ao Alasca, Califórnia, Texas e alguns outros.
hist(state.area)
Após uma transformação de log, observe que o histograma é mais ou menos simétrico. Nós aproximamos os estados grandes e espaçamos os estados menores.
hist(log(state.area))
Porquê fazer isto? Uma razão é para tornar os dados mais “normais”, ou simétricos. Se estamos realizando uma análise estatística que assume a normalidade, uma transformação de log pode nos ajudar a cumprir essa suposição. Outra razão é para ajudar a satisfazer a suposição de variância constante no contexto da modelagem linear. Outra é ajudar a tornar uma relação não-linear mais linear. Mas embora seja fácil implementar uma transformação em log, isso pode complicar a interpretação. Digamos que encaixamos um modelo linear com uma variável dependente transformada em log. Como interpretamos os coeficientes? E se tivermos variáveis dependentes e independentes transformadas em log? Esse é o tópico deste artigo.
Primeiro vamos fornecer uma receita de interpretação para aqueles que só querem alguma ajuda rápida. Depois vamos cavar um pouco mais fundo no que estamos a dizer sobre o nosso modelo quando fizermos log-transformação dos nossos dados.
Rules for interpretation
OK, você rodou uma regressão/ajuste um modelo linear e algumas de suas variáveis são log-transformadas.
- Somente a variável dependente/responsa é log-transformada. Exponencie o coeficiente, subtraia um deste número, e multiplique por 100. Isto dá a porcentagem de aumento (ou diminuição) na resposta para cada aumento de uma unidade na variável independente. Exemplo: o coeficiente é 0,198. (exp(0,198) – 1) * 100 = 21,9. Para cada aumento de uma unidade na variável independente, nossa variável dependente aumenta em cerca de 22%.
- Apenas a(s) variável(s) independente(s)/previsão é(são) log-transformada(s). Dividir o coeficiente por 100. Isto nos diz que um aumento de 1% na variável independente aumenta (ou diminui) a variável dependente por (coeficiente/100) unidades. Exemplo: o coeficiente é 0,198. 0.198/100 = 0.00198. Para cada 1% de aumento na variável independente, a nossa variável dependente aumenta em cerca de 0,002. Para um aumento de x por cento, multiplique o coeficiente por log(1,x). Exemplo: Para cada aumento de 10% na variável independente, nossa variável dependente aumenta em cerca de 0,198 * log(1,10) = 0,02.
- Tanto a variável dependente/de resposta quanto a(s) variável(s) independente/previsora(s) são log-transformadas. Interprete o coeficiente como o aumento percentual na variável dependente para cada 1% de aumento na variável independente. Exemplo: o coeficiente é 0,198. Para cada 1% de aumento na variável independente, nossa variável dependente aumenta em cerca de 0,20%. Para o aumento de x por cento, calcular 1,x para a potência do coeficiente, subtrair 1, e multiplicar por 100. Exemplo: Para cada aumento de 20% na variável independente, a nossa variável dependente aumenta cerca de (1,20 0,198 – 1) * 100 = 3,7 por cento.
Que Transformações de Log realmente significam para os seus Modelos
É bom saber como interpretar corretamente os coeficientes para dados log-transformados, mas é importante saber o que exatamente o seu modelo está implicando quando ele inclui dados log-transformados. Para entender melhor, vamos usar R para simular alguns dados que precisarão de log-transformações para uma análise correta. Vamos mantê-lo simples com uma variável independente e erros normalmente distribuídos. Primeiro vamos olhar para uma variável dependente log-transformada.
x <- seq(0.1,5,length.out = 100)set.seed(1)e <- rnorm(100, mean = 0, sd = 0.2)
A primeira linha gera uma sequência de 100 valores de 0.1 a 5 e atribui-a a x. A linha seguinte define o gerador de números aleatórios como 1. Se fizer o mesmo, obterá os mesmos dados gerados aleatoriamente que obtivemos quando executar a linha seguinte. O código rnorm(100, mean = 0, sd = 0.2)
gera 100 valores de uma distribuição Normal com uma média de 0 e desvio padrão de 0,2. Este será o nosso “erro”. Esta é uma das hipóteses de regressão linear simples: nossos dados podem ser modelados com uma linha reta, mas serão desativados por algum valor aleatório que assumimos vir de uma distribuição Normal com média 0 e algum desvio padrão. Atribuímos nosso erro a e.
Agora estamos prontos para criar nossa variável dependente transformada em log. Escolhemos uma intercepção (1,2) e uma inclinação (0,2), que multiplicamos por x, e depois adicionamos o nosso erro aleatório, e. Finalmente exponenciamos.
y <- exp(1.2 + 0.2 * x + e)
Para ver porque exponenciamos, observe o seguinte:
$$$$texto{log}(y) = \beta_0 + \beta_1x$$
$$$$$$texto{exp}(\beta_0 + \beta_1x)$$
$$$y = \beta_0 + \beta_1x)$$$
Então um log-variável dependente transformada implica que o nosso modelo linear simples tenha sido exponenciado. Lembrando da regra do produto de expoentes que podemos reescrever a última linha acima como
$$y = \text{exp}(\beta_0) \beta_1x)$$
Isto implica ainda que nossa variável independente tem uma relação multiplicativa com nossa variável dependente ao invés da relação aditiva usual. Daí a necessidade de expressar o efeito de uma mudança de uma unidade em x sobre y como um percentual.
Se ajustarmos o modelo correto aos dados, note que fazemos um bom trabalho de recuperar os valores verdadeiros dos parâmetros que usamos para gerar os dados.
A intercepção estimada de 1,226 está próxima do valor verdadeiro de 1,2. A inclinação estimada de 0,198 está muito próxima do valor verdadeiro de 0,2. Finalmente o erro padrão residual estimado de 0,1805 não está muito longe do valor verdadeiro de 0,2.
Recorde que para interpretar o valor da inclinação precisamos exponenciá-lo.
exp(coef(lm1)) x 1.219179
Isto diz que cada aumento de uma unidade em x é multiplicado por cerca de 1,22. Ou seja, para cada aumento de uma unidade em x, y aumenta em cerca de 22%. Para obter 22%, subtraia 1 e multiplique por 100,
(exp(coef(lm1)) - 1) * 100 x 21.91786
E se cabermos apenas y em vez de log(y)? Como podemos descobrir que devemos considerar uma transformação de log? Só de olhar para os coeficientes não vai dizer muito.
lm2 <- lm(y ~ x)summary(lm2)Call:lm(formula = y ~ x)Residuals: Min 1Q Median 3Q Max -2.3868 -0.6886 -0.1060 0.5298 3.3383 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 3.00947 0.23643 12.73 <2e-16 ***x 1.16277 0.08089 14.38 <2e-16 ***---Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1Residual standard error: 1.156 on 98 degrees of freedomMultiple R-squared: 0.6783,Adjusted R-squared: 0.675 F-statistic: 206.6 on 1 and 98 DF, p-value: < 2.2e-16
Certo, como nós geramos os dados, podemos ver que os coeficientes estão muito longe e o erro padrão residual é muito alto. Mas na vida real você não vai saber disso! É por isso que fazemos diagnósticos de regressão. Uma suposição chave para verificar é a constante variação dos erros. Podemos fazer isto com um gráfico de escala de localização. Aqui está o gráfico para o modelo que acabamos de executar sem log transformar y.
plot(lm2, which = 3) # 3 = Scale-Location plot
Notem que os resíduos padronizados estão com tendência para cima. Este é um sinal de que a suposição de variância constante foi violada. Compare este gráfico com o mesmo gráfico para o modelo correto.
plot(lm1, which = 3)
A linha de tendência é uniforme e os resíduos estão uniformemente dispersos.
Isto significa que você deve sempre transferir log-transformar sua variável dependente se você suspeitar que a suposição de constante-variância foi violada? Não necessariamente. A variância não constante pode ser devida a outras indicações errôneas no seu modelo. Pense também no que significa a modelagem de uma variável dependente transformada em log. Ela diz que tem uma relação multiplicativa com os preditores. Isso parece certo? Use seu julgamento e experiência no assunto.
Agora vamos considerar dados com uma variável de previsão independente, transformada em log. Isto é mais fácil de gerar. Nós simplesmente log-transformamos x.
y <- 1.2 + 0.2*log(x) + e
Após novamente encaixarmos o modelo correto e percebermos que ele faz um ótimo trabalho de recuperar os valores verdadeiros que usamos para gerar os dados:
lm3 <- lm(y ~ log(x))summary(lm3)Call:lm(formula = y ~ log(x))Residuals: Min 1Q Median 3Q Max -0.46492 -0.12063 0.00112 0.11661 0.45864 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 1.22192 0.02308 52.938 < 2e-16 ***log(x) 0.19979 0.02119 9.427 2.12e-15 ***---Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1Residual standard error: 0.1806 on 98 degrees of freedomMultiple R-squared: 0.4756,Adjusted R-squared: 0.4702 F-statistic: 88.87 on 1 and 98 DF, p-value: 2.121e-15
Para interpretar o coeficiente de inclinação, dividimos por 100.
coef(lm3)/100 log(x) 0.001997892
Isto diz-nos que um aumento de 1% em x aumenta a variável dependente em cerca de 0,002. Por que nos diz isto? Vamos fazer algumas contas. Abaixo calculamos a mudança em y ao mudar x de 1 para 1,01 (ou seja, um aumento de 1%).
$$(\beta_0 + \beta_1\texto{log}1.01) – (\beta_0 + \beta_1\texto{log}1)$$
$$$$$$$1\texto{log}1.01 – \beta_1\texto{log}1$$$$$$$$$1(\beta_1{log}1.01 – {log{log}1)$$
$$$$$$$$1text{log}frac{1.01}{1} = {log}1.01$$$$
O resultado é multiplicar o coeficiente de inclinação pelo log(1.01), que é aproximadamente igual a 0.01, ou {frac{1}100}). Daí a interpretação de que um aumento de 1% em x aumenta a variável dependente pelo coeficiente/100.
Após novamente vamos encaixar o modelo errado ao não especificar uma transformação logarítmica para x na sintaxe do modelo.
lm4 <- lm(y ~ x)
Ver um resumo do modelo revelará que as estimativas dos coeficientes estão bem longe dos valores verdadeiros. Mas na prática nunca conhecemos os valores verdadeiros. Mais uma vez, os diagnósticos servem para avaliar a adequação do modelo. Um diagnóstico útil, neste caso, é um gráfico parcial-residual que pode revelar desvios da linearidade. Lembre-se que os modelos lineares assumem que os preditores são aditivos e têm uma relação linear com a variável resposta. O pacote do carro fornece a função crPlot para a criação rápida de gráficos parciais-residuais. Basta dar a ele o objeto modelo e especificar para qual variável você deseja criar o gráfico residual parcial.
library(car)crPlot(lm4, variable = "x")
A linha reta representa a relação especificada entre x e y. A linha curva é uma linha de tendência suave que resume a relação observada entre x e y. Podemos dizer que a relação observada é não-linear. Compare este gráfico com o gráfico parcial-residual para o modelo correto.
crPlot(lm3, variable = "log(x)")
As linhas lisas e ajustadas estão bem em cima umas das outras, não revelando nenhum desvio sério da linearidade.
Isso não significa que se você vir desvios da linearidade você deve assumir imediatamente que uma transformação de log é a única e única correção! A relação não-linear pode ser complexa e não tão facilmente explicada com uma simples transformação. Mas uma transformação de log pode ser adequada em tais casos e certamente algo a considerar.
Finalmente vamos considerar dados onde tanto as variáveis dependentes como as independentes são transformadas em log.
y <- exp(1.2 + 0.2 * log(x) + e)
Vejamos atentamente o código acima. A relação entre x e y é agora tanto multiplicativa como não-linear!
Como de costume podemos encaixar o modelo correto e notar que ele faz um trabalho fantástico de recuperar os valores verdadeiros que usamos para gerar os dados:
lm5 <- lm(log(y)~ log(x))summary(lm5)Call:lm(formula = log(y) ~ log(x))Residuals: Min 1Q Median 3Q Max -0.46492 -0.12063 0.00112 0.11661 0.45864 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 1.22192 0.02308 52.938 < 2e-16 ***log(x) 0.19979 0.02119 9.427 2.12e-15 ***---Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1Residual standard error: 0.1806 on 98 degrees of freedomMultiple R-squared: 0.4756,Adjusted R-squared: 0.4702 F-statistic: 88.87 on 1 and 98 DF, p-value: 2.121e-15
Interprete o coeficiente x como o aumento percentual em y para cada 1% de aumento em x. Neste caso, isso é cerca de um aumento de 0,2% em y para cada 1% de aumento em x.
Ajustar o modelo errado mais uma vez produz coeficientes e estimativas de erro padrão residual que estão muito fora do alvo.
lm6 <- lm(y ~ x)summary(lm6)
Os gráficos Scale-Location e Partial-Residual fornecem evidências de que algo está errado com o nosso modelo. O gráfico Scale-Location mostra uma linha de tendência curva e o gráfico Parcial-Residual mostra linhas lineares e suaves que não combinam.
plot(lm6, which = 3)
crPlot(lm6, variable = "x")
Como saberíamos na vida real que o modelo correto requer variáveis independentes e dependentes transformadas em log? Nós não o faríamos. Poderíamos ter um palpite baseado em parcelas de diagnóstico e experiência de modelagem. Ou podemos ter algum conhecimento sobre o processo que estamos modelando e ter boas razões para pensar que a relação é multiplicativa e não-linear.
Espera que agora você tenha um melhor controle não só de como interpretar variáveis log-transformadas em um modelo linear, mas também o que as variáveis log-transformadas significam para o seu modelo.
>
Para perguntas ou esclarecimentos sobre este artigo, contate a biblioteca UVA StatLab: [email protected]
>
Veja toda a coleção de artigos da biblioteca UVA StatLab.
Clay Ford
Statistical Research Consultant
University of Virginia Library
August 17, 2018