Log transformaties worden vaak aanbevolen voor scheve gegevens, zoals monetaire maatstaven of bepaalde biologische en demografische maatstaven. Logtransformatie van gegevens heeft meestal tot gevolg dat klonters gegevens worden uitgesmeerd en dat uitgespreide gegevens worden samengebracht. Hieronder staat bijvoorbeeld een histogram van de oppervlakten van alle 50 Amerikaanse staten. Het is schuin naar rechts door Alaska, Californië, Texas en enkele andere staten.
hist(state.area)
Na een logtransformatie ziet u dat het histogram min of meer symmetrisch is. We hebben de grote staten dichter bij elkaar gebracht en de kleinere staten uit elkaar geplaatst.
hist(log(state.area))
Waarom doen we dit? Eén reden is om de gegevens “normaler”, of symmetrischer te maken. Als we een statistische analyse uitvoeren waarbij normaliteit wordt verondersteld, kan een log-transformatie ons helpen aan deze veronderstelling te voldoen. Een andere reden is om te voldoen aan de aanname van constante variantie in de context van lineaire modellering. Nog een andere is om een niet-lineaire relatie meer lineair te maken. Maar hoewel het gemakkelijk is om een log-transformatie toe te passen, kan dit de interpretatie bemoeilijken. Stel dat we een lineair model toepassen met een log-getransformeerde afhankelijke variabele. Hoe interpreteren we de coëfficiënten? Wat als we afhankelijke en onafhankelijke variabelen log-getransformeerd hebben? Dat is het onderwerp van dit artikel.
Eerst geven we een recept voor interpretatie voor degenen die gewoon wat snelle hulp willen. Daarna zullen we wat dieper ingaan op wat we zeggen over ons model als we onze gegevens log-transformeren.
Regels voor interpretatie
OK, je hebt een regressie/fit een lineair model uitgevoerd en sommige van je variabelen zijn log-getransformeerd.
- Alleen de afhankelijke/responsvariabele is log-getransformeerd. Exponeer de coëfficiënt, trek één van dit getal af en vermenigvuldig met 100. Dit geeft de procentuele toename (of afname) in de respons voor elke toename van één eenheid in de onafhankelijke variabele. Voorbeeld: de coëfficiënt is 0,198. (exp(0,198) – 1) * 100 = 21,9. Voor elke toename van één eenheid in de onafhankelijke variabele neemt onze afhankelijke variabele met ongeveer 22% toe.
- Alleen de onafhankelijke/voorspellende variabele(n) is/zijn log-getransformeerd. Deel de coëfficiënt door 100. Dit vertelt ons dat een toename van 1% in de onafhankelijke variabele de afhankelijke variabele verhoogt (of verlaagt) met (coëfficiënt/100) eenheden. Voorbeeld: de coëfficiënt is 0,198. 0.198/100 = 0.00198. Voor elke toename van 1% in de onafhankelijke variabele, neemt onze afhankelijke variabele toe met ongeveer 0,002. Voor x procent toename, vermenigvuldig de coëfficiënt met log(1.x). Voorbeeld: Voor elke 10% toename in de onafhankelijke variabele, neemt onze afhankelijke variabele toe met ongeveer 0,198 * log(1,10) = 0,02.
- Zowel de afhankelijke/responsvariabele als de onafhankelijke/voorspellende variabele(n) zijn log-getransformeerd. Interpreteer de coëfficiënt als de procentuele toename in de afhankelijke variabele voor elke 1% toename in de onafhankelijke variabele. Voorbeeld: de coëfficiënt is 0,198. Voor elke toename van 1% in de onafhankelijke variabele, neemt onze afhankelijke variabele toe met ongeveer 0,20%. Voor x procent toename, bereken 1,x tot de macht van de coëfficiënt, trek 1 af, en vermenigvuldig met 100. Voorbeeld: Voor elke 20% toename in de onafhankelijke variabele, neemt onze afhankelijke variabele toe met ongeveer (1,20 0,198 – 1) * 100 = 3,7 procent.
Wat logtransformaties werkelijk betekenen voor uw modellen
Het is leuk om te weten hoe coëfficiënten voor log-geformeerde gegevens correct moeten worden geïnterpreteerd, maar het is belangrijk om te weten wat uw model precies impliceert wanneer het log-geformeerde gegevens bevat. Om dit beter te begrijpen, zullen we R gebruiken om enkele gegevens te simuleren die log-getransformeerde gegevens vereisen voor een correcte analyse. We houden het eenvoudig met één onafhankelijke variabele en normaal verdeelde fouten. Eerst bekijken we een log-getransformeerde afhankelijke variabele.
x <- seq(0.1,5,length.out = 100)set.seed(1)e <- rnorm(100, mean = 0, sd = 0.2)
De eerste regel genereert een reeks van 100 waarden van 0,1 tot 5 en kent die toe aan x. De volgende regel stelt het zaad van de random number generator in op 1. Als u hetzelfde doet, krijgt u dezelfde willekeurig gegenereerde gegevens die we kregen wanneer u de volgende regel uitvoert. De code rnorm(100, mean = 0, sd = 0.2)
genereert 100 waarden van een normale verdeling met een gemiddelde van 0 en standaardafwijking van 0.2. Dit zal onze “fout” zijn. Dit is een van de aannames van eenvoudige lineaire regressie: onze gegevens kunnen worden gemodelleerd met een rechte lijn, maar zullen afwijken met een willekeurige hoeveelheid waarvan we aannemen dat die afkomstig is van een normale verdeling met gemiddelde 0 en een standaardafwijking. We kennen onze fout toe aan e.
Nu zijn we klaar om onze log-getransformeerde afhankelijke variabele te maken. We kiezen een intercept (1,2) en een helling (0,2), die we vermenigvuldigen met x, en dan voegen we onze toevallige fout, e. Tot slot exponentiëren we.
y <- exp(1.2 + 0.2 * x + e)
Om te zien waarom we exponentiëren, moet u het volgende opmerken:
$$\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)$$
Dus een log-getransformeerde afhankelijke variabele impliceert dat ons eenvoudig lineair model geëxponeerd is. Met behulp van de productregel van exponenten kunnen we de laatste regel herschrijven als
$$y = \text{exp}(\beta_0) \text{exp}(\beta_1x)$$
Dit impliceert verder dat onze onafhankelijke variabele een multiplicatieve relatie heeft met onze afhankelijke variabele in plaats van de gebruikelijke additieve relatie. Vandaar de noodzaak om het effect van een verandering van één eenheid in x op y in procenten uit te drukken.
Als we het juiste model op de gegevens toepassen, zien we dat we de werkelijke parameterwaarden die we hebben gebruikt om de gegevens te genereren, vrij goed terugvinden.
Het geschatte intercept van 1,226 ligt dicht bij de werkelijke waarde van 1,2. De geschatte helling van 0,198 ligt dicht bij de werkelijke waarde van 1,2. De geschatte helling van 0,198 ligt zeer dicht bij de werkelijke waarde van 0,2. Tenslotte ligt de geschatte residuele standaardafwijking van 0,1805 niet al te ver van de werkelijke waarde van 0,2.
Werk eraan dat we de hellingswaarde moeten exponentiëren om deze te interpreteren.
exp(coef(lm1)) x 1.219179
Dit betekent dat elke toename van x met één eenheid met ongeveer 1,22 wordt vermenigvuldigd. Of met andere woorden, voor elke toename van x met 1 eenheid, neemt y toe met ongeveer 22%. Om 22% te krijgen, trek je 1 af en vermenigvuldig je met 100.
(exp(coef(lm1)) - 1) * 100 x 21.91786
Wat als we alleen y gebruiken in plaats van log(y)? Hoe komen we er dan achter dat we een log-transformatie moeten overwegen? Als je alleen naar de coëfficiënten kijkt, zie je niet veel.
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
Zeker, omdat we de gegevens hebben gegenereerd, kunnen we zien dat de coëfficiënten er ver naast zitten en dat de residuele standaardfout veel te hoog is. Maar in het echte leven zult u dit niet weten! Daarom doen wij aan regressiediagnostiek. Een belangrijke aanname om te controleren is een constante variantie van de fouten. Wij kunnen dit doen met een schaal-locatie diagram. Hier is de plot voor het model dat we zojuist hebben uitgevoerd zonder y te loggen.
plot(lm2, which = 3) # 3 = Scale-Location plot
Merk op dat de gestandaardiseerde residuen een stijgende trend vertonen. Dit is een teken dat de aanname van constante variantie is geschonden. Vergelijk deze plot met dezelfde plot voor het correcte model.
plot(lm1, which = 3)
De trendlijn is gelijkmatig en de residuen zijn gelijkmatig verspreid.
Betekent dit dat u uw afhankelijke variabele altijd moet log-transformeren als u vermoedt dat de aanname van constante variantie is geschonden? Dat hoeft niet. De niet-constante variantie kan het gevolg zijn van andere foutieve specificaties in uw model. Denk ook eens na over wat het modelleren van een log-getransformeerde afhankelijke variabele betekent. Het zegt dat het een multiplicatieve relatie heeft met de voorspellers. Lijkt dat juist? Gebruik uw oordeel en vakkennis.
Nu gaan we eens kijken naar gegevens met een log-getransformeerde onafhankelijke voorspellende variabele. Dit is gemakkelijker te genereren. We log-transformeren x.
y <- 1.2 + 0.2*log(x) + e
Nogmaals passen we eerst het juiste model en zien dat het de werkelijke waarden die we hebben gebruikt om de gegevens te genereren, goed weergeeft:
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
Om de hellingscoëfficiënt te interpreteren, delen we deze door 100.
coef(lm3)/100 log(x) 0.001997892
Dit vertelt ons dat een toename van 1% in x de afhankelijke variabele met ongeveer 0,002 doet toenemen. Waarom zegt het ons dit? Laten we eens wat wiskunde doen. Hieronder berekenen we de verandering in y bij verandering van x van 1 naar 1,01 (d.w.z. een toename van 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 – \beta_1\text{log}1.01) – \beta_1.01.$$
$
$$\beta_1(\text{log}1.01.01 – \text{log}1)$$
$$\beta_1text{log}\frac{1.01}{1} = \beta_1text{log}1.01$$
Het resultaat is de vermenigvuldiging van de hellingscoëfficiënt met log(1.01), die ongeveer gelijk is aan 0.01, of \(\frac{1}{100}}). Vandaar de interpretatie dat een toename van x met 1% de afhankelijke variabele doet toenemen met de coëfficiënt/100.
Wederom passen we het verkeerde model toe door in de modelsyntax geen log-transformatie voor x op te geven.
lm4 <- lm(y ~ x)
Bij het bekijken van een samenvatting van het model zal blijken dat de schattingen van de coëfficiënten ver van de werkelijke waarden afliggen. Maar in de praktijk kennen we de werkelijke waarden nooit. Opnieuw is een diagnose nodig om de geschiktheid van het model te beoordelen. Een nuttige diagnostiek in dit geval is een partieel-residuele plot die afwijkingen van de lineariteit aan het licht kan brengen. Herinner u dat lineaire modellen veronderstellen dat de voorspellers additief zijn en een lineair verband hebben met de responsvariabele. Het autopakket bevat de functie crPlot om snel partieel-residuele plots te maken. Geef de functie het modelobject en specificeer voor welke variabele u de partiële residu-plot wilt maken.
library(car)crPlot(lm4, variable = "x")
De rechte lijn vertegenwoordigt de gespecificeerde relatie tussen x en y. De gebogen lijn is een vloeiende trendlijn die de waargenomen relatie tussen x en y samenvat. We kunnen zien dat de waargenomen relatie niet-lineair is. Vergelijk deze plot met de partiële-residuele plot voor het correcte model.
crPlot(lm3, variable = "log(x)")
De vloeiende en de gepaste lijnen liggen precies op elkaar en vertonen geen ernstige afwijkingen van de lineariteit.
Dit betekent niet dat als u afwijkingen van de lineariteit ziet, u er onmiddellijk van uit moet gaan dat een log-transformatie de enige oplossing is! Het niet-lineaire verband kan complex zijn en niet zo gemakkelijk te verklaren met een eenvoudige transformatie. Maar een log-transformatie kan in dergelijke gevallen geschikt zijn en zeker iets om te overwegen.
Laten we tenslotte eens kijken naar gegevens waarbij zowel de afhankelijke als de onafhankelijke variabelen log getransformeerd zijn.
y <- exp(1.2 + 0.2 * log(x) + e)
Kijk eens goed naar de bovenstaande code. Het verband tussen x en y is nu zowel multiplicatief als niet-lineair!
Zoals gebruikelijk kunnen we het juiste model toepassen en zien dat het fantastisch werk levert bij het herstellen van de werkelijke waarden die we hebben gebruikt om de gegevens te genereren:
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
Beteken de x-coëfficiënt als de procentuele toename in y voor elke 1% toename in x. In dit geval is dat ongeveer 0,2% toename in y voor elke 1% toename in x.
Aanpassing van het verkeerde model levert opnieuw coëfficiënt- en residuele standaardfoutschattingen op die sterk uit de pas lopen.
lm6 <- lm(y ~ x)summary(lm6)
De schaal-locatie- en partiële-restpercentagescurven tonen aan dat er iets mis is met ons model. De schaal-locatieplot vertoont een kromme trendlijn en de partiële-residuele plot vertoont lineaire en vloeiende lijnen die niet met elkaar overeenkomen.
plot(lm6, which = 3)
crPlot(lm6, variable = "x")
Hoe zouden we in het echte leven weten dat voor het juiste model log-getransformeerde onafhankelijke en afhankelijke variabelen nodig zijn? Dat weten we niet. Misschien hebben we een vermoeden op basis van diagnostische grafieken en modelleerervaring. Of we hebben misschien materiedeskundigheid over het proces dat we modelleren en hebben goede redenen om te denken dat de relatie multiplicatief en niet-lineair is.
Hopelijk heb je nu niet alleen een beter inzicht in hoe je log-geformeerde variabelen in een lineair model moet interpreteren, maar ook wat log-geformeerde variabelen voor je model betekenen.
Voor vragen of verduidelijkingen over dit artikel kunt u contact opnemen met de UVA Library StatLab: [email protected]
Bekijk de hele collectie UVA Library StatLab artikelen.
Clay Ford
Statistical Research Consultant
University of Virginia Library
Augustus 17, 2018