---
title: "Overwinterende watervogelindex"
date: 2025-12-17T10:00:00+01:00
thema: 
  - Beschermde natuur
  - Ecosystemen
  - Flora & fauna
  - Water
keywords: 
  - watervogels
  - overwinteraars
lang: nl
tab: indicator
verantwoordelijke: 
  - Koen Devos <koen.devos@inbo.be>
output: html_document
bibliography: ../references.bib
link-citations: TRUE
---

```{r setup, include=FALSE}
library(knitr)
opts_chunk$set(echo = FALSE, message = FALSE, warning = FALSE)
library(git2rdata)
library(plotly)
library(tidyverse)
library(scales)
library(INLA)
source(file.path("..", "..", "inbo_theme.R"))
library(htmlwidgets)
set.seed(20190920)
setWidgetIdSeed(20190920)
options(htmlwidgets.TOJSON_ARGS = list(pretty = TRUE))
conflicted::conflicts_prefer(dplyr::filter, dplyr::pull, plotly::layout,
                             plotly::config)
```

De index van overwinterende watervogels voor de winter 2023/24 bereikt een recordhoogte.
Dit is een bevestiging van de stijgende trend die sinds 2017-2018 ingezet is. 

```{r lees-gegevens}
read_vc("ruwe_data") |>
  mutate(index = index / 100) -> per_soort
per_soort %>%
  group_by(winter) %>%
  summarise(index = mean(index)) %>%
  mutate(cwinter = winter - max(winter)) -> gemiddelde
```

```{r model}
model <- inla(
  index ~
  f(
    cwinter, model = "rw2", scale.model = TRUE,
    hyper = list(theta = list(prior = "pc.prec", param = c(0.05, 0.001)))
  ),
  family = "gamma",
  data = gemiddelde,
  control.compute = list(waic = TRUE, return.marginals.predictor = TRUE)
)
```

```{r model-schattingen}
model$marginals.linear.predictor %>%
  lapply(inla.tmarginal, fun = exp) -> exp_marginal
gemiddelde %>%
  mutate(
    schatting = model$summary.fitted.values$mean,
    lcl90 = sapply(exp_marginal, inla.qmarginal, p = 0.05),
    lcl60 = sapply(exp_marginal, inla.qmarginal, p = 0.20),
    lcl30 = sapply(exp_marginal, inla.qmarginal, p = 0.35),
    ucl30 = sapply(exp_marginal, inla.qmarginal, p = 0.65),
    ucl60 = sapply(exp_marginal, inla.qmarginal, p = 0.80),
    ucl90 = sapply(exp_marginal, inla.qmarginal, p = 0.95),
  ) -> gemiddelde
```

```{r trend, fig.cap = "Figuur 1: gemiddelde watervogelindex", fig.heigth = 10}

p <- ggplot(
  gemiddelde,
  aes(x = winter, y = schatting, ymin = lcl90, ymax = ucl90)
) +
  geom_hline(aes(yintercept = 1, color = "Referentie"), linetype = 3) +
  geom_hline(yintercept = c(0.75, 1.33), linetype = 2) +
  geom_ribbon(aes(x = winter, y = schatting,
                  ymin = lcl90, ymax = ucl90,
                  fill = "90% CI"),
              alpha = 0.3) +
  # geom_ribbon(aes(ymin = lcl60, ymax = ucl60, fill = "CI2"), alpha = 0.3) +
  # geom_ribbon(aes(ymin = lcl30, ymax = ucl30, fill = "CI3"), alpha = 0.3) +
  geom_line(aes(color = "Schatting")) +
  geom_point(aes(y = index, x = winter, color = "Index")) +
  scale_x_continuous(
    breaks = pretty,
    labels = function(x) {
      paste0(x - 1, "-", x)
    }
  ) +
  scale_y_continuous(labels = percent) +
  theme(axis.title = element_blank()) +
  scale_color_manual(name = "Legende",
                     labels = c("Referentie", "Schatting", "90% CI", "Index"),
                     values = c(inbo_palette(1), inbo_palette(1),
                                inbo_palette(1), inbo_palette(1))) +
  guides(color = guide_legend("Legende"),
         fill = guide_legend(""))

if (interactive() || opts_knit$get("rmarkdown.pandoc.to") == "html") {
  annotaties <- data.frame(
    y = c(1, 0.75, 1.33),
    text = c(
      "toestand in %d",
      "belangrijke afname t.o.v. %d",
      "belangrijke toename t.o.v %d"
    ),
    position = c("top left", "bottom left", "top left")
  )

  pp <- ggplotly(p)

  for (i in seq_len(nrow(annotaties))) {
    pp <- pp %>% add_text(
      x = max(gemiddelde$winter) + 1,
      y = annotaties$y[i],
      text = sprintf(annotaties$text[i], min(gemiddelde$winter)),
      textposition = annotaties$position[i],
      showlegend = FALSE
    )
  }

  for (i in seq_along(pp$x$data)) {
    pp$x$data[[i]]$name <- str_replace_all(pp$x$data[[i]]$name,
                                             c(",1" = "",
                                               "\\)" = "",
                                               "\\(" = ""))
  }

  pp <- pp %>%
  layout(
    shapes = list(
      list(
        type = "rect",
        x0 = 1992, x1 = 2020,
        xref = "x",
        y0 = 0.75, y1 = 1.33,
        line = list(width = 0),
        fillcolor = "black",
         layer = "below"
        ))) %>%
    plotly::config(
      modeBarButtonsToRemove = c(
        "lasso2d", "select2d",
        "hoverClosestCartesian", "hoverCompareCartesian",
        "toggleSpikelines"
      ),
      displaylogo = FALSE
    )
  pp
} else {
  p
}

```

## Definitie

De index van overwinterende watervogels in figuur 1 is gebaseerd op het aantalsverloop van internationaal belangrijke soorten **ganzen en eenden** in Vlaanderen.
De index wordt bepaald op basis van zes midmaandelijkse tellingen per winter.

## Bespreking

In Vlaanderen worden elke winter zes midmaandelijkse tellingen uitgevoerd van oktober t/m maart [@DevosEtAl2020].
De tellingen van kleine rietgans, kolgans, grauwe gans, smient, krakeend, wintertaling, pijlstaart, slobeend, tafeleend en wilde eend worden samengevoegd om de trendindex voor overwinterende watervogels te bepalen.

De aantallen overwinterende watervogels vertoonden een significant stijgende trend tot ongeveer 2003, waarna een licht dalende trend ingezet werd. 
De **laatste vier winters** heeft zich echter een **herstel ingezet**.
De index bereikt in de **winter 2023-2024** zelfs een **recordhoogte**.
Dit komt vooral door een aanhoudende toename van verschillende ganzensoorten, met voor grauwe gans en kolgans zelfs de hoogste aantallen sinds het begin van de tellingen.
Daarnaast profiteerden veel eendensoorten, zoals krakeend, slobeend en pijlstaart, van de zeer natte omstandigheden door overvloedige regenval, met grote inundaties in heel wat valleigebieden tot gevolg.
Bij een aantal andere soorten is eerder sprake van een stabilisatie van de aantallen, na een periode waarin een (sterke) afname werd vastgesteld zoals bij de tafeleend.    

De trend van watervogels in Vlaanderen is een gecombineerd effect van de ontwikkelingen op Noordwest-Europees niveau en van regionale en lokale factoren [@DevosOnkelinx2013].
In Noordwest-Europa namen nagenoeg alle ganzen- en eendensoorten tijdens de voorbije 50 jaar toe.
Dit is een gevolg van enerzijds een **betere bescherming** van soorten en waterrijke gebieden (o.a. via de Europese Vogelrichtlijn), en anderzijds een **toegenomen voedselaanbod**.
Na een jarenlange toename is meer recent bij heel wat soorten een afvlakking of **kentering van die positieve trend** merkbaar.
Diverse studies tonen aan dat **klimaatverandering** een toenemende rol speelt in veranderingen in het Europese verspreidingsareaal [o.a. @LehikoinenEtAl2013; @MacLeanEtAl2008; @Pavon-JordanEtAt2019].

Daarnaast worden de trends in Vlaanderen minstens gedeeltelijk bepaald door **lokale veranderingen** in onder meer waterkwaliteit, menselijke activiteiten en natuurbeheer en -ontwikkeling.
Deze factoren kunnen een grote invloed uitoefenen op de draagkracht van gebieden voor watervogels, in hoofdzaak via wijzigingen in het voedselaanbod, zoals o.a.
vastgesteld langs de Zeeschelde.

```{r ganzen, fig.cap = "Figuur 2: index voor ganzen t.o.v. watervogelindex", fig.heigth = 10}

p <- ggplot(
  gemiddelde,
  aes(x = winter, y = schatting)
) +
  geom_hline(aes(yintercept = 1, color = "Referentie"), linetype = 3) +
  geom_hline(aes(yintercept = 0.75), linetype = 2) +
  geom_hline(aes(yintercept = 1.33), linetype = 2) +
  geom_ribbon(
    aes(ymin = lcl90, ymax = ucl90, fill = "90% CI"),
    alpha = 0.3
  ) +
  # geom_ribbon(aes(ymin = lcl60, ymax = ucl60), alpha = 0.3) +
  # geom_ribbon(aes(ymin = lcl30, ymax = ucl30), alpha = 0.3) +
  geom_line(aes(color = "Schatting")) +
  geom_point(aes(y = index, color = "Index")) +
  geom_line(
    data = filter(per_soort, str_detect(soort, "gans")),
    aes(x = winter, y = index, color = soort)
    ) +
  scale_x_continuous(
    breaks = pretty,
    labels = function(x) paste0(x - 1, "-", x)
  ) +
  scale_y_continuous(labels = percent) +
  scale_color_manual(name = "Legende",
                     labels = c("Referentie", "Schatting", "90% CI", "Index"),
                     values = c(inbo_palette(2)[2],
                                inbo_palette(3)[3],
                                inbo_palette(4)[4],
                                rep(inbo_palette(1), 3))) +
  guides(color = guide_legend("Legende"),
         fill = guide_legend("")) +
  theme(axis.title = element_blank())

# Plotly
if (interactive() || opts_knit$get("rmarkdown.pandoc.to") == "html") {
  pp <- ggplotly(p) %>%
    plotly::config(
      modeBarButtonsToRemove = list(
        "lasso2d", "select2d", "hoverClosestCartesian",
        "hoverCompareCartesian", "toggleSpikelines"
      ),
      displaylogo = FALSE
    )

  # Verwijder ",1" uit trace-namen
  for (i in seq_along(pp$x$data)) {
    if (!is.null(pp$x$data[[i]]$name)) {
      pp$x$data[[i]]$name <- str_replace_all(pp$x$data[[i]]$name,
                                             c(",1" = "",
                                               "\\)" = "",
                                               "\\(" = ""))
    }
  }
  pp
} else {
  p
}

```


```{r eenden, fig.cap = "Figuur 3: index voor eenden t.o.v. watervogelindex", fig.heigth = 10}

colors <- inbo_palette(7)

p <- ggplot(
  gemiddelde,
  aes(x = winter, y = schatting)
) +
  geom_hline(aes(yintercept = 1, color = "Referentie"), linetype = 3) +
  geom_hline(aes(yintercept = 0.75), linetype = 2) +
  geom_hline(aes(yintercept = 1.33), linetype = 2) +
  geom_ribbon(
    aes(ymin = lcl90, ymax = ucl90, fill = "90% CI"),
    alpha = 0.3
  ) +
  # geom_ribbon(aes(ymin = lcl60, ymax = ucl60), alpha = 0.3) +
  # geom_ribbon(aes(ymin = lcl30, ymax = ucl30), alpha = 0.3) +
  geom_line(aes(color = "Schatting")) +
  geom_point(aes(y = index, color = "Index")) +
  geom_line(
    data = filter(per_soort, str_detect(soort, "gans", negate = TRUE)),
    aes(x = winter, y = index, color = soort)
    ) +
  scale_x_continuous(
    breaks = pretty,
    labels = function(x) paste0(x - 1, "-", x)
  ) +
  scale_y_continuous(labels = percent) +
  scale_color_manual(name = "Legende",
                     labels = c("Referentie", "Schatting", "90% CI", "Index"),
                     values = c(colors[2:7],
                                rep(colors[1], 4))) +
  guides(color = guide_legend("Legende"),
         fill = guide_legend("")) +
  theme(axis.title = element_blank())


if (interactive() || opts_knit$get("rmarkdown.pandoc.to") == "html") {
  pp <- ggplotly(p) %>%
    plotly::config(
      modeBarButtonsToRemove = list(
        "lasso2d", "select2d", "hoverClosestCartesian",
        "hoverCompareCartesian", "toggleSpikelines"
      ),
      displaylogo = FALSE
    )

  for (i in seq_along(pp$x$data)) {
    if (!is.null(pp$x$data[[i]]$name)) {
      pp$x$data[[i]]$name <- str_replace_all(pp$x$data[[i]]$name,
                                             c(",1" = "",
                                               "\\)" = "",
                                               "\\(" = ""))
    }
  }

  pp
} else {
  p
}

```

```{r bewaar-schatting, results = "hide"}
gemiddelde |>
  select(-cwinter) |>
  write_vc("gemiddelde", sorting = "winter", optimize = FALSE, digits = 3)
```

## Referenties
