Tässä tapausesimerkissä pyrimme selvittämään, miten hyvin syöpäkuolleisuutta voidaan ennustaa saatavilla olevista väestötason muuttujista. Käytämme esimerkissä ilmaiseksi saatavilla olevaa aineistoa, jossa kuvataan syöpäkuolleisuutta sekä keskeisiä väestöllisiä muuttujia piirikunnittain Yhdysvalloissa. Aineisto on saatavilla osoitteesta: https://data.world/nrippner/ols-regression-challenge (vaatii kirjautumisen esimerkiksi Googlen, Twitterin, GitHubin tai Facebookin tunnuksilla).
R – Siirry SPSS -esimerkkiin
Aluksi lataamme aineiston R-ympäristöön komennolla read.csv()
:
df <- read.csv("[URL]", header=TRUE, stringsAsFactors=FALSE)
Aineisto sisältää 34 erilaista muuttujaa, joista TARGET_deathRate
on esimerkkimme päätemuuttuja. Kaikkien muuttujien tarkempi kuvaus löytyy ylläolevalta nettisivulta. Monet muuttujat kuvaavat samoja asioita eri tavalla, kuten iän mediaani koko väestölle ja iän mediaani erikseen miehille ja naisille. Lisäksi joissakin muuttujissa on melko paljon puuttuvia arvoja. describe()
-komento Hmisc -paketissa on hyödyllinen toiminto, kun tarve on saada kerralla kokonaiskäsitys muuttujien keskeisistä ominaisuuksia. Alla on kuvattuna tulosteen osalta vain päätemuuttujan tiedot.
> describe(df)
df
34 Variables 3047 Observations
------------------------------------------------------------------------------------------------------------------------
TARGET_deathRate
n missing distinct Info Mean Gmd .05 .10 .25 .50 .75 .90 .95
3047 0 1053 1 178.7 30.67 134.1 145.4 161.2 178.1 195.2 213.3 224.4
lowest : 59.7 66.3 80.8 87.6 93.8, highest: 277.6 280.8 292.5 293.9 362.8
Tarkasteltaessa kaikkia muuttujia voidaan todeta, että osassa muuttujista on runsaasti puuttuvia arvoja, kuten esimerkiksi muuttujalla PctSomeCol18_24
. Lisäksi toteamme, että osassa piirikunnista muuttujan MedianAge
arvot ovat useita satoja, joka ei voi tietenkään pitää paikkaansa. Aineiston koko on varsin laaja, joten poistamme havaintoyksiköt, joiden MedianAge
on kirjattu väärin. Käytämme tähän dplyr
-paketin filter()
-komentoa.
df <- df %>% filter(MedianAge<80)
Analyysiä varten valitsemme sellaisen muuttujajoukon, jossa on mahdollisimman kattavasti eri asioita kuvaavia muuttujia. Esimerkiksi iän mediaaniarvon lisäksi ei kannata ottaa erikseen miesten tai naisten mediaani-ikää. Vastaavasti koulutusta kuvaavista muuttujista ei kannata ottaa yli 25-vuotiaiden osuutta, joilla koulutustaso on vähintään high school (PctHS25_Over
) sekä 25-vuotiaiden osuutta, joilla koulutustaso on vähintään korkeakoulu (PctBachDeg25_Over
). Kolineariteetti näillä muuttujilla on ilmeinen.
Valitsemme alustavaan analyysimme muuttujat medIncome, povertyPercent, studyPerCap, MedianAge, AvgHouseholdSize, PercentMarried, PctHS18_24, PctHS25_Over, PctEmployed16_Over, PctUnemployed16_Over, PctPrivateCoverage, PctWhite, PctMarriedHouseholds sekä BirthRate
. Muuttujien valinnan teemme dplyr
-paketin select()
-komennolla.
df.2 <- df %>% select (TARGET_deathRate, medIncome, povertyPercent, studyPerCap, MedianAge, AvgHouseholdSize, PercentMarried, PctHS18_24, PctHS25_Over, PctEmployed16_Over, PctUnemployed16_Over, PctPrivateCoverage, PctWhite, PctMarriedHouseholds, BirthRate)
Tarkasteltaessa aikaisemmin koko aineistoa, huomasimme myös, että muuttujan PctEmployed16_Over
arvo puuttui 152 piirikunnalta. Jotta aineistomme olisi täysin ilman puuttuvia arvoja, poistamme aineistosta ne havaintopisteet, joilta kyseisen muuttuja arvo puuttuu. Tämä tapahtuu komennola na.omit()
.
df.2<-na.omit(df.2)
Yksi tapa lähestyä kolineariteettiongelmaa on tarkastella jo heti analyysin alussa muuttujien keskinäistä korrelaatiota. Hmisc -paketissa on komento redun()
, joka tekee ns. redundanssianalyysin. Se määrittää, miten eri muuttujat voidaan ennustaa toisista muuttujista. Jos jokin muuttuja voidaan ennustaa toisten muuttujien perusteella, sitä ei kannata ottaa monimuuttujamalliin mukaan. r2
-parametri komennossa redun()
tarkoittaa raja-arvoa, joka perusteella määritetään onko muuttuja turha. Mitään oikeaa arvoa parameterille r2
ei ole. Mitä lähempänä se on arvoa 1, sitä väljemmin tulkitaan muuttujien keskinäinen kolineariteetti. Asetamme r2
arvoksi 0.75.
> redun(~medIncome+povertyPercent+studyPerCap+MedianAge+AvgHouseholdSize+PercentMarried+PctHS18_24+PctHS25_Over+PctEmployed16_Over+PctUnemployed16_Over+PctPrivateCoverage+PctWhite+PctMarriedHouseholds+BirthRate,data=df.2,r2=0.75)
Redundancy Analysis
redun(formula = ~medIncome + povertyPercent + studyPerCap + MedianAge +
AvgHouseholdSize + PercentMarried + PctHS18_24 + PctHS25_Over +
PctEmployed16_Over + PctUnemployed16_Over + PctPrivateCoverage +
PctWhite + PctMarriedHouseholds + BirthRate, data = df.2,
r2 = 0.75)
n: 2895 p: 14 nk: 3
Number of NAs: 152
Frequencies of Missing Values Due to Each Variable
medIncome povertyPercent studyPerCap MedianAge AvgHouseholdSize
0 0 0 0 0
PercentMarried PctHS18_24 PctHS25_Over PctEmployed16_Over PctUnemployed16_Over
0 0 0 152 0
PctPrivateCoverage PctWhite PctMarriedHouseholds BirthRate
0 0 0 0
Transformation of target variables forced to be linear
R-squared cutoff: 0.75 Type: ordinary
R^2 with which each variable can be predicted from all other variables:
medIncome povertyPercent studyPerCap MedianAge AvgHouseholdSize
0.886 0.918 0.038 0.018 0.266
PercentMarried PctHS18_24 PctHS25_Over PctEmployed16_Over PctUnemployed16_Over
0.906 0.331 0.556 0.791 0.620
PctPrivateCoverage PctWhite PctMarriedHouseholds BirthRate
0.827 0.651 0.896 0.153
Rendundant variables:
povertyPercent PercentMarried medIncome
Predicted from variables:
studyPerCap MedianAge AvgHouseholdSize PctHS18_24 PctHS25_Over PctEmployed16_Over PctUnemployed16_Over PctPrivateCoverage PctWhite PctMarriedHouseholds BirthRate
Variable Deleted R^2 R^2 after later deletions
1 povertyPercent 0.918 0.911 0.858
2 PercentMarried 0.901 0.899
3 medIncome 0.816
Redundanssianalyysin mukaan muuttujat povertyPercent
, PercentMarried
ja medIncome
voidaan tehokkaasti ennustaa muiden muuttujien perusteella, joten jätämme ne pois lopullisesta ennustemallista.
Kaikki muuttujat monimuuttujamalliime on nyt valittu ja sovitamme lineaarisen mallin aineistoomme. lm()
on R-ympäristön vakiokomento lineaariselle regressiolle.
>model.1<-lm(TARGET_deathRate ~ studyPerCap + MedianAge + AvgHouseholdSize + PctHS18_24 + PctHS25_Over + PctEmployed16_Over + PctUnemployed16_Over + PctPrivateCoverage+PctWhite + PctMarriedHouseholds + BirthRate, data=df.2)
Tarkastelemme lineaariregression tuloksia kommennolla summary()
:
> summary(model.1)
Call:
lm(formula = TARGET_deathRate ~ studyPerCap + MedianAge + AvgHouseholdSize + PctHS18_24 + PctHS25_Over + PctEmployed16_Over + PctUnemployed16_Over + PctPrivateCoverage + PctWhite + PctMarriedHouseholds + BirthRate, data = df.2)
Residuals:
Min 1Q Median 3Q Max
-103.232 -12.202 0.626 12.290 148.006
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.826e+02 7.651e+00 23.866 < 2e-16 ***
studyPerCap 9.879e-04 7.854e-04 1.258 0.2086
MedianAge -1.196e-02 9.457e-03 -1.265 0.2060
AvgHouseholdSize -4.748e-01 1.077e+00 -0.441 0.6592
PctHS18_24 2.735e-01 5.367e-02 5.095 3.72e-07 ***
PctHS25_Over 1.290e+00 7.301e-02 17.663 < 2e-16 ***
PctEmployed16_Over -1.744e-01 8.231e-02 -2.119 0.0342 *
PctUnemployed16_Over 1.314e+00 1.853e-01 7.089 1.69e-12 ***
PctPrivateCoverage -1.906e-01 6.348e-02 -3.002 0.0027 **
PctWhite 1.148e-02 3.601e-02 0.319 0.7499
PctMarriedHouseholds -8.014e-01 9.027e-02 -8.878 < 2e-16 ***
BirthRate -9.583e-01 2.149e-01 -4.458 8.58e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 22.56 on 2883 degrees of freedom
(152 observations deleted due to missingness)
Multiple R-squared: 0.3281, Adjusted R-squared: 0.3255
F-statistic: 128 on 11 and 2883 DF, p-value: < 2.2e-16
Regressiokertoimien luottamusvälit eivät tulostu automaattisesti. Ne voidaan laskea toki keskivirheen perusteella, mutta ne saa myös suoraan komennolla confint()
:
> confint(model.1)
2.5 % 97.5 %
(Intercept) 1.675901e+02 197.592705174
studyPerCap -5.521857e-04 0.002527889
MedianAge -3.050342e-02 0.006581296
AvgHouseholdSize -2.585643e+00 1.636107269
PctHS18_24 1.682116e-01 0.378696646
PctHS25_Over 1.146484e+00 1.432817416
PctEmployed16_Over -3.358190e-01 -0.013043104
PctUnemployed16_Over 9.504722e-01 1.677270840
PctPrivateCoverage -3.150427e-01 -0.066119101
PctWhite -5.912638e-02 0.082086723
PctMarriedHouseholds -9.783926e-01 -0.624408281
BirthRate -1.379756e+00 -0.536824758
Keskeisimmät tulokset ovat nyt regressiokertoimet ja niiden luottamusvälit, mallin kokonaisselityaste ja mallin keskivirheet sekä mallin merkitsevyys verrattuna “nollamalliin”.
Regressiokertoimien tulkinta lineaariregressiossa on suoraviivaista. Esimerkiksi muuttuja PctPrivateCoverage
kuvaa yksityisen terveysvakuutuksen omistavien ihmisten suhteellista osuutta väestössä. Muuttuja on kuvattu prosenttiyksiköinä välillä 0-100. Sen regressiokerroin on -0.1906 ja se tarkoittaa, että kun yksityisen vakuutuksen omistavien ihmisten määrä kasvaa yhden prosenttiyksikön, syöpäkuolleisuus pienenee 0.1906 yksikköä ja päinvastoin. Eli vastaavasti, jos osuus kasvaa 10 prosenttiyksikköä, syöpäkuolleisuus pienenee 1.906 tapausta 100 000 ihmisten kohden. Kyseessä ei ole syy-seurausyhteys vaan tilastollinen yhteys.
Mallin selitysaste eli R2adj on 0.3255 eli 33% kaikesta vaihtelusta voidaan selittää mallin muuttujilla. F-testi on selkeästi tilastollisesti merkitsevä eli malli on parempi, kuin se, että kaikille piirikunnille oletettaisiin päätemuuttujan keskiarvo.
Regressiodiagnostiikan kannalta keskeisimmät tarkasteltavat muuttujat ovat residuaalit eli virhetermit sekä sovitetut arvot. Virhetermit saadaan komennolla resid()
ja sovitetut arvot komennolla predict()
. Lisäämme aineistoon jokaiselle havaintoyksikölle sen virhetermin ja sovitetun eli mallin pohjalta ennustetun päätemuuttujan arvon:
df.2$fitted<-predict(model.1)
df.2$res<-resid(model.1)
Ensijainen tavoite analyysissämme on ennustaminen eikä selittäminen ja tämän vuoksi on myös mielekästä tarkastella mallin ennustekykyä ja keskivirheitä tarkemmin. Keskimääräinen absoluuttinen virhe (MAE) saadaan laskettua seuraavasti:
sum(abs(df.2$TARGET_deathRate-df.2$fitted))/nrow(df.2)
Sen arvo on 15.83 eli keskimäärin ennusteemme ovat 15.8 yksikköä virheellisiä. Keskineliövirhe vastaa virhetermien varianssia ja se saadaan laskettua seuraavasti:
sum((df.2$TARGET_deathRate-df.2$fitted)^2)/nrow(df.2)
Juuri-keskineliövirhe (RMSE) saadaan ottamalla neliöjuuri keskivirheestä:
sqrt(sum((df.2$TARGET_deathRate-df.2$fitted)^2)/nrow(df.2))
Sen arvoksi saadaan 22.5. Keskivirheet painottavat eri tavoin selkeästi poikkeavia arvoja, mutta voimme raportoida molemmat arvot lopullisissa tuloksissa.
Homoskedastisuuden tarkastamme graafisesti piirtämällä pisteparvikuvion, jossa x-akselilla on sovitetut arvo ja y-akselilla on virhetermit. Lisäksi sovitamme kuvioon ns. loess-kuvaajan komenolla loess()
osoittamaan mahdollisen epälineaarisen yhteyden muuttujien välillä.
homoscedast <- loess(res ~ fitted,data=df)
plot(res ~ fitted, data=df)
j <- order(df$fitted)
lines(df$fitted[j],homoscedast$fitted[j],col="red")
Virhetermien suuruus ei vaikuta riippuvan sovitetuista arvoista, koska pisteparikuvio sijaitsee säännöllisesti ja symmetrisesti vaaka-akselin suuntaisesti. Tätä tukee myös loess-kuvaaja.
Toinen tärkeä tarkasteltava oletus regressiodiagnostiikassa on virhetermien normaalius. Tämän tarkastelu onnistuu parhaiten kvantiili-kvantiilikuvaajalla. qqnorm()
-komento piirtää suoraan annetuille virhetermeille kvantiilikuvaajan ja qqline()
-komennolla kuvaajaan piirtyy myös referenssiviiva.
qqnorm(df.2$res)
qqline(df.2$res)
Kuvaajista näemme, että virhetermien jakauma ei aivan asetu normaalijakaumaa kuvaavalle referenssiviivalle vaan ääripäissä arvot poikkeavat siitä. Jos tarkastelemme virhetermien jakaumaa voidaan havaita, että virhetermien jakauma on normaalijakaumaan nähden hieman liian huipukas eli jakauma on kapea.
plot(density(df.2$res))
Koska virhetermeissä ei ole havaittavissa selkeää poikkeamaa normaalijakaumasta eikä selkeää toista parempaa mallia ole selkeästi tarjolla, toteamme että virhetermit ovat riittävän normaalit.
Lopuksi voimme tarkastella mahdollista kolineariteettia. Varianssin inflaatiotekijät saadaan määritettyä komennolla vif()
:
> vif(model.1)
studyPerCap MedianAge AvgHouseholdSize PctHS18_24 PctHS25_Over
1.027719 1.007110 1.191399 1.356919 1.493188
PctEmployed16_Over PctUnemployed16_Over PctPrivateCoverage PctWhite PctMarriedHouseholds
2.664330 2.327336 2.597446 1.972400 1.971793
BirthRate
1.052778
Tärkeää on kuitenkin huomata, että analyysin alussa teimme jo redundanssianalyysin, jonka tarkoitus oli poistaa ne muuttujat joilla on merkittävä keskinäinen korrelaatio. Jos emme tekisi redundanssianalyysiä vaan sovittaisimme mallin kaikilla lähtömuuttujilla, vif()
-komennolla saisimme seuraavat tulokset:
model.0<-lm(TARGET_deathRate~medIncome+povertyPercent+studyPerCap+MedianAge+AvgHouseholdSize+PercentMarried+PctHS18_24+PctHS25_Over+PctEmployed16_Over+PctUnemployed16_Over+PctPrivateCoverage+PctWhite+PctMarriedHouseholds+BirthRate,data=df)
> vif(model.0)
medIncome povertyPercent studyPerCap MedianAge AvgHouseholdSize
5.507491 8.000904 1.031822 2.829589 1.347679
PercentMarried PctHS18_24 PctHS25_Over PctEmployed16_Over PctUnemployed16_Over
10.607862 1.447631 1.868613 5.240850 2.390514
PctPrivateCoverage PctWhite PctMarriedHouseholds BirthRate
4.164646 2.357963 8.420006 1.109086
Nyt useammalla muuttujan kohdalla varianssin inflaatiotekijän arvo on selkeästi yli 5 ja lähellä arvoa 10, joten joutuisimme viimeistään tässä vaiheessa tekemään karsintaa mukaan otettavien muuttujien valinnassa.
SPSS
Aloitamme avaamalla lähdesivulta ladatun cancer_reg.csv -tiedoston. Tämä tapahtuu valitsemalla File > Import Data > CSV file.
Tiedoston avaamisen jälkeen SPSS haluaa tietää, miten se käsittelee .csv-muotoista tekstitiedostoa. Yleensä .csv-tiedostossa on ensimmäisellä rivillä muuttujien nimet joten laitamme rastin kohtaan First line contains variable names. Keskeistä on lisäksi katsoa, mikä merkki toimii ns. erottimena (eng. delimiter) tiedostossa. Tässä tiedostossa se on pilkku (eng. comma) ja valitsemme sen kohdasta Delimiter between values. Lisäksi katsomme mikä on aineistossa desimaalierotin (eng. Decimal symbol) ja tässä tapauksessa se on piste (eng. period), joten valitsemme sen kohdasta Decimal symbol. Nyt aineisto on käsittelymuodossa SPSS:ssa.
Aineisto sisältää 34 erilaista muuttujaa, joista TARGET_deathRate on esimerkkimme päätemuuttuja. Kaikkien muuttujien kuvaus löytyy ylläolevalta nettisivulta. Monet muuttujat kuvaavat samoja asioita eri tavalla, kuten iän mediaani koko väestölle ja iän mediaani erikseen miehille ja naisille. Lisäksi joissakin muuttujissa on melko paljon puuttuvia arvoja. Aineiston yleisluontoiseen tarkasteluun voidaan käyttää toimintoa Descriptives valikon Analyze > Descriptive Statistics -valikon takaa. Valitsemme kaikki muuttujat tarkasteltavaksi. Oleellista on tarkastella erityisesti saraketta N, joka kertoo kuinka aineistossa on puuttuvia arvoja. Esimerkiksi muuttujan PctSomeCol18_24 arvon löytyy vain 762 yksikölle.
Analyysiämme varten valitsemme sellaisen muuttujajoukon, jossa on mahdollisimman kattavasti eri asioita kuvaavia muuttujia. Esimerkiksi mediaani-iän lisäksi ei kannata ottaa lisäksi erikseen miesten tai naisten mediaani-ikää. Vastaavasti koulutusta kuvaavista muuttujista ei kannata yli 25-vuotiaiden osuutta, joilla koulutustaso on vähintään high school sekä 25-vuotiaiden osuutta (PctHS25_Over), joilla koulutustaso on vähintään korkeakoulu (PctBachDeg25_Over). Kolineariteetti näillä muuttujilla on ilmeinen.
Valitsemme alustavaan analyysimme muuttujat medIncome, povertyPercent, studyPerCap, MedianAge, AvgHouseholdSize, PercentMarried, PctHS18_24, PctHS25_Over, PctEmployed16_Over, PctUnemployed16_Over, PctPrivateCoverage, PctWhite, PctMarriedHouseholds sekä BirthRate.
Edellä tarkastelimme muuttujien yleiskuvaa. Muuttujan MedianAge kohdalla huomasimme, että sen suurin arvo on 624. Kun selaamme muuttujan arvoja tarkemmin, voimme todeta, että muutamissa piirikunnissa arvot ovat useita satoja, mikä on selkeä virhekirjaus. Näin ollen emme ota analyysiin mukaan havaintopisteitä, joissa muuttuja MedianAge on kirjattu väärin. Tämä onnistuu valitsemalla Data > Select cases. Valitsemme toiminnon If condition is satisfied ja klikkaamme nappia If. Avautuvasta ikkunasta kaksoisklikkaamme muuttujaa MedianAge, jolloin se siirtyy oikealla olevaan tekstikenttään. Täydennämme tekstikenttää lisäämällä muuttujan perään “<80”. Nyt määrittely “MedianAge<80” tarkoittaa, että aineistosta valitaan ne rivit, jotka vastaavat kyseistä määrittelyä. Lopuksi valitsemme Continue ja
Kaikki muuttujat monimuuttujamalliimme on nyt valittu ja sovitamme lineaarisen mallin aineistoomme. Tämä onnistuu valitsemalla Analyze > Regression > Linear.
Dependent eli päätemuuttujaksi valitsemme TARGET_deathRate. Independent eli lähtömuuttujksi valitsemme ylläolevat muuttujat. Statistics -valikon takaa valitsemme tarvitsemamme tulostemuuttujat. Regressiokertoimien luottamusväli ovat keskeiset, joten laitamme rastin kohtaan Confidence Interval. Lisäksi tarvitsemme varianssin inflaatiotekijät ja sen onnistuu valitsemalla Colinearity Diagnostics.
Plots -valikon takaa valitsemme lisää regressiodiagnostiikan osalta tärkeitä tulosteita. Homoskedastisuuden arviointia varten valitsemme X-akselille *ZPRED (predicted) ja Y-akselille *ZRESID. Lisäksi laitamme rastin kohtaan Histogram -otsikon Standardized Residual Plots -valintaan, jolloin saamme tulosteena virhetermien jakauman eli histogrammin.
Kvantiili-kvantiilikuvaajan piirtämistä vaten pitää erikseen tallentaa virhetermit ja se tapahtuu laittamalla Save -valikon takaa rasti kohtaan Standardized residuals. Kaiken tämän jälkeen painamme OK ja ajamme lineaarisen regression.
SPSS tulosteen tulkinta
Ensimmäisenä tulostuu listaus muuttujista, jotka sisällytettiin malliin.
Tämän jälkeen tulostuu mallia kuvaavat tulokset. Keskeisin tulos on Adjusted S Square, joka kuvastaa mallin selitysastetta suhteessa malliin mukaan otettujen muuttujien lukumäärään. Arvo 0.358 tarkoittaa, että 36% kaikesta päätemuuttujan vaihtelusta voidaan selittää mallin muuttujilla. Valitettavasti SPSS ei tarjoa suoraan mallin keskivirheitä kuten juuri-keskineliövirhettä (RMSE).
ANOVA-otsikon alta löytyy F-testin tilastollinen merkitsevyys. Nyt F-testi on selkeästi tilastollisesti merkitsevä eli malli on parempi, kuin se että kaikille tutkimusyksiköille oletettaisiin vain päätemuuttujan keskiarvo.
Seuraavaksi tulostuu regressiokertoimien arvot sekä varianssin inflaatiotekijän suuruudet. Regressiokertoimien tulkinta lineaariregressiossa on suoraviivaista. PctPrivateCoverage -muuttuja kuvaa yksityisen terveysvakuutuksen omistavien ihmisten suhteellista osuutta. Muuttuja on kuvattu prosenttiyksiköinä välillä 0-100. Sen regressiokerroin on -0.052 ja se tarkoittaa, että kun yksityisen vakuutuksen omistavien ihmisten määrä kasvaa yhden prosenttiyksikön, syöpäkuolleisuus pienenee 0.052 yksikköä. Eli vastaavasti, jos osuus kasvaa 10 prosenttiyksikköä, syöpäkuolleisuus pienenee 0.52 tapausta 100 000 ihmisten kohden.
Taulukon lopusta löytyy kolineariteettiin liittyvät tulokset. Nyt näemme, että mallissa on selkeä ongelma kolineariteetin suhteen. Muuttujilla PercentMarried, PctMarriedHouseholds sekä povertyPercent VIF:n arvon on yli 8. Kahden ensimmäisen muuttujan välillä kolineariteetti on selkeä. medIncome muuttujan VIF-arvo on 5.5 ja muuttujan PctEmplyed16_Over taas 5.2. Tehdään nyt siis uusi analyysi poistamalla muuttujat PercentMarried, povertyPercent sekä medIncome.
Uuden analyysin osalta katsomme heti muuttuivatko VIF:n arvot. Huomaamme, että nyt kaikkien muuttujien VIF-arvot ovat alle 3, joka on hyvä asia. Regressiokertoimien arvot ovat nyt täysin muuttuneet. Esimerkiksi muuttujan PctPrivateCoverage regressiokertoimen arvo on nyt -0.191 ja se on tilastollisesti merkitsevä. Kolineaariteetti aiheutti siis huomattavaa virhettä monimuuttujamalliimme.
Uudessa mallissamme Adjusted S Square on nyt 0.341 eli se ei oleellisesti muuttunut. Lisäksi F-testin arvo on edelleen tilastollisesti merkitsevä.
Ensimmäinen kuvaaja tulosteessa on virhetermien histogrammi. Vakavaa poikkeamaa virhetermien normaalijakaumasta ei havaita.
Alimpana tulosteessa on nyt pisteparvikuvio, jossa jossa x-akselilla on sovitetut arvo ja y-akselilla on virhetermit. Virhetermien suuruus ei vaikuta riippuvan sovitetuista arvoista, koska pisteparikuvio sijaitsee säännöllisesti ja symmetrisesti vaaka-akselin suuntaisesti. Voimme sovittaa vielä kuvioon ns. loess-viivan, osoittamaan mahdollisen epälineaarisen korrelaation muuttujien välillä. Tämä onnistuu tuplaklikkaamalla kuviota, jolloin aukeaa kuvaajan muokkausikkuna. Oikeassa reunassa alemmalla ikkunarivillä on kuvake, jonka päälle tulee otsikko Add Fit Line at Total. Tämän jälkeen aukeaa valintaikkuna, josta valitsemme Loess. Lines -välilehden alta voimme valita viivan väriksi esimerkiksi punaisen. Lopuksi valitsemme Apply, joka hyväksyy muutokset. Valintaikkuna sulkeutuu valitsemalla Close. Lopuksi voimme sulkea kuvaajan muokkausikkunan.
Lopuksi tarkastelemme vielä kvantiilikuvaajaa. Sen piirtäminen tapahtuu valitsemalla Analyze > Descriptive Statistics > Q-Q Plots. Nyt valitsemme alimpana olevan Standardized Residuals (ZRE_2) Variables oikealla olevaan laatikkoon. Huomaa, että aineistoon on nyt tullut kaksi uutta muuttujaa ZRE_1 ja ZRE_2, koska teimme lineaariregression kahdesti ja kummallakin kerralla valitsimme tallennetavaksi Standardized Residuals. Esimerkiksi kvantiilikuvaajaa tehdessä pitää olla äärimmäisen huolellinen, että valitsee oikeat virhetermit piirrettäväksi, jos on suorittanut monia eri regressioajoja. Kvantiilikuvaajan saamme tulostettua painamalla OK.
Kuvaajista näemme, että virhetermien jakauma ei aivan asetu normaalijakaumaa kuvaavalle referenssiviivalle vaan ääripäissä arvot poikkeavat siitä. Jos tarkastelemme ylläolevaa virhetermien jakaumaa voidaan havaita, että virhetermien jakauma on normaalijakaumaan nähden hieman liian huipukas eli jakauma on kapea. Koska virhetermeissä ei ole havaittavissa selkeää poikkeamaa normaalijakaumasta eikä selkeää toista parempaa mallia ole selkeästi tarjolla, toteamme että virhetermit ovat riittävän normaalit.
Tulosten raportointi
Tutkimuksen tavoite oli ennustaa syöpäkuolleisuutta, joten tulosten raportoinnissa keskeistä on kuvata ennustekykyyn ja -tarkuuteen liittyvät tulokset. Selitysaste eli vakioitu R2 sekä RMSE on syytä kuvata selkeästi. Kokonaisvaihtelusta voidaan selittää 33-34%, joka on keskinkertainen arvo. Juuri-keskineliövirhe oli 22.5 yksikköä, joka on myös keskinkertainen huomioida syöpäkuolleisuuden vaihtelualue. Regressiokertoimien arvot voidaan myös raportoida, mutta oleellista on välttää tulkitsemasta niitä syy-seuraussuhteen näkökulmasta. Koska kausaalioletuksia ei ole tehty, regressiokertoimet kuvaavat vain tilastollista yhteyttä. Lisäksi on hyvä kuvata regressiodiagnostiikan osalta keskeisimmät tulokset. Virhetermien jakauma oli hieman huipukas, mikä tarkoittaa, että ennustettuihin päätemuuttujen ääripäiden arvoihin voi liittyä oleellista virhettä.
Kirjoittanut Aleksi Reito, vertaisarvioinut Ville Ponkilainen.