Jacob Liljehult
Klinisk sygeplejespecialist
cand.scient.san, Ph.d.
Neurologisk afdeling
Nordsjællands Hospital
Poisson regression bruges til at lave intensitets-baserede, marginale modeller, til at sammenligne antallet af tilfælde i to grupper i forhold til mængden af risiko-tid.
Regressionen udføres ved hjælp af en generaliseret linær model med funktionn glm
(), med syntaxen:
glm( y ~ x + offset(log(z)),
data = data, family="poisson")
Offsetet er logaritmen af den tidsstruktur der er i data - det kan fx være person-risiko-år, altså summen af år hvor
alle personer i gruppen er i risiko for udfaldet. Hvis en person bliver fulgt op efter et år har personen bidraget
med 1 person-år; mens en person der dør efter 60 dage ikke længere er i risiko efter sin død og derfor kun bidrager
med 60/365 person-år til modellen. Events tælles som antallet af events over risiko-perioden og samme person kan
derfor godt bidrage med flere events over risiko-personen. Hvis udfaldet er antal epileptiske anfald kan samme patient
godt have flere epileptiske anfald over perioden - og hvert anfald tælles derfor som ét event.
family
-argumentet defineres som "poisson"
Ud fra datasættet strokedata kan man undersøge om det øger risikoen for en ny apopleksi, hvis man tidligere har haft apopleksi. Der bruges følgende variable: prevapo = tidligere apopleksi; recurrence = ny apopleksi; daystorcurrence = antal dage indtil ny apopleksi, dødsfald eller afslutningen af opfølgningen.
Fordi det er en marginal model skal data omstruktureres til et tabel-format, så man får de samlede antal for
hver gruppe. Det kan fx gøres med {dplyr}
tidligereapo | events | personaar | rate |
---|---|---|---|
<fctr> | <int> | <dbl> | <dbl> |
N | 73 | 2133.6164 | 0.03421421 |
Y | 43 | 595.2466 | 0.07223897 |
Alternativt kan man manuelt indtastning data:
Her kan vi altså se at blandt personer der tidligere har haft en apopleksi er der 43 nye indlæggelser med apopleksi indenfor en samlet risiko-periode på 595,2466 person-år; hvilket giver en rate på 0,072 per person-år. Blandt personer der ikke tidligere havde haft apopleksi var der 73 nye indlæggelser indenfor en samlet risiko-periode på 2133,2466 person-år; svarende til en rate på 0,034 per person-år.
Poisson-modellen opstilles således:
Det 'rå' resultat af modellen kan kaldes med summary()
, men resultatet er her på
en logaritmisk skala og kan umiddelbart være svært at fortolke:
Estimate | Std. Error | z value | Pr(>|z|) | ||
---|---|---|---|---|---|
(Intercept) | -3.3751 | 0.1170 | -28.837 | < 2e-16 | *** |
factor(tidligereapo)Y | 0.7473 | 0.1922 | 3.888 | 0.000101 | *** |
For at gøre fortolkningen lettere kan man bruge funktionen publish()
fra pakken
{Publish}
til at omregne estimat og konfidens-interval til Hazard-ratio skala:
Variable | Units | HazardRatio | CI.95 | p-value |
---|---|---|---|---|
factor(tidligereapo) | N | Ref | ||
Y | 2.11 | [1.45;3.08] | 0.0001012 |
Modellen viser altså at risikoen for at få en ny apopleksi efter udskrivelsen er omkring dobbelt så høj blandt de patienter der tidligere havde haft en apopleksi sammenlignet med de patienter, der ikke tidligere havde haft det.
Hvis man vil justere modellen for en mulig confounder kan der gøres ved at stratificere tabellen for
denne variabel, så man får antal events og person-tid for hver strata. I dette eksempel er der stratificeret
for alder ved at opdele alders variablen (som i strokedata
er kontinuert) i tre
grupper (henholdsvis <60 år/ 60-75 år/ >75 år) - herefter er tabellen er stratificeret for både
tidligere apopleksi og alder:
tidligereapo | aldersgruppe | events | personaar | rate |
---|---|---|---|---|
<fctr> | <fctr> | <int> | <dbl> | <dbl> |
N | 1 | 13 | 449.80822 | 0.02890121 |
N | 2 | 35 | 1032.46849 | 0.03389934 |
N | 3 | 25 | 651.33973 | 0.03838243 |
Y | 1 | 5 | 92.95616 | 0.05378879 |
Y | 2 | 23 | 273.72603 | 0.08402562 |
Y | 3 | 15 | 228.56438 | 0.06562702 |
For at justere for alder indsætte alders variablen efter x-argumentet (men før offset argumentet):
Variable | Units | HazardRatio | CI.95 | p-value |
---|---|---|---|---|
factor(tidligereapo) | N | Ref | ||
Y | 2.09 | [1.43;3.05] | 0.0001369 | |
factor(aldersgruppe) | 1 | Ref | ||
2 | 1.29 | [0.76;2.20] | 0.3405091 | |
3 | 1.27 | [0.73;2.22] | 0.4045718 |
Den justerede model viser at Hazard-ratioen for tidligere apopleksi ikke ændre sig nævneværdigt efter justering for alder og at der ikke er noget der tyder på en alders gradient.
Man kan lave en goodness-of-fit analyse for at sammenligne to nestede modeller (altså om tilføjelsen
af en justering forbedre modellen signifikant) ved hjælp af en log-likelihood test. Den laves lettest
med funktionen lrtest()
fra pakken {lmtest}
. For at testen
virker er det vigtigt at de to modeller, der sammenlignes er nestede og er udregnet på samme dataset.
#Df | LogLik | Df | Chisq | Pr(>Chisq) | |
---|---|---|---|---|---|
1 | 2 | -14.866 | |||
2 | 4 | -14.364 | 2 | 1.005 | 0.605 |
Testet viser en p-værdi på 0,60, hvilket vil sige at tilføjelse af alder ikke har forbedret modellen.