Kapitel 4 Anwendung

Als Beispiel verwenden wir hier rwm1984, ein Subset des Datensatz rwm5yr (vgl. Abschnitt 1.1, ?COUNT::rwm1984), der Angaben zur Anzahl der Arztbesuche pro Person mit zusätzlichen demographischen Merkmalen enthält. Für unser Beispielmodell verwenden wir folgende Variablen:

  • docvis: Abhängige Variable, Anzahl der Arztbesuche im Jahr (0-121)
  • outwork: Arbeitslos (1), arbeitend (0)
  • age: Alter (25 - 64)
# Daten
data(rwm1984, package = "COUNT")

# Model fit
mod_rwm <- glm(docvis ~ outwork + age, family = poisson(), data = rwm1984)

# Summary display
pander(summary(mod_rwm))
  Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.03352 0.03918 -0.8554 0.3923
outwork 0.4079 0.01884 21.65 6.481e-104
age 0.02208 0.0008377 26.36 3.73e-153

(Dispersion parameter for poisson family taken to be 1 )

Null deviance: 25791 on 3873 degrees of freedom
Residual deviance: 24190 on 3871 degrees of freedom

Das erste was wir zur Evaluation unseres Modells tun können, ohne direkt andere Modelle zum vergleich heranzuziehen, ist die beobachteten Counts und die auf Basis des Modells erwarteten Counts zu vergleichen, um ein grobes Gefühl für die Situation zu erhalten (Code frei adaptiert nach Hilbe (2014), p. 88f):

# Beobachtete und erwartete counts
observed_v_expected <- rwm1984 %>%
  count(docvis, name = "observed") %>%
  mutate(
    expected = purrr::map_dbl(docvis, ~{
                  dpois(.x, fitted(mod_rwm)) %>%
                    sum() %>%
                    round(2)
                }),
    difference = observed - expected
  ) 

observed_v_expected %>%
  head(5) %>%
  pander(caption = "Observed and expected counts")
Observed and expected counts
docvis observed expected difference
0 1611 264.8 1346
1 448 627.1 -179.1
2 440 796 -356
3 353 731.6 -378.6
4 213 554.6 -341.6
# Mittelwert und Varianz der jeweiligen counts
# (für "expected" gilt Varianz := Mittelwert)
tribble(
  ~Counts,   ~Mean,                 ~Variance,
  "observed", mean(rwm1984$docvis), var(rwm1984$docvis),
  "expected", mean(fitted(mod)),    mean(fitted(mod))
) %>%
  pander(caption = "Mean & variance of observed and expected counts")
Mean & variance of observed and expected counts
Counts Mean Variance
observed 3.163 39.39
expected 5.401 5.401
# Plot: observed vs. expected counts
observed_v_expected %>%
  filter(docvis <= 12) %>%
  gather(type, count, observed, expected) %>%
  ggplot(aes(x = docvis, y = count, fill = type, color = type)) +
  geom_point(shape = 21, color = "black", stroke = .5, size = 2) +
  geom_path(linetype = "dotted", size = .25) +
  scale_x_continuous(breaks = seq(0, 12, 2)) +
  scale_fill_brewer(palette = "Set1", aesthetics = c("color", "fill"), name = "") +
  labs(
    title = "rwm1984: Poisson Modell",
    subtitle = "Observed und expected counts bei overdispersion",
    caption = "Output begrenzt auf docvs <= 12",
    x = "Anzahl der Arztbesuche (docvis)", y = "Count"
  ) +
  theme(legend.position = "top")

Anhand der ersten Tabelle können wir recht schnell erkennen, dass wir hier deutlich mehr Nullen beobachten als das Modell vorhersagt – mehr dazu in Abschnitt 4.2.
Der Plot veranschaulicht den eher suboptimalen model fit unter diesen Umständen (overdispersion und (bzw. bedingt durch) zero-inflation).

Literatur

Hilbe, Joseph M. 2014. Modeling Count Data. Cambridge: Cambridge University Press. https://doi.org/10.1017/CBO9781139236065.