Log-muunnoksia suositellaan usein vinoutuneille tiedoille, kuten rahamittauksille tai tietyille biologisille ja demografisille mittauksille. Log-muunnoksella on yleensä se vaikutus, että se levittää tietoryppäitä ja kokoaa yhteen hajanaisia tietoja. Alla on esimerkiksi histogrammi Yhdysvaltojen kaikkien 50 osavaltion pinta-aloista. Se on vinoutunut oikealle Alaskan, Kalifornian, Texasin ja muutaman muun vuoksi.
hist(state.area)
Log-muunnoksen jälkeen huomaa, että histogrammi on enemmän tai vähemmän symmetrinen. Olemme siirtäneet suuret tilat lähemmäs toisiaan ja hajottaneet pienemmät tilat.
hist(log(state.area))
Miksi teemme näin? Yksi syy on tehdä datasta ”normaalimpaa” eli symmetristä. Jos suoritamme tilastollisen analyysin, jossa oletetaan normaalius, log-muunnos saattaa auttaa meitä täyttämään tämän oletuksen. Toinen syy on auttaa täyttämään oletus vakiovarianssista lineaarisen mallintamisen yhteydessä. Toinen syy on auttaa tekemään epälineaarisesta suhteesta lineaarisempi. Vaikka log-muunnos on helppo toteuttaa, se voi kuitenkin vaikeuttaa tulkintaa. Oletetaan, että sovitamme lineaarisen mallin, jossa on log-muunnettu riippuvainen muuttuja. Miten tulkitsemme kertoimia? Entä jos meillä on log-muunnettuja riippuvaisia ja riippumattomia muuttujia? Tämä on tämän artikkelin aihe.
Aluksi annamme reseptin tulkintaa varten niille, jotka haluavat vain nopeaa apua. Sitten syvennymme hieman syvemmälle siihen, mitä sanomme mallistamme, kun log-muunnamme datamme.
Tulkinnan säännöt
OK, suoritit regression/ sovitit lineaarisen mallin ja osa muuttujista on log-muunnettu.
- Vain riippuvainen/vastemuuttuja on log-muunnettu. Eksponentoi kerroin, vähennä tästä luvusta yksi ja kerro 100:lla. Näin saadaan vastauksen prosentuaalinen lisäys (tai vähennys) jokaista riippumattoman muuttujan yhden yksikön lisäystä kohti. Esimerkki: Kerroin on 0,198. (exp(0,198) – 1) * 100 = 21,9. Jokaista riippumattoman muuttujan yhden yksikön lisäystä kohden riippuvainen muuttujamme kasvaa noin 22 %.
- Vain riippumaton/ennustemuuttuja(t) on log-muunnettu. Jaa kerroin luvulla 100. Tämä kertoo meille, että 1 %:n lisäys riippumattomassa muuttujassa lisää (tai vähentää) riippuvaista muuttujaa (kerroin/100) yksikköä. Esimerkki: Kerroin on 0,198. 0.198/100 = 0.00198. Jokaista riippumattoman muuttujan 1 %:n lisäystä kohden riippuvainen muuttujamme kasvaa noin 0,002:lla. Jos kyseessä on x prosentin lisäys, kerro kerro kerroin log(1.x):llä. Esimerkki:
- Sekä riippuvainen/vastemuuttuja että riippumaton/ennustemuuttuja(t) ovat log-muunnettuja. Tulkitse kerroin prosentuaalisena lisäyksenä riippuvassa muuttujassa jokaista riippumattoman muuttujan 1 prosentin lisäystä kohti. Esimerkki: Kerroin on 0,198. Jokaista riippumattoman muuttujan 1 prosentin lisäystä kohden riippuvainen muuttujamme kasvaa noin 0,20 prosenttia. Saadaksesi x-prosenttisen kasvun, laske 1,x kertoimen potenssiin, vähennä 1 ja kerro 100:lla. Esimerkki: Jokaista riippumattoman muuttujan 20 prosentin lisäystä kohden riippuvainen muuttujamme kasvaa noin (1,20 0,198 – 1) * 100 = 3,7 prosenttia.
Mitä log-muunnokset todella merkitsevät malleillesi
On mukavaa osata tulkita oikein log-muunnettujen tietojen kertoimia, mutta on tärkeää tietää, mitä mallisi tarkalleen ottaen tarkoittaa, kun se sisältää log-muunnettuja tietoja. Paremman ymmärryksen saamiseksi simuloidaan R:n avulla joitakin tietoja, jotka vaativat log-muunnoksia oikeaa analyysia varten. Pidetään homma yksinkertaisena yhden riippumattoman muuttujan ja normaalisti jakautuneiden virheiden avulla. Tarkastelemme ensin log-muunnettua riippuvaista muuttujaa.
x <- seq(0.1,5,length.out = 100)set.seed(1)e <- rnorm(100, mean = 0, sd = 0.2)
Ensimmäinen rivi luo sadan arvon sarjan 0,1:n ja 5:n välillä ja antaa sen x:lle. Seuraavalla rivillä satunnaislukugeneraattorin siemenen arvoksi asetetaan 1. Jos teet samoin, saat saman satunnaislukugeneraattorilla generoidun datan, jonka saimme suorittaessasi seuraavaa riviä. Koodi rnorm(100, mean = 0, sd = 0.2)
tuottaa 100 arvoa normaalijakaumasta, jonka keskiarvo on 0 ja keskihajonta 0,2. Tämä on meidän ”virheemme”. Tämä on yksi yksinkertaisen lineaarisen regression oletuksista: datamme voidaan mallintaa suoralla viivalla, mutta se poikkeaa jollakin satunnaisella määrällä, jonka oletamme tulevan normaalijakaumasta, jonka keskiarvo on 0 ja keskihajonta jokin. Määritämme virheemme arvoksi e.
Nyt olemme valmiita luomaan log-muunnetun riippuvaisen muuttujamme. Valitsemme leikkauspisteen (1,2) ja kaltevuuden (0,2), jotka kerromme x:llä, ja lisäämme sitten satunnaisvirheemme e. Lopuksi eksponentoimme.
y <- exp(1.2 + 0.2 * x + e)
Katsoaksesi, miksi eksponoimme, huomaa seuraavaa:
$$\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)$$$$
Tässä tapauksessa log-muunnettu riippuvainen muuttuja merkitsee, että yksinkertainen lineaarinen mallimme on eksponentoitunut. Muistutetaan eksponenttien tulossäännöstä, että voimme kirjoittaa yllä olevan viimeisen rivin uudelleen muotoon
$$y = \text{exp}(\beta_0) \text{exp}(\beta_1x)$$
Tämä edelleen merkitsee, että riippumattomalla muuttujallamme on multiplikatiivinen suhde riippuvaiseen muuttujaamme tavanomaisen additiivisen suhteen sijaan. Siksi on tarpeen ilmaista x:n yhden yksikön muutoksen vaikutus y:hen prosentteina.
Jos sovitamme oikean mallin aineistoon, huomaa, että onnistumme melko hyvin palauttamaan todelliset parametriarvot, joita käytimme aineiston tuottamiseen.
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
Estimoitu leikkauspiste 1,226 on lähellä todellista arvoa 1,2. Estimoitu kaltevuus 0,198 on hyvin lähellä todellista arvoa 0,2. Lopuksi estimoitu jäännösstandardivirhe 0,1805 ei ole kovin kaukana todellisesta arvosta 0,2.
Muistutetaan, että kaltevuusarvon tulkitsemiseksi meidän on eksponentioitava se.
exp(coef(lm1)) x 1.219179
Tämä kertoo, että jokainen x:n yhden yksikön kasvu kerrotaan noin 1,22:lla. Tai toisin sanoen, jokaista x:n yhden yksikön lisäystä kohden y kasvaa noin 22 %. Saadaksesi 22 % vähennetään 1 ja kerrotaan 100:lla.
(exp(coef(lm1)) - 1) * 100 x 21.91786
Mitä jos sovitetaan vain y log(y):n sijaan? Miten saisimme selville, että meidän pitäisi harkita log-muunnosta? Pelkkä kertoimien tarkastelu ei kerro paljoa.
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
Totta kai, koska olemme tuottaneet datan, voimme nähdä, että kertoimet ovat kaukana toisistaan ja jäännösstandardivirhe on aivan liian suuri. Mutta tosielämässä tätä ei tiedetä! Siksi teemme regressiodiagnostiikkaa. Keskeinen tarkistettava oletus on virheiden vakiovarianssi. Tämä voidaan tehdä Scale-Location-diagrammin avulla. Tässä on kuvaaja mallille, jonka juuri ajoimme ilman log-muunnosta y.
plot(lm2, which = 3) # 3 = Scale-Location plot
Huomaa, että vakioidut residuaalit ovat suuntautuneet ylöspäin. Tämä on merkki siitä, että vakiovarianssioletusta on rikottu. Vertaa tätä kuvaajaa oikean mallin samaan kuvaajaan.
plot(lm1, which = 3)
Trendiviiva on tasainen ja residuaalit ovat tasaisesti hajallaan.
Tarkoittaako tämä sitä, että riippuvainen muuttuja pitäisi aina log-muunntaa, jos epäilee, että vakiovarianssiolettamaa on rikottu? Ei välttämättä. Epävakioitu varianssi voi johtua muista virheellisyyksistä mallissasi. Mieti myös, mitä log-muunnetun riippuvaisen muuttujan mallintaminen tarkoittaa. Se tarkoittaa, että sillä on multiplikatiivinen suhde ennustajiin. Vaikuttaako se oikealta? Käytä harkintakykyäsi ja aiheeseen liittyvää asiantuntemustasi.
Katsotaan nyt aineistoa, jossa on log-muunnettu riippumaton ennustemuuttuja. Tämä on helpompi tuottaa. Me yksinkertaisesti log-muunnamme x:n.
y <- 1.2 + 0.2*log(x) + e
Jälleen kerran sovitamme ensin oikean mallin ja huomaamme, että se palauttaa hyvin ne todelliset arvot, joita käytimme datan tuottamiseen:
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
Tulkitaksemme kaltevuuskertoimen jaamme sen luvulla 100.
coef(lm3)/100 log(x) 0.001997892
Tämä kertoo meille, että 1 %:n kasvu x:ssä kasvattaa riippuvaista muuttujaa noin 0,002:lla. Miksi se kertoo meille tämän? Tehdäänpä vähän matematiikkaa. Alla laskemme y:n muutoksen, kun muutamme x:n arvoa 1:stä 1,01:een (eli 1 %:n lisäys).
$$(\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$$$
Tulos saadaan kertomalla kaltevuuskerroin log(1.01):llä, joka on suunnilleen 0.01 eli \(\frac{1}{100}\). Tästä seuraa tulkinta, että 1 %:n lisäys x:ssä kasvattaa riippuvaista muuttujaa kertoimen/100 verran.
Sovitetaan jälleen kerran väärä malli jättämällä mallin syntaksissa määrittelemättä log-muunnos x:lle.
lm4 <- lm(y ~ x)
Mallin yhteenvedon tarkastelu paljastaa, että kertoimien estimaatit poikkeavat selvästi todellisista arvoista. Käytännössä emme kuitenkaan koskaan tiedä todellisia arvoja. Jälleen kerran diagnostiikka on paikallaan mallin riittävyyden arvioimiseksi. Tässä tapauksessa hyödyllinen diagnostiikka on osittaisjäännösdiagrammi, joka voi paljastaa poikkeamat lineaarisuudesta. Muistutetaan, että lineaarisissa malleissa oletetaan, että ennustajat ovat additiivisia ja että niillä on lineaarinen suhde vastemuuttujaan. Car-paketissa on crPlot-funktio, jolla voidaan nopeasti luoda osittaisjäännösdiagrammeja. Anna sille vain malliobjekti ja määritä, mille muuttujalle haluat luoda osittaisjäännösdiagrammin.
library(car)crPlot(lm4, variable = "x")
Suora viiva edustaa määriteltyä suhdetta x:n ja y:n välillä. Kaareva viiva on sileä trendiviiva, joka tiivistää havaitun suhteen x:n ja y:n välillä. Voimme sanoa, että havaittu suhde on epälineaarinen. Vertaa tätä kuvaajaa oikean mallin osittaisjäännöskuvaajaan.
crPlot(lm3, variable = "log(x)")
Sileät ja sovitetut viivat ovat aivan toistensa päällä paljastaen, ettei lineaarisuudesta ole vakavia poikkeamia.
Tämä ei tarkoita sitä, että jos näet poikkeamia lineaarisuudesta, sinun pitäisi heti olettaa log-muunnoksen olevan ainoa ja oikea ratkaisu! Epälineaarinen suhde voi olla monimutkainen, eikä sitä ole niin helppo selittää yksinkertaisella muunnoksella. Mutta log-muunnos voi tällaisissa tapauksissa olla sopiva ja varmasti harkinnan arvoinen asia.
Harkitaan lopuksi dataa, jossa sekä riippuvainen että riippumaton muuttuja ovat log-muunnettuja.
y <- exp(1.2 + 0.2 * log(x) + e)
Katsokaa tarkkaan yllä olevaa koodia. Suhde x:n ja y:n välillä on nyt sekä multiplikatiivinen että epälineaarinen!
Voidaan tavalliseen tapaan sovittaa oikea malli ja huomata, että se palauttaa loistavasti todelliset arvot, joita käytimme datan tuottamiseen:
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
Tulkitse x:n kerroin prosentuaalisena kasvuna y:ssä jokaista 1 %:n lisäystä x:ssä kohti. Tässä tapauksessa se on noin 0,2 %:n lisäys y:ssä jokaista 1 %:n lisäystä x:ssä kohti.
Väärän mallin sovittaminen tuottaa jälleen kerran kertoimen ja jäännösvirheen keskivirhe-estimaatit, jotka ovat rajusti hakoteillä.
lm6 <- lm(y ~ x)summary(lm6)
Skaala-sijainti- ja osittaisjäännösdiagrammit antavat todisteita siitä, että mallissamme on jotain pielessä. Scale-Location-diagrammissa näkyy kaareva trendiviiva ja Partial-Residual-diagrammissa lineaariset ja tasaiset viivat, jotka eivät sovi yhteen.
plot(lm6, which = 3)
crPlot(lm6, variable = "x")
Miten tietäisimme tosielämässä, että oikea malli edellyttää log-muunnettuja riippumattomia ja riippuvia muuttujia? Emme tietäisi. Meillä saattaisi olla aavistus, joka perustuisi diagnostisiin kuvaajiin ja mallintamiskokemukseen. Tai meillä voi olla asiantuntemusta mallintamastamme prosessista ja meillä voi olla hyvä syy uskoa, että suhde on moninkertainen ja epälineaarinen.
Toivottavasti sinulla on nyt parempi käsitys paitsi siitä, miten tulkita log-muunnettuja muuttujia lineaarisessa mallissa, myös siitä, mitä log-muunnetut muuttujat merkitsevät mallisi kannalta.
Jos sinulla on tätä artikkelia koskevia kysymyksiä tai selvennyksiä, ota yhteyttä UVA:n kirjaston StatLabiin: [email protected]
Katsele koko UVA:n kirjaston StatLab-artikkelikokoelmaa.
Clay Ford
Statistical Research Consultant
Virginian yliopiston kirjasto
17. elokuuta 2018