Le trasformazioni logiche sono spesso raccomandate per dati asimmetrici, come misure monetarie o certe misure biologiche e demografiche. La trasformazione logaritmica dei dati di solito ha l’effetto di diffondere i gruppi di dati e riunire i dati sparsi. Per esempio, qui sotto c’è un istogramma delle aree di tutti i 50 stati americani. È sbilanciato a destra a causa di Alaska, California, Texas e pochi altri.
hist(state.area)
Dopo una trasformazione logica, notate che l’istogramma è più o meno simmetrico. Abbiamo spostato gli stati grandi più vicini e distanziato gli stati più piccoli.
hist(log(state.area))
Perché fare questo? Una ragione è quella di rendere i dati più “normali”, o simmetrici. Se stiamo eseguendo un’analisi statistica che presuppone la normalità, una trasformazione logaritmica potrebbe aiutarci a soddisfare tale presupposto. Un’altra ragione è quella di aiutare a soddisfare l’assunzione di varianza costante nel contesto della modellazione lineare. Un altro ancora è quello di aiutare a rendere una relazione non lineare più lineare. Ma mentre è facile implementare una trasformazione di log, può complicare l’interpretazione. Diciamo che adattiamo un modello lineare con una variabile dipendente trasformata in log. Come interpretiamo i coefficienti? Cosa succede se abbiamo variabili dipendenti e indipendenti trasformate in logica? Questo è l’argomento di questo articolo.
Prima forniremo una ricetta per l’interpretazione per coloro che vogliono solo un aiuto veloce. Poi scaveremo un po’ più a fondo in quello che stiamo dicendo sul nostro modello quando trasformiamo logicamente i nostri dati.
Regole per l’interpretazione
OK, avete eseguito una regressione/adattato un modello lineare e alcune delle vostre variabili sono log-trasformate.
- Solo la variabile dipendente/risposta è log-trasformata. Esponenziate il coefficiente, sottraete uno da questo numero e moltiplicate per 100. Questo dà l’aumento (o la diminuzione) percentuale della risposta per ogni aumento di una unità della variabile indipendente. Esempio: il coefficiente è 0,198. (exp(0,198) – 1) * 100 = 21,9. Per ogni aumento di una unità della variabile indipendente, la nostra variabile dipendente aumenta di circa il 22%.
- Solo la variabile indipendente/predittrice è log-trasformata. Dividere il coefficiente per 100. Questo ci dice che un aumento dell’1% della variabile indipendente aumenta (o diminuisce) la variabile dipendente di (coefficiente/100) unità. Esempio: il coefficiente è 0,198. 0.198/100 = 0.00198. Per ogni 1% di aumento della variabile indipendente, la nostra variabile dipendente aumenta di circa 0,002. Per un aumento di x per cento, moltiplicare il coefficiente per log(1,x). Esempio: Per ogni aumento del 10% della variabile indipendente, la nostra variabile dipendente aumenta di circa 0,198 * log(1,10) = 0,02.
- Sia la variabile dipendente/risposta che la variabile indipendente/predittrice sono trasformate in log. Interpretare il coefficiente come l’aumento percentuale della variabile dipendente per ogni 1% di aumento della variabile indipendente. Esempio: il coefficiente è 0,198. Per ogni 1% di aumento della variabile indipendente, la nostra variabile dipendente aumenta di circa 0,20%. Per l’aumento percentuale x, calcolare 1,x alla potenza del coefficiente, sottrarre 1 e moltiplicare per 100. Esempio: Per ogni aumento del 20% della variabile indipendente, la nostra variabile dipendente aumenta di circa (1,20 0,198 – 1) * 100 = 3,7%.
Cosa significano davvero le trasformazioni logiche per i tuoi modelli
È bello sapere come interpretare correttamente i coefficienti per i dati logici, ma è importante sapere cosa implica esattamente il tuo modello quando include dati logici. Per ottenere una migliore comprensione, usiamo R per simulare alcuni dati che richiedono trasformazioni logiche per un’analisi corretta. Lo terremo semplice con una variabile indipendente ed errori normalmente distribuiti. Prima guarderemo una variabile dipendente log-trasformata.
x <- seq(0.1,5,length.out = 100)set.seed(1)e <- rnorm(100, mean = 0, sd = 0.2)
La prima linea genera una sequenza di 100 valori da 0,1 a 5 e la assegna a x. La linea successiva imposta il seme del generatore di numeri casuali a 1. Se fate lo stesso, otterrete gli stessi dati generati casualmente che abbiamo ottenuto quando eseguite la linea successiva. Il codice rnorm(100, mean = 0, sd = 0.2)
genera 100 valori da una distribuzione normale con una media di 0 e una deviazione standard di 0,2. Questo sarà il nostro “errore”. Questo è uno dei presupposti della regressione lineare semplice: i nostri dati possono essere modellati con una linea retta ma saranno fuori di una certa quantità casuale che supponiamo provenga da una distribuzione normale con media 0 e una certa deviazione standard. Assegniamo il nostro errore a e.
Ora siamo pronti a creare la nostra variabile dipendente log-trasformata. Scegliamo un’intercetta (1,2) e una pendenza (0,2), che moltiplichiamo per x, e poi aggiungiamo il nostro errore casuale, e. Infine esponenziamo.
y <- exp(1.2 + 0.2 * x + e)
Per vedere perché esponenziamo, notate quanto segue:
$$${log}(y) = \beta_0 + \beta_1x$$
$$${exp}(\testo{log}(y)) = \testo{exp}(\beta_0 + \beta_1x)$$
$y = \testo{exp}(\beta_0 + \beta_1x)$$
Quindi una variabile dipendente trasformata log-trasformata implica che il nostro semplice modello lineare è stato esponenziato. Ricordiamo dalla regola del prodotto degli esponenti che possiamo riscrivere l’ultima riga sopra come
$y = \testo{exp}(\beta_0) \testo{exp}(\beta_1x)$$
Questo implica inoltre che la nostra variabile indipendente ha una relazione moltiplicativa con la nostra variabile dipendente invece della solita relazione additiva. Da qui la necessità di esprimere l’effetto di un cambiamento di una unità in x su y come percentuale.
Se adattiamo il modello corretto ai dati, notiamo che facciamo un buon lavoro nel recuperare i veri valori dei parametri che abbiamo usato per generare i dati.
lm1 <- lm(log(y) ~ x)summary(lm1)Call:lm(formula = log(y) ~ x)Residuals: Min 1Q Median 3Q Max -0.4680 -0.1212 0.0031 0.1170 0.4595 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 1.22643 0.03693 33.20 <2e-16 ***x 0.19818 0.01264 15.68 <2e-16 ***---Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1Residual standard error: 0.1805 on 98 degrees of freedomMultiple R-squared: 0.7151,Adjusted R-squared: 0.7122 F-statistic: 246 on 1 and 98 DF, p-value: < 2.2e-16
L’intercetta stimata di 1,226 è vicina al vero valore di 1,2. La pendenza stimata di 0,198 è molto vicina al vero valore di 0,2. Infine l’errore standard residuo stimato di 0,1805 non è troppo lontano dal valore vero di 0,2.
Ricordiamo che per interpretare il valore della pendenza dobbiamo esponenziarlo.
exp(coef(lm1)) x 1.219179
Questo dice che ogni aumento di una unità di x è moltiplicato per circa 1,22. O in altre parole, per ogni aumento di una unità di x, y aumenta di circa il 22%. Per ottenere il 22%, sottrarre 1 e moltiplicare per 100.
(exp(coef(lm1)) - 1) * 100 x 21.91786
E se adattassimo solo y invece di log(y)? Come potremmo capire che dovremmo considerare una trasformazione log? Guardare semplicemente i coefficienti non vi dirà molto.
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
Sicuramente, dato che abbiamo generato i dati, possiamo vedere che i coefficienti sono lontani e l’errore standard residuo è troppo alto. Ma nella vita reale non lo saprete! Questo è il motivo per cui facciamo la diagnostica di regressione. Un’assunzione chiave da controllare è la varianza costante degli errori. Possiamo farlo con un diagramma Scala-Localizzazione. Ecco il grafico per il modello che abbiamo appena eseguito senza trasformare logicamente y.
plot(lm2, which = 3) # 3 = Scale-Location plot
Nota che i residui standardizzati tendono verso l’alto. Questo è un segno che l’ipotesi di varianza costante è stata violata. Confronta questo grafico con lo stesso grafico per il modello corretto.
plot(lm1, which = 3)
La linea di tendenza è uniforme e i residui sono uniformemente sparsi.
Questo significa che dovreste sempre log-trasformare la vostra variabile dipendente se sospettate che l’assunzione di varianza costante sia stata violata? Non necessariamente. La varianza non costante può essere dovuta ad altri errori di specificazione nel vostro modello. Pensate anche a cosa significa modellare una variabile dipendente trasformata logicamente. Dice che ha una relazione moltiplicativa con i predittori. Vi sembra giusto? Usate il vostro giudizio e la vostra esperienza in materia.
Ora consideriamo i dati con una variabile predittrice indipendente logoriformata. Questo è più facile da generare. Semplicemente log-trasformiamo x.
y <- 1.2 + 0.2*log(x) + e
Ancora una volta adattiamo il modello corretto e notiamo che fa un ottimo lavoro nel recuperare i veri valori che abbiamo usato per generare i dati:
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
Per interpretare il coefficiente di pendenza lo dividiamo per 100.
coef(lm3)/100 log(x) 0.001997892
Questo ci dice che un aumento dell’1% di x aumenta la variabile dipendente di circa 0,002. Perché ci dice questo? Facciamo un po’ di conti. Di seguito calcoliamo il cambiamento di y quando si cambia x da 1 a 1,01 (cioè, un aumento dell’1%).
$$(\beta_0 + \beta_1\text{log}1.01) – (\beta_0 + \beta_1\text{log}1)$$
$$ $beta_1\text{log}1.01 – \beta_1\text{log}1$$
$$\beta_1(\text{log}1.01 – \testo{log}1)$$
$$$beta_1\testo{log}\frac{1.01}{1} = \beta_1\testo{log}1.01$$
Il risultato è moltiplicare il coefficiente di pendenza per log(1.01), che è approssimativamente uguale a 0.01, o \(\frac{1}{100}\). Da qui l’interpretazione che un aumento dell’1% di x aumenta la variabile dipendente del coefficiente/100.
Ancora una volta adattiamo il modello sbagliato non specificando una trasformazione logaritmica per x nella sintassi del modello.
lm4 <- lm(y ~ x)
Guardando un riassunto del modello si vedrà che le stime dei coefficienti sono ben lontane dai valori veri. Ma in pratica non conosciamo mai i veri valori. Ancora una volta la diagnostica è necessaria per valutare l’adeguatezza del modello. Una diagnostica utile in questo caso è un grafico dei residui parziali che può rivelare le deviazioni dalla linearità. Ricordiamo che i modelli lineari assumono che i predittori siano additivi e abbiano una relazione lineare con la variabile di risposta. Il pacchetto auto fornisce la funzione crPlot per creare rapidamente grafici residuali parziali. Basta darle l’oggetto modello e specificare per quale variabile si vuole creare il grafico dei residui parziali.
library(car)crPlot(lm4, variable = "x")
La linea retta rappresenta la relazione specificata tra x e y. La linea curva è una linea di tendenza morbida che riassume la relazione osservata tra x e y. Possiamo dire che la relazione osservata non è lineare. Confrontate questo grafico con il grafico parziale-residuo per il modello corretto.
crPlot(lm3, variable = "log(x)")
Le linee lisce e montate sono proprio una sopra l’altra e non rivelano gravi deviazioni dalla linearità.
Questo non significa che se vedete delle deviazioni dalla linearità dovete immediatamente assumere che una trasformazione di log sia la sola e unica soluzione! La relazione non lineare può essere complessa e non si spiega così facilmente con una semplice trasformazione. Ma una trasformazione log può essere adatta in questi casi e certamente qualcosa da considerare.
Finalmente consideriamo i dati in cui sia la variabile dipendente che quella indipendente sono trasformate logicamente.
y <- exp(1.2 + 0.2 * log(x) + e)
Guardate attentamente il codice sopra. La relazione tra x e y è ora sia moltiplicativa che non lineare!
Come al solito possiamo adattare il modello corretto e notare che fa un lavoro fantastico nel recuperare i veri valori che abbiamo usato per generare i dati:
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
Interpretate il coefficiente x come l’aumento percentuale di y per ogni 1% di aumento di x. In questo caso si tratta di un aumento dello 0,2% di y per ogni 1% di aumento di x.
Applicare il modello sbagliato produce ancora una volta stime dei coefficienti e degli errori standard residui che sono selvaggiamente fuori obiettivo.
lm6 <- lm(y ~ x)summary(lm6)
I grafici Scala-Localizzazione e Parziale-Residuale forniscono la prova che qualcosa non va nel nostro modello. Il grafico Scale-Location mostra una linea di tendenza curvilinea e il grafico Partial-Residual mostra linee lineari e lisce che non corrispondono.
plot(lm6, which = 3)
crPlot(lm6, variable = "x")
Come potremmo sapere nella vita reale che il modello corretto richiede variabili indipendenti e dipendenti trasformate logicamente? Non lo sapremmo. Potremmo avere un’intuizione basata su grafici diagnostici ed esperienza di modellazione. Oppure potremmo avere una certa esperienza sul processo che stiamo modellando e avere buone ragioni per pensare che la relazione sia moltiplicativa e non lineare.
Spero che ora abbiate una migliore comprensione non solo di come interpretare le variabili trasformate in log in un modello lineare, ma anche di cosa significano le variabili trasformate in log per il vostro modello.
Per domande o chiarimenti su questo articolo, contatta lo StatLab della UVA Library: [email protected]
Vedi l’intera collezione di articoli dello StatLab della UVA Library.
Clay Ford
Consulente di ricerca statistica
University of Virginia Library
Agosto 17, 2018