11. Tvíkosta aðhvarfsgreining
Á eftir línulegri aðhvarfsgreiningu, sem við fjölluðum um í kafla
10, er tvíkosta aðhvarfsgreining sennilega mest
notaða aðhvarfsgreiningarlíkanið. Í R er tvíkosta aðhvarfsgreining
framkvæmd á mjög sambærilegan hátt og línuleg aðhvarfsgreining, nema nú
er notast við fallið glm()
í stað fallsins lm()
. Í tvíkosta
aðhvarfsgreiningu hefur svarbreytan eingöngu tvær útkomur, 0 og 1 og eru
líkönin því metin með aðstoð tengifalla. Algengasta tengifallið kallast
á ensku the logistic function og því er oft talað um lógistíska
aðhvarfsgreiningu. Í raun má nota fallið glm()
til að framkvæma
fjölda annarra alhæfðra línulegra aðhvarfsgreiningarlíkana en það er
utan efnis þessarar bókar.
11.1. glm()
Athugið
Inntak: formúla, gögn
Úttak: tvíkosta aðhvarfsgreining á gögnunum byggt á formúlunni
Helstu stillingar: family
Auk fallsins glm()
munum við einnig nota skipanirnar summary()
,
coef()
og confint()
á svipaðan hátt og þið sáuð í kafla
10.
Í kafla 11.1.1 sýnum við hvernig tvíkosta aðhvarfsgreining er framkvæmd þegar skýribreytan er samfelld en í kafla 11.1.2 sýnum við hvað gerist þegar skýribreytan er strjál. Við munum finna möt á stikum líkansins, framkvæma tilgátupróf fyrir þá og reikna öryggisbil.
11.1.1. Tvíkosta aðhvarfsgreining með samfellda skýribreytu
Tvíkosta aðhvarfsgreiningu má nota til að meta hvort nemendur sem stunda mikla líkamsrækt séu ólíklegri til að reykja heldur en þá sem stunda litla líkamsrækt. Líkanið metum við með neðangreindri skipun og það borgar sig að vista líkanið sem hlut.
glm1 <- glm(reykir=='ja' ~ likamsraekt, data=puls, family='binomial')
Fyrsta inntakið í skipunina er formúla. Á vinstri hönd hennar verður að
vera breyta sem tekur gildin 0 og 1, eða þá TRUE og FALSE. Í þessu dæmi
er inntakið yrðingin reykir==’ja’
sem skilar TRUE ef
einstaklingurinn reykir en FALSE annars. Þar af leiðandi mun líkanið
meta gagnlíkindin á því að reykja. Á hægri hönd formúlunnar er
skýribreytan, sem í þessu tilviki er likamsraekt
.
Næstu tvö inntök skipunarinnar er nafnið á gagnatöflunni sem geymir
gögnin (puls
) og af hvaða gerð aðhvarfsgreiningarlíkanið er. Með
stillingunni family=’binomial’
tilgreinum við að tvíkosta
aðhvarfsgreining skuli framkvæmd með logistic tengifallinu.
Skipunin summary()
gefur okkur miklar upplýsingar um útkomu
aðhvarfsgreiningarinnar:
summary(glm1)
##
## Call:
## glm(formula = reykir == "ja" ~ likamsraekt, family = "binomial",
## data = puls)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -0.5680 -0.4825 -0.4566 -0.3864 3.0534
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.7428 0.2482 -7.023 2.18e-12 ***
## likamsraekt -0.1164 0.0547 -2.127 0.0334 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 293.2 on 452 degrees of freedom
## Residual deviance: 287.9 on 451 degrees of freedom
## (18 observations deleted due to missingness)
## AIC: 291.9
##
## Number of Fisher Scoring iterations: 5
Mikilvægustu upplýsingarnar úr aðhvarfsgreiningunni eru fólgnar í
töflunni Coefficients:
Í fyrsta dálki hennar má sjá metnu stuðlana, \(\hat \beta_0 = -1.7428\) og \(\hat \beta_1 = -0.1164\).
Staðalskekkju fyrir mat á stuðlunum má sjá í öðrum dálki.
Í þriðja dálki má sjá prófstærðir fyrir tilgátupróf sem prófa núlltilgátuna hvort stuðlarnir séu núll. Þannig prófar prófstærðin \(-7.023\) núlltilgátuna \(\beta_0 = 0\) og prófstærðin \(-2.127\) prófar núlltilgátuna \(\beta_1=0\).
P-gildin sem svara til þessara prófstærða má svo finna í fjórða dálkinum. P-gildið fyrir núlltilgátuna \(\beta_1=0\) er \(0.0334\), sem er minna en 0.05 og þar sem stuðullin er neikvæður getum við fullyrt að nemendur sem stunda mikla líkamsrækt séu ólíklegri til að reykja heldur en þeir sem stunda litla líkamsrækt.
Með því að setja metnu stuðlana í veldið á e fæst gagnlíkindahlutfall fyrir því að reykja við hverja aukna klukkustund sem að einstaklingur stundar líkamsrækt á viku. Þau finnum við með skipuninni:
exp(coef(glm1))
## (Intercept) likamsraekt
## 0.1750381 0.8901369
Í flestum tilvikum höfum við lítin áhuga á gagnlíkindahlutfallinu sem
svarar til (Intercept)
. Hins vegar höfum við mikinn áhuga á
gagnlíkindahlutfallinu sem stendur við likamsraekt
.
Hér sjáum við að gagnlíkindahlutfallið fyrir því að reykja við
hverja aukna klukkustund sem að einstaklingur stundar líkamsrækt á viku
er \(0.8901369\).
95% öryggisbil fyrir gagnlíkindahlutföllin sem fengust í tvíkosta aðhvarfsgreiningunni má finna með skipuninni:
exp(confint(glm1))
## 2.5 % 97.5 %
## (Intercept) 0.1061636 0.2811427
## likamsraekt 0.7941909 0.9840247
Sem fyrr höfum við ekki áhuga á öryggisbilinu sem svarar til
(Intercept)
. Öryggisbilið fyrir likamsraekt
er það sem við
viljum skoða, það er \([0.7941909, 0.9840247]\). Öryggisbilið
inniheldur ekki 1 í samræmi við það að við höfnuðum núlltilgátunni.
11.1.2. Tvíkosta aðhvarfsgreining með strjála skýribreytu
Tvíkosta aðhvarfsgreiningu má einnig beita á strjála skýribreytu. Til dæmis til að meta hvort nemendur sem drekka áfengi séu líklegri til að reykja heldur en þá sem ekki drekka áfengi. Líkanið metum við með neðangreindri skipun:
glm2 <- glm(reykir=='ja' ~ drekkur, data=puls, family='binomial')
Skipunin lítur á nákvæmlega sama hátt út og í kafla
11.1.1 nema að nú hefur breytan drekkur
tekið
stað breytunnar likamsraekt
. Skoðum nú summary()
af útkomu
aðhvarfsgreiningarinnar:
summary(glm2)
##
## Call:
## glm(formula = reykir == "ja" ~ drekkur, family = "binomial",
## data = puls)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -0.5007 -0.5007 -0.5007 -0.1684 2.9198
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.0134 0.1587 -12.686 <2e-16 ***
## drekkurnei -2.2351 1.0190 -2.193 0.0283 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 297.59 on 452 degrees of freedom
## Residual deviance: 287.48 on 451 degrees of freedom
## (18 observations deleted due to missingness)
## AIC: 291.48
##
## Number of Fisher Scoring iterations: 6
Mikilvægustu upplýsingarnar úr aðhvarfsgreiningunni eru sem fyrr fólgnar
í töflunni Coefficients:
. Taflan er einnig byggð upp á sama hátt en
nú birtist sér lína fyrir hvern flokk skýribreytunnar, annan en
viðmiðunarflokkinn. Þannig gefur heitið í línunni drekkurnei
að um
sé að ræða stuðla fyrir flokkinn nei
í skýribreytunni drekkur
og
viðmiðunarflokkurinn er því ja
.
Í fyrsta dálki töflunnar má sjá metnu stuðlana, \(\hat \beta = -2.0134\) og \(\hat \beta_a = -2.2351\).
Í þriðja dálki má sjá að prófstærðin \(-12.686\) prófa núlltilgátuna \(\beta = 0\) og prófstærðin \(-2.193\) prófar núlltilgátuna \(\beta_a=0\).
P-gildið fyrir núlltilgátuna \(\beta_a=0\) er \(0.0283\), sem er minna en 0.05 og þar sem stuðullin er neikvæður getum við fullyrt að nemendur sem ekki drekka áfengi séu ólíklegri til að reykja heldur en þeir sem stunda drekka áfengi.
Með því að setja metnu stuðlana í veldið á e fæst gagnlíkindahlutfall fyrir því að reykja á móti því að drekka ekki áfengi. Þau finnum við með skipuninni:
exp(coef(glm2))
## (Intercept) drekkurnei
## 0.1335312 0.1069842
Við höfum ekki áhuga á gagnlíkindahlutfallinu sem svarar til (Intercept)
,
en það sem stendur við drekkurnei
sýnir okkur gagnlíkindahlutfallið
fyrir því að reykja á móti því að drekka ekki er \(0.1069842\) sem
telst ansi lítið.
95% öryggisbil fyrir gagnlíkindahlutföllin sem fengust í tvíkosta aðhvarfsgreiningunni má finna með skipuninni:
exp(confint(glm2))
## 2.5 % 97.5 %
## (Intercept) 0.096558897 0.1801504
## drekkurnei 0.005988971 0.5029970
Sem fyrr höfum við ekki áhuga á öryggisbilinu sem svarar til
(Intercept)
, heldur það sem stendur við drekkurnei
, það er
\([0.005989, 0.502997]\). Öryggisbilið inniheldur ekki 1 í samræmi
við það að við höfnuðum núlltilgátunni.
11.1.3. Leiksvæði fyrir R kóða
Hér fyrir neðan er hægt að skrifa R kóða og keyra hann. Notið þetta svæði til að prófa ykkur áfram með skipanir kaflans. Athugið að við höfum þegar sett inn skipun til að lesa inn puls
gögnin sem eru notuð gegnum alla bókina.
# Gogn sott og sett i breytuna puls.
puls <- read.table ("https://raw.githubusercontent.com/edbook/haskoli-islands/main/pulsAll.csv", header=TRUE, sep=";")
# Setjid ykkar eigin koda her fyrir nedan:
# Sem daemi, skipunin head(puls) skilar fyrstu nokkrar radirnar i gognunum
# asamt dalkarheitum.
head(puls)