Logtransformationer anbefales ofte til skæve data, som f.eks. monetære mål eller visse biologiske og demografiske mål. Logtransformation af data har normalt den virkning, at klumper af data spredes ud og spredte data samles. Nedenfor er f.eks. et histogram over arealerne i alle 50 amerikanske stater. Det er skævt til højre på grund af Alaska, Californien, Texas og nogle få andre.

hist(state.area)

Efter en logtransformation bemærkes det, at histogrammet er mere eller mindre symmetrisk. Vi har flyttet de store tilstande tættere sammen og spredt de mindre tilstande ud.

hist(log(state.area))

Hvorfor gør vi dette? En af grundene er at gøre dataene mere “normale”, eller symmetriske. Hvis vi udfører en statistisk analyse, der forudsætter normalitet, kan en logtransformation hjælpe os med at opfylde denne antagelse. En anden grund er at hjælpe med at opfylde antagelsen om konstant varians i forbindelse med lineær modellering. En anden er at hjælpe med at gøre et ikke-lineært forhold mere lineært. Men selv om det er let at gennemføre en logtransformation, kan det komplicere fortolkningen. Lad os sige, at vi tilpasser en lineær model med en log-transformeret afhængig variabel. Hvordan skal vi fortolke koefficienterne? Hvad hvis vi har log-transformerede afhængige og uafhængige variabler? Det er emnet for denne artikel.

Først vil vi give en opskrift på fortolkning til dem, der bare ønsker hurtig hjælp. Derefter vil vi grave lidt dybere ned i, hvad vi siger om vores model, når vi log-transformerer vores data.

Regler for fortolkning

OK, du har kørt en regression/tilpasset en lineær model, og nogle af dine variabler er log-transformeret.

  1. Det er kun den afhængige/responsvariabel, der er log-transformeret. Eksponér koefficienten, træk 1 fra dette tal, og gang med 100. Dette giver den procentvise stigning (eller fald) i responsen for hver stigning på én enhed i den uafhængige variabel. Eksempel: Koefficienten er 0,198. (exp(0,198) – 1) * 100 = 21,9. For hver stigning på én enhed i den uafhængige variabel stiger vores afhængige variabel med ca. 22 %.
  2. Kun de(n) uafhængige/forudsigelige variabel(er) er log-transformeret(e). Divider koefficienten med 100. Dette fortæller os, at en stigning på 1 % i den uafhængige variabel øger (eller reducerer) den afhængige variabel med (koefficient/100) enheder. Eksempel: Koefficienten er 0,198. 0.198/100 = 0.00198. For hver 1 % stigning i den uafhængige variabel stiger vores afhængige variabel med ca. 0,002. For x procent stigning skal koefficienten ganges med log(1,x). Eksempel: For hver 10 % stigning i den uafhængige variabel stiger vores afhængige variabel med ca. 0,198 * log(1,10) = 0,02.
  3. Både den afhængige/responsvariabel og den uafhængige/forudsigelsesvariabel(er) er log-transformeret. Fortolk koefficienten som den procentvise stigning i den afhængige variabel for hver 1 % stigning i den uafhængige variabel. Eksempel: Koefficienten er 0,198. For hver 1 % stigning i den uafhængige variabel stiger vores afhængige variabel med ca. 0,20 %. For x procentvis stigning beregnes 1,x til potensen af koefficienten, fratrækkes 1 og ganges med 100. Eksempel: For hver 20 % stigning i den uafhængige variabel øges vores afhængige variabel med ca. (1,20 0,198 – 1) * 100 = 3,7 %.

Hvad logtransformationer virkelig betyder for dine modeller

Det er rart at vide, hvordan man korrekt fortolker koefficienter for logtransformerede data, men det er vigtigt at vide, hvad din model præcist antyder, når den omfatter logtransformerede data. For at få en bedre forståelse skal vi bruge R til at simulere nogle data, der vil kræve log-transformationer for at få en korrekt analyse. Vi holder det simpelt med én uafhængig variabel og normalfordelte fejl. Først ser vi på en log-transformeret afhængig variabel.

x <- seq(0.1,5,length.out = 100)set.seed(1)e <- rnorm(100, mean = 0, sd = 0.2)

Den første linje genererer en sekvens af 100 værdier fra 0,1 til 5 og tildeler den til x. Den næste linje sætter random number generator seed til 1. Hvis du gør det samme, vil du få de samme tilfældigt genererede data, som vi fik, når du kører den næste linje. Koden rnorm(100, mean = 0, sd = 0.2) genererer 100 værdier fra en normalfordeling med en middelværdi på 0 og en standardafvigelse på 0,2. Dette vil være vores “fejl”. Dette er en af forudsætningerne for simpel lineær regression: vores data kan modelleres med en lige linje, men vil afvige med et tilfældigt beløb, som vi antager kommer fra en normalfordeling med middelværdi 0 og en vis standardafvigelse. Vi tildeler vores fejl til e.

Nu er vi klar til at oprette vores log-transformerede afhængige variabel. Vi vælger et intercept (1,2) og en hældning (0,2), som vi multiplicerer med x, og derefter tilføjer vi vores tilfældige fejl, e. Til sidst eksponerer vi.

y <- exp(1.2 + 0.2 * x + e)

For at se, hvorfor vi eksponerer, skal du bemærke følgende:

$$$\text{log}(y) = \beta_0 + \beta_1x$$$
$$$\text{exp}(\text{log}(y))) = \text{exp}(\beta_0 + \beta_1x)$$
$$$y = \text{exp}(\beta_0 + \beta_1x)$$

Så en log-transformeret afhængig variabel betyder, at vores simple lineære model er blevet eksponentiel. Husk fra produktreglen for eksponenter, at vi kan omskrive den sidste linje ovenfor som

$$$y = \text{exp}(\beta_0) \text{exp}(\beta_1x)$$

Dette indebærer endvidere, at vores uafhængige variabel har en multiplikativ sammenhæng med vores afhængige variabel i stedet for den sædvanlige additive sammenhæng. Derfor er det nødvendigt at udtrykke virkningen af en ændring på én enhed i x på y som en procentdel.

Hvis vi tilpasser den korrekte model til dataene, bemærker vi, at vi gør et ret godt stykke arbejde med at genfinde de sande parameterværdier, som vi brugte til at generere dataene.

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

Det estimerede intercept på 1,226 er tæt på den sande værdi på 1,2. Den estimerede hældning på 0,198 er meget tæt på den sande værdi på 0,2. Endelig er den estimerede residualstandardfejl på 0,1805 ikke for langt fra den sande værdi på 0,2.

Husk, at for at fortolke hældningsværdien skal vi eksponere den.

exp(coef(lm1)) x 1.219179 

Det betyder, at hver gang x stiger med en enhed, multipliceres det med ca. 1,22. Eller med andre ord: For hver gang x stiger med en enhed, stiger y med ca. 22 %. For at få 22 % skal du trække 1 fra og gange med 100.

(exp(coef(lm1)) - 1) * 100 x 21.91786 

Hvad nu, hvis vi passer bare y i stedet for log(y)? Hvordan kan vi finde ud af, at vi skal overveje en logtransformation? Det siger ikke meget at se på koefficienterne alene.

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

Sikkert, da vi har genereret dataene, kan vi se, at koefficienterne er helt forkerte, og at residualstandardfejlen er alt for høj. Men i det virkelige liv vil du ikke vide det! Det er derfor, vi laver regressionsdiagnostik. En vigtig antagelse, der skal kontrolleres, er konstant varians af fejlene. Vi kan gøre dette med et Scale-Location-plot. Her er plottet for den model, vi lige har kørt uden logtransformation af y.

plot(lm2, which = 3) # 3 = Scale-Location plot

Bemærk, at de standardiserede residualer har en tendens til at stige. Dette er et tegn på, at antagelsen om konstant varians er blevet overtrådt. Sammenlign dette plot med det samme plot for den korrekte model.

plot(lm1, which = 3)

Trendlinjen er jævn, og residualerne er jævnt spredt.

Betyder det, at man altid skal log-transformere sin afhængige variabel, hvis man har mistanke om, at antagelsen om konstantvarians er blevet overtrådt? Ikke nødvendigvis. Den ikke-konstante varians kan skyldes andre fejlspecifikationer i din model. Tænk også over, hvad modellering af en log-transformeret afhængig variabel betyder. Det betyder, at den har et multiplikativt forhold til prædiktorerne. Virker det rigtigt? Brug din dømmekraft og din faglige ekspertise.

Nu skal vi overveje data med en log-transformeret uafhængig prædiktorvariabel. Dette er lettere at generere. Vi log-transformerer simpelthen x.

y <- 1.2 + 0.2*log(x) + e

Nok en gang passer vi først den korrekte model og bemærker, at den gør et godt stykke arbejde med at genfinde de sande værdier, som vi brugte til at generere dataene:

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

For at fortolke hældningskoefficienten dividerer vi den med 100.

coef(lm3)/100 log(x) 0.001997892 

Dette fortæller os, at en stigning på 1 % i x øger den afhængige variabel med ca. 0,002. Hvorfor fortæller den os dette? Lad os regne lidt på det. Nedenfor beregner vi ændringen i y, når vi ændrer x fra 1 til 1,01 (dvs. en stigning på 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 – \text{log}1)$$$
$$$\beta_1\text{log}\frac{1.01}{1} = \beta_1\text{log}1.01$$$

Resultatet er at multiplicere hældningskoefficienten med log(1.01), hvilket er omtrent lig med 0.01, eller \(\frac{1}{100}\). Heraf fortolkningen, at en stigning på 1 % i x øger den afhængige variabel med koefficienten/100.

Lad os endnu en gang tilpasse den forkerte model ved at undlade at angive en log-transformation for x i modelsyntaksen.

lm4 <- lm(y ~ x)

Visning af et resumé af modellen vil afsløre, at estimaterne af koefficienterne ligger et godt stykke fra de sande værdier. Men i praksis kender vi aldrig de sande værdier. Endnu en gang er diagnostik på sin plads for at vurdere modellens tilstrækkelighed. En nyttig diagnose i dette tilfælde er et partielt residualplot, som kan afsløre afvigelser fra linearitet. Husk, at lineære modeller forudsætter, at prædiktorerne er additive og har et lineært forhold til responsvariablen. Car-pakken indeholder funktionen crPlot til hurtigt at oprette partielle residualplots. Du skal blot give den modelobjektet og angive hvilken variabel du ønsker at oprette det partielle residualplot for.

library(car)crPlot(lm4, variable = "x")

Den lige linje repræsenterer den angivne sammenhæng mellem x og y. Den kurvede linje er en glat tendenslinje, der opsummerer den observerede sammenhæng mellem x og y. Vi kan se, at den observerede sammenhæng er ikke-lineær. Sammenlign dette plot med det partielle residualplot for den korrekte model.

crPlot(lm3, variable = "log(x)")

De glatte og tilpassede linjer ligger lige oven på hinanden, hvilket afslører ingen alvorlige afvigelser fra linearitet.

Det betyder ikke, at hvis man ser afvigelser fra linearitet, skal man straks antage, at en logtransformation er den eneste løsning! Den ikke-lineære sammenhæng kan være kompleks og ikke så let forklares med en simpel transformation. Men en logtransformation kan være egnet i sådanne tilfælde og er bestemt noget, man bør overveje.

Lad os endelig overveje data, hvor både den afhængige og den uafhængige variabel er logtransformeret.

y <- exp(1.2 + 0.2 * log(x) + e)

Se nærmere på ovenstående kode. Forholdet mellem x og y er nu både multiplikativt og ikke-lineært!

Som sædvanlig kan vi tilpasse den korrekte model og bemærke, at den gør et fantastisk godt stykke arbejde med at genfinde de sande værdier, som vi brugte til at generere dataene:

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

Interpret x-koefficienten som den procentvise stigning i y for hver 1% stigning i x. I dette tilfælde er det ca. en stigning på 0,2 % i y for hver 1 % stigning i x.

Anpassning af den forkerte model giver endnu en gang koefficient- og residualstandardfejlestimater, der er helt ude af mål.

lm6 <- lm(y ~ x)summary(lm6)

Skala-placering og partielle-residualdiagrammer giver beviser for, at der er noget galt med vores model. Scale-Location-plottet viser en kurvet tendenslinje, og Partial-Residual-plottet viser lineære og glatte linjer, der ikke stemmer overens.

plot(lm6, which = 3)

crPlot(lm6, variable = "x")

Hvordan ville vi i det virkelige liv vide, at den korrekte model kræver log-transformerede uafhængige og afhængige variabler? Det ville vi ikke. Vi kunne have en fornemmelse baseret på diagnostiske plot og erfaring med modellering. Eller vi har måske en vis faglig ekspertise inden for den proces, vi modellerer, og har god grund til at tro, at forholdet er multiplikativt og ikke-lineært.

Håber du nu har fået bedre styr på ikke blot hvordan log-transformerede variabler i en lineær model skal fortolkes, men også hvad log-transformerede variabler betyder for din model.

For spørgsmål eller afklaringer vedrørende denne artikel kan du kontakte UVA Library StatLab: [email protected]

Se hele samlingen af UVA Library StatLab-artikler.

Clay Ford
Statistisk forskningskonsulent
University of Virginia Library
17. august 2018

admin

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.

lg