Jacob Liljehult
Klinisk sygeplejespecialist
cand.scient.san, Ph.d.
Neurologisk afdeling
Nordsjællands Hospital
Logistisk regression laves med funktionen
glm( y ~ x, data = data, family = "binomial")
,
altså en generaliseret linær model funktion hvor family
-argumentet er defineret som "binomial".
Resultatet kaldes derefter med summary()
-funktionen:
model1 <- glm( mors1y ~ diagnosis,
data = strokedata, family = "binomial")
summary(model1)
Min | 1Q | Median | 3Q | Max |
---|---|---|---|---|
-0.9658 | -0.5853 | -0.5853 | -0.5853 | 1.9229 |
Estimate | Std. Error | z value | Pr(>|z|) | ||
---|---|---|---|---|---|
(Intercept) | -0.5205 | 0.1972 | -2.640 | 0.0083 | ** |
diagdictIS | -1.1569 | 0.2170 | -5.332 | 9.69e-08 | *** |
I summary()
angives coefficienterne på logaritmisk skala og skal derfor transformeres med
exp()
for at man får odds ratioerne.
En lidt lettere og overskuelig måde at få odds ratioerne er med funktionen publish
fra pakken
{Publish}
:
Publish::publish(model1)
Variable | Units | OddsRatio | CI.95 | p-value |
---|---|---|---|---|
diagnosis | ICH | Ref | ||
IS | 0.31 | [0.21;0.48] | <1e-04 |
Som default sortere r
factor variable i alfabetisk orden og det er ikke altid fortolkningsmæssigt
det mest korrekte. Man kan derfor have brug for at vælge en anden referencekategori, hvilket kan gøres med
funktionen relevel(var, ref = referenceværdi)
:
model2 <- glm(mors1y ~ relevel(diagnosis, ref = "IS"), data = strokedata, family = "binomial")
Publish::publish(model2)
Variable | Units | OddsRatio | CI.95 | p-value |
---|---|---|---|---|
relevel(diagnosis, ref = "IS") | IS | Ref | ||
ICH | 3.18 | [2.08;4.87] | <1e-04 |
Modellen kan justeres for kovariate ved at tilføje dem på x-siden af formlen svarende til
y = x + a
. I nedenstående eksempel laves først en model med et års dødelighed som
funktion af rygning:
model3 <- glm(mors1y ~ relevel(smoking, ref = "Never"), data = strokedata, family = "binomial")
Publish::publish(model3)
Variable | Units | OddsRatio | CI.95 | p-value |
---|---|---|---|---|
relevel(smoking, ref = "Never") | Never | Ref | ||
Current | 0.54 | [0.35;0.83] | 0.004904 | |
Previous | 0.87 | [0.60;1.28] | 0.486122 |
I modellen ser det ud til at rygning beskytter imod at dø, hvilket umiddelbart ikke giver mening. En mulig confounder kunne være alder (altså at forskellen i dødelighed er udtryk for at grupperne har forskellige aldre):
model4 <- glm(mors1y ~ relevel(smoking, ref = "Never") + age, data = strokedata, family = "binomial")
Publish::publish(model4)
Variable | Units | OddsRatio | CI.95 | p-value |
---|---|---|---|---|
relevel(smoking, ref = "Never") | Never | Ref | ||
Current | 1.27 | [0.78;2.08] | 0.3343 | |
Previous | 1.01 | [0.67;1.53] | 0.9634 | |
age | 1.11 | [1.09;1.14] | <1e-04 |
Resultatet her viser at der er en signifikant association mellem alder og dødelighed, men at associationen mellem rygning og dødelighed ikke længere er signifikant (for nogle af kategorierne). Alder var således en confounder og den tilsyneladende beskyttende effekt af at være nuværende ryger kan derfor forklares med at nuværende rygere er yngre.
Model 4 i ovenstående eksempel består af model 3 med en tilføjet kovariate (alder) - og man siger derfor at model 4 er nested i model 3. I modeludviklingen kan det være interessant at undersøge om tilføjelsen af en (eller flere) kovariate bidrager med mere information til modellen.
Summary()
funktionen giver to mål man kan bruge til at sammenligne to nestede modeller: AIC og residual
deviance.
AIC kan bruges til at lave en uformel sammenligning – idet en lavere AIC tyder på en "bedre" model - altså en model med mere information.
Hvis man vil kalde AIC uden at kalde hele summary()
-outputtet, kan man nøjes med post-fixet $aic
:
AIC for model 4 er lavere end for model 3, og model 4 er derfor en mere præcis/informationsrig model.
Residual deviance kan enten bruges på samme måde som AIC, men kan også bruges til at lave en formel sammenligning ved hjælp af en log-likelihood ratio test.
Residual deviance kan kaldes fra modellen med post-fixet $deviance
:
Testet laves ved at man tager chi2-fordelingen af forskellen mellem deviancerne med funktionen
pchisq( chi, df = df, lower.tail = FALSE)
:
Udregningen kan også laves med funktionen lrtest( m1, m2)
, som findes i pakken
{lmtest}
:
#Df | LogLik | Df | Chisq | Pr(>Chisq) | ||
---|---|---|---|---|---|---|
1 | 3 | -446.60 | ||||
2 | 4 | -375.58 | 1 | 142.04 | < 2.2e-16 | *** |
Bemærk at lmtest
bruger en lidt anderledes fremgangmåde til at udregne Chi2-værdien,
men at resultatet er det samme: