Logtransformationer rekommenderas ofta för skeva data, t.ex. monetära mått eller vissa biologiska och demografiska mått. Logtransformering av data har vanligtvis effekten att klumpar av data sprids ut och att utspridda data sammanförs. Nedan visas till exempel ett histogram över arealerna i alla 50 stater i USA. Det är skevt åt höger på grund av Alaska, Kalifornien, Texas och några andra.

hist(state.area)

Efter en logtransformation märker man att histogrammet är mer eller mindre symmetriskt. Vi har flyttat de stora tillstånden närmare varandra och spridit ut de mindre tillstånden.

hist(log(state.area))

Varför detta? En anledning är att göra data mer ”normala” eller symmetriska. Om vi utför en statistisk analys som förutsätter normalitet kan en logtransformation hjälpa oss att uppfylla detta antagande. En annan anledning är att hjälpa till att uppfylla antagandet om konstant varians i samband med linjär modellering. Ett annat skäl är att göra ett icke-linjärt förhållande mer linjärt. Men även om det är lätt att genomföra en logtransformation kan det komplicera tolkningen. Låt oss säga att vi anpassar en linjär modell med en logtransformerad beroende variabel. Hur tolkar vi koefficienterna? Vad händer om vi har logtransformerade beroende och oberoende variabler? Det är ämnet för den här artikeln.

Först ger vi ett tolkningsrecept för dem som bara vill ha lite snabb hjälp. Sedan ska vi gräva lite djupare i vad vi säger om vår modell när vi logtransformerar våra data.

Regler för tolkning

OK, du har kört en regression/anpassat en linjär modell och några av dina variabler är logtransformerade.

  1. Endast den beroende/responsvariabeln är logtransformerad. Exponera koefficienten, subtrahera ett från detta tal och multiplicera med 100. Detta ger den procentuella ökningen (eller minskningen) av svaret för varje ökning av den oberoende variabeln med en enhet. Exempel: Koefficienten är 0,198. (exp(0,198) – 1) * 100 = 21,9. För varje ökning av den oberoende variabeln med en enhet ökar vår beroende variabel med cirka 22 %.
  2. Endast oberoende/förutsägande variabler är log-transformerade. Dela koefficienten med 100. Detta säger oss att en ökning med 1 % av den oberoende variabeln ökar (eller minskar) den beroende variabeln med (koefficient/100) enheter. Exempel: koefficienten är 0,198. 0.198/100 = 0.00198. För varje 1 % ökning av den oberoende variabeln ökar vår beroende variabel med ungefär 0,002. För x procents ökning multiplicerar du koefficienten med log(1,x). Exempel: För varje 10-procentig ökning av den oberoende variabeln ökar vår beroende variabel med ungefär 0,198 * log(1,10) = 0,02.
  3. Både beroende/responsvariabel och oberoende/förutsägande variabel(er) är logtransformerade. Tolka koefficienten som den procentuella ökningen av den beroende variabeln för varje 1 % ökning av den oberoende variabeln. Exempel: koefficienten är 0,198. För varje 1 % ökning av den oberoende variabeln ökar vår beroende variabel med ungefär 0,20 %. För x procentuell ökning, beräkna 1,x till koefficientens potens, subtrahera 1 och multiplicera med 100. Exempel: För varje 20-procentig ökning av den oberoende variabeln ökar vår beroende variabel med ungefär (1,20 0,198 – 1) * 100 = 3,7 procent.

Vad logtransformationer verkligen betyder för dina modeller

Det är trevligt att veta hur man korrekt tolkar koefficienter för logtransformerade data, men det är viktigt att veta vad exakt din modell antyder när den innehåller logtransformerade data. För att få en bättre förståelse ska vi använda R för att simulera några data som kommer att kräva logtransformationer för en korrekt analys. Vi håller det enkelt med en oberoende variabel och normalfördelade fel. Först tittar vi på en logtransformerad beroende variabel.

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

Den första raden genererar en sekvens av 100 värden från 0,1 till 5 och tilldelar den till x. Nästa rad ställer in slumptalsgeneratorns frö till 1. Om du gör samma sak får du samma slumpmässigt genererade data som vi fick när du kör nästa rad. Koden rnorm(100, mean = 0, sd = 0.2) genererar 100 värden från en normalfördelning med ett medelvärde på 0 och en standardavvikelse på 0,2. Detta kommer att vara vårt ”fel”. Detta är ett av antagandena för enkel linjär regression: våra data kan modelleras med en rak linje men kommer att avvika med ett slumpmässigt belopp som vi antar kommer från en normalfördelning med medelvärde 0 och viss standardavvikelse. Vi tilldelar vårt fel till e.

Nu är vi redo att skapa vår logtransformerade beroende variabel. Vi väljer ett intercept (1,2) och en lutning (0,2), som vi multiplicerar med x, och lägger sedan till vårt slumpmässiga fel, e. Slutligen exponerar vi.

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

För att se varför vi exponerar, lägg märke till följande:

$$$\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-transformerad beroende variabel innebär att vår enkla linjära modell har exponentierats. Minns från exponenternas produktregel att vi kan skriva om den sista raden ovan som

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

Detta innebär vidare att vår oberoende variabel har ett multiplikativt förhållande till vår beroende variabel i stället för det vanliga additiva förhållandet. Därav behovet av att uttrycka effekten av en förändring av x med en enhet på y i procent.

Om vi anpassar rätt modell till data märker vi att vi gör ett ganska bra jobb med att återskapa de sanna parametervärdena som vi använde för att generera data.

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 uppskattade interceptet på 1,226 ligger nära det sanna värdet 1,2. Den uppskattade lutningen på 0,198 ligger mycket nära det sanna värdet 0,2. Slutligen är det uppskattade residualstandardfelet på 0,1805 inte alltför långt från det sanna värdet 0,2.

Visst att för att tolka lutningsvärdet måste vi exponera det.

exp(coef(lm1)) x 1.219179 

Detta säger att varje ökning av x med en enhet multipliceras med ungefär 1,22. Eller med andra ord, för varje ökning av x med en enhet ökar y med ungefär 22 procent. För att få 22 % subtraherar du 1 och multiplicerar med 100.

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

Vad händer om vi anpassar bara y i stället för log(y)? Hur kan vi räkna ut att vi bör överväga en logtransformation? Att bara titta på koefficienterna säger inte så mycket.

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

Självklart, eftersom vi har genererat data kan vi se att koefficienterna är helt fel och att standardfelet för residualerna är alldeles för högt. Men i verkligheten kommer du inte att veta detta! Det är därför vi gör regressionsdiagnostik. Ett viktigt antagande att kontrollera är konstant varians för felen. Vi kan göra detta med en Scale-Location-plot. Här är plotten för den modell vi just körde utan att logtransformera y.

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

Märk att de standardiserade residualerna tenderar uppåt. Detta är ett tecken på att antagandet om konstant varians har brutits. Jämför denna plott med samma plott för den korrekta modellen.

plot(lm1, which = 3)

Trendlinjen är jämn och residualerna är jämnt utspridda.

Betyder detta att du alltid ska log-transformera din beroende variabel om du misstänker att antagandet om konstant varians har brutits? Inte nödvändigtvis. Den icke-konstanta variansen kan bero på andra felspecifikationer i din modell. Tänk också på vad modellering av en logtransformerad beroende variabel innebär. Det betyder att den har ett multiplikativt förhållande till prediktorerna. Verkar det stämma? Använd ditt omdöme och din ämneskunskap.

Nu ska vi betrakta data med en logtransformerad oberoende prediktorvariabel. Detta är lättare att generera. Vi log-transformerar helt enkelt x.

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

När vi återigen först anpassar den korrekta modellen och märker att den gör ett bra jobb när det gäller att återskapa de sanna värden som vi använde för att generera data:

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

För att tolka lutningskoefficienten dividerar vi den med 100.

coef(lm3)/100 log(x) 0.001997892 

Detta säger oss att en ökning av x med 1 % ökar den beroende variabeln med ungefär 0,002. Varför säger den detta till oss? Låt oss räkna lite. Nedan beräknar vi förändringen i y när x ändras från 1 till 1,01 (dvs. en ökning med 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 är att man multiplicerar lutningskoefficienten med log(1.01), vilket är ungefär lika med 0.01, eller \(\frac{1}{100}\). Därav tolkningen att en ökning av x med 1 % ökar den beroende variabeln med koefficienten/100.

Vi anpassar återigen fel modell genom att inte ange en log-transformation för x i modellsyntaxen.

lm4 <- lm(y ~ x)

Om man tittar på en sammanfattning av modellen kommer man att se att skattningarna av koefficienterna ligger långt ifrån de verkliga värdena. Men i praktiken känner vi aldrig till de verkliga värdena. Återigen är diagnostik på sin plats för att bedöma modellens lämplighet. En användbar diagnostik i det här fallet är en partiell residualplott som kan avslöja avvikelser från linjäritet. Kom ihåg att linjära modeller utgår från att prediktorerna är additiva och har ett linjärt samband med responsvariabeln. I car-paketet finns funktionen crPlot för att snabbt skapa partiella residualdiagram. Ge den bara modellobjektet och ange vilken variabel du vill skapa den partiella residualplotten för.

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

Den raka linjen representerar det specificerade förhållandet mellan x och y. Den böjda linjen är en jämn trendlinje som sammanfattar det observerade förhållandet mellan x och y. Vi kan se att det observerade förhållandet är icke-linjärt. Jämför denna plott med den partiellt residuala plotten för den korrekta modellen.

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

De släta och anpassade linjerna ligger rakt ovanpå varandra och avslöjar inga allvarliga avvikelser från linjäritet.

Detta betyder inte att om man ser avvikelser från linjäritet ska man omedelbart anta att en logtransformation är den enda rätta lösningen! Det icke-linjära förhållandet kan vara komplext och inte så lätt att förklara med en enkel transformation. Men en logtransformation kan vara lämplig i sådana fall och är definitivt något att överväga.

För att avsluta kan vi betrakta data där både de beroende och oberoende variablerna är logtransformerade.

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

Se noga på koden ovan. Sambandet mellan x och y är nu både multiplikativt och icke-linjärt!

Som vanligt kan vi passa in den korrekta modellen och märka att den gör ett fantastiskt bra jobb när det gäller att återskapa de sanna värden som vi använde för att generera data:

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

Tolka x-koefficienten som den procentuella ökningen av y för varje 1 % ökning av x. I det här fallet är det ungefär 0,2 % ökning av y för varje 1 % ökning av x.

Att passa in fel modell ger återigen koefficient- och residualstandardfelskattningar som är helt fel.

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

Skalan-Lokalisering och Partiell-residualdiagrammen ger bevis för att något är fel med vår modell. Scale-Location-plotten visar en böjd trendlinje och Partial-Residual-plotten visar linjära och jämna linjer som inte stämmer överens.

plot(lm6, which = 3)

crPlot(lm6, variable = "x")

Hur skulle vi i verkligheten veta att den korrekta modellen kräver logtransformerade oberoende och beroende variabler? Det gör vi inte. Vi kanske har en föraning baserad på diagnostiska diagram och erfarenhet av modellering. Eller så kanske vi har sakkunskap om den process vi modellerar och har goda skäl att tro att förhållandet är multiplikativt och icke-linjärt.

Förhoppningsvis har du nu bättre koll på inte bara hur man tolkar logtransformerade variabler i en linjär modell utan också vad logtransformerade variabler betyder för din modell.

För frågor eller förtydliganden om den här artikeln, kontakta UVA Library StatLab: [email protected]

Se hela samlingen av UVA Library StatLab-artiklar.

Clay Ford
Statistisk forskningskonsult
University of Virginia Library
Augusti 17, 2018
.

admin

Lämna ett svar

Din e-postadress kommer inte publiceras.

lg