---
title: ""

format: 
  html:
    fig-width: 9
    fig-height: 8
    fig-dpi: 300
    # embed-resources: TRUE # Entwicklung
    # theme: "null" # Entwicklung
    embed-resources: FALSE # Veröffentlichung
    theme: none # Veröffentlichung

execute: 
  echo: FALSE
  output: asis
  warning: FALSE
  error: FALSE
---

```{r}
#| label: pakete_und_daten
#| output: false

library(tidyverse)
library(SMChelpR)
library(leaflet) # https://rstudio.github.io/leaflet/
library(geojsonio)
library(mapview) # to save maps as images, PhantomJS needed!
library(htmltools)
library(htmlwidgets)
library(scales)
library(DT)

## wichtige Story-Parameter
storyNo <- 24123
file_name_code <- "2024_NRW_Krankenhausplanung.qmd"

##############################

imagepath <-
  file.path("reports", storyNo)
dir.create(imagepath, showWarnings = FALSE, recursive = TRUE)

## workspace directory in RStudio interaktiv
if (rstudioapi::isAvailable()) {
  setwd(dirname(rstudioapi::getActiveDocumentContext()$path))
}

if (is.na(file_name_code)) {
  stop("Dateiname der qmd nicht gesetzt")
}

file.copy(
  from = file_name_code,
  to = file.path(imagepath, paste0(today(), "_", file_name_code)),
  overwrite = TRUE
)
```


```{r}
#| label: set-graphic-parameters
#| output: false 

options(scipen = 999) # set scientific notation to be off
SMC_theme_ggplot()

# taken from https://personal.sron.nl/~pault/#sec:qualitative
COLOR_BLUE <- '#4477AA'
COLOR_GREEN <- '#228833'
COLOR_YELLOW <- '#CCBB44'
COLOR_RED <-  '#EE6677'
COLOR_GREY <- '#eeeeee'

caption_MAGS <-
  "Quelle: Ministerium für Arbeit, Gesundheit und Soziales des Landes Nordrhein-Westfalen"

caption_GBA <-
  "Quelle: Qualitätsberichte der Krankenhäuser (2021 & 2022), bereitgestellt vom Gemeinsamen Bundesausschuss (G-BA), Berechnungen: Science Media Center Germany."

caption_MAGS_GBA <-
  "Quelle: Ministerium für Arbeit, Gesundheit und Soziales des Landes Nordrhein-Westfalen | Quelle: Qualitätsberichte der Krankenhäuser (2021 & 2022), bereitgestellt vom Gemeinsamen Bundesausschuss (G-BA), Berechnungen: Science Media Center Germany."

if (exists("caption_")) {
  stop("Caption wurde nicht angepasst")
}
```

```{r}
#| label: define-functions
#| output: false 

create_base_map <- function(markers_data, Leistungsgruppe) {
  extra_style <- tags$style(".leaflet-container { background: white !important; }")
  
  
  map <- leaflet(
    options = leafletOptions(
      minZoom = 5,
      maxZoom = 10,
      opacity = 0,
      doubleClickZoom = FALSE,
      scrollWheelZoom = FALSE,
      maxBoundsViscosity = 1 # If maxBounds is set, this option controls how solid the bounds are when dragging
    )
  ) |>
    setView(lng = 10, lat = 51.4, zoom = 7.0) |>
    setMaxBounds(
      lng1 = 5.5,
      lat1 = 52.8,
      lng2 = 9.8,
      lat2 = 49.5
    ) |>
    addProviderTiles(provider = providers$OpenStreetMap.DE,
                     options = providerTileOptions(opacity = 0.3)) |>
    addScaleBar(position = "topright") |>
    addLegend(
      "bottomright",
      colors = c(COLOR_BLUE, COLOR_GREEN, COLOR_YELLOW, COLOR_RED),
      labels = c(
        "mehr genehmigt",
        "vollständig genehmigt",
        "teilweise genehmigt",
        "nicht genehmigt"
      ),
      title = HTML(
        paste0(
          Leistungsgruppe,
          "<br/>",
          "<small>Entscheidung des Landes (vorläufig): </small>",
          "<br/>"
        )
      ),
      opacity = 1
    ) |>
    addPolylines(data = bundeslaender,
                 color = "black",
                 weight = 1) |>
    addCircleMarkers(
      data = markers_data,
      radius = 5,
      color = markers_data$color,
      stroke = FALSE,
      fillOpacity = 1,
      label = markers_data$label,
      labelOptions = labelOptions(style = list("font-size" = "12px")),
      options = markerOptions(riseOnHover = TRUE)
    ) |>
    prependContent(extra_style)
  
  map
}

```

```{r}
#| label: load-data
#| output: false 

bundeslaender <- geojsonio::topojson_read(file.path("bundeslaender_simplified.topojson"))

#####################
# Qualitätsberichte #
#####################

loadRData <- function(fileName) {
  #loads an RData file, and returns it
  load(fileName)
  get(ls()[ls() != "fileName"])
}

Fallzahlen_Prozeduren_2021 <- loadRData(file.path("data", "Fallzahlen_Prozeduren_2021.Rdata")) |>
  mutate(Jahr = 2021)
Fallzahlen_Prozeduren_2022 <- loadRData(file.path("data", "Fallzahlen_Prozeduren_2022.Rdata")) |>
  mutate(Jahr = 2022)


Qualitaetsdaten_2021 <- loadRData(file.path("data", "Qualitaetsdaten_das_files_2021.RData")) |>
  mutate(Jahr = 2021)
Qualitaetsdaten_2022 <- loadRData(file.path("data", "Qualitaetsdaten_das_files_2022.RData")) |>
  mutate(Jahr = 2022)

Qualitaetsdaten <- Qualitaetsdaten_2021 |> 
  full_join(Qualitaetsdaten_2022) |>
  group_by(Jahr) |> 
  filter(Kuerzel == "HEP") |> # HEP == Hüftendoprothetik
  rename(Fallzahl_QS = Fallzahl) |>
  select(IK, Standortnummer, Bezeichnung, Kuerzel, Fallzahl_QS, Jahr) |> 
  pivot_wider(
    names_from = Jahr,
    values_from = Fallzahl_QS,
    names_prefix = "Fallzahl_QS_"
  )

###################################
# NRW Krankenhausplanung Anhörung #
###################################

server_url <- "https://data.smclab.io/v1/graphql"

db_prefix <- "data_"

tabellenvars_query_body <- paste0(
  "query MyQuery {",
  db_prefix,
  "kliniken_nrw_krankenhausplanung_anhoerung {
    IK
    Kreis
    Landesteil
    Leistungsgruppe
    Leistungsgruppe_Id
    Name_Krankenhaus
    Planungsebene
    Regierungsbezirk
    Standortnummer
    Versorgungsgebiet
    beantragender_Standort_Name
    beantragte_Fallzahl
    genehmigte_Fallzahl
    relationship_standortnummer {
      Ort 
      lat
      lon
    }
  }
}"
)

nrw_krankenhausplanung_anhoerung <- GraphQL_get_table_string(tabellenvars_query_body, datenserver = server_url) |>
  unnest(relationship_standortnummer) |>
  mutate(
    Genehmigung = case_when
    (
      Leistungsgruppe == "Intensivmedizin" ~
        case_when(
          genehmigte_Fallzahl == 3 ~ "Intensivmedizin hochkomplex",
          genehmigte_Fallzahl == 2 ~ "Intensivmedizin komplex",
          genehmigte_Fallzahl == 1 ~ "Intensivmedizin",
          genehmigte_Fallzahl == 0 ~ "keine Zuweisung"
        ),
      (
        Leistungsgruppe == "Komplexe Endokrinologie und Diabetologie" |
          Leistungsgruppe == "Komplexe Gastroenterologie" |
          Leistungsgruppe == "Komplexe Nephrologie" |
          Leistungsgruppe == "Komplexe Pneumologie" |
          Leistungsgruppe == "Komplexe Rheumatologie" |
          Leistungsgruppe == "Plastische und Rekonstruktive Chirurgie" |
          Leistungsgruppe == "Kinder- und Jugendchirurgie"
      ) ~
        case_when(
          genehmigte_Fallzahl == 1 ~ "Zuweisung",
          genehmigte_Fallzahl == 0 ~ "keine Zuweisung"
        ),
      (
        Leistungsgruppe != "Intensivmedizin" |
          Leistungsgruppe == "Komplexe periphere arterielle Gefäße"
      ) ~
        # remaining Leistungsgruppe
        case_when(
          genehmigte_Fallzahl > beantragte_Fallzahl &
            genehmigte_Fallzahl > 0 ~ "mehr genehmigt",
          genehmigte_Fallzahl == beantragte_Fallzahl &
            genehmigte_Fallzahl > 0 ~ "vollständig genehmigt",
          genehmigte_Fallzahl > 0 ~ "teilweise genehmigt",
          genehmigte_Fallzahl == 0 ~ "nicht genehmigt"
        )
    )
  )

```


```{r}
#| label: read-OPS-codes-from-QB
#| output: false 

#########################
# "Endoprothetik Hüfte" #
#########################

example_endo_huefte <- Fallzahlen_Prozeduren_2021 |>
  full_join(Fallzahlen_Prozeduren_2022) |>
  group_by(Jahr, Standortnummer) |>
  filter(Standortnummer %in% nrw_krankenhausplanung_anhoerung$Standortnummer) |>
  filter(str_detect(OPS_301, "5-820")) |>
  left_join(
    nrw_krankenhausplanung_anhoerung |>
      filter(Leistungsgruppe == "Endoprothetik Hüfte"),
    by = c("Standortnummer")) |> 
  # NA bedeutet: mindestens 1 Fall, < 4 Fälle -> also maximal 3 Fälle
  mutate(Anzahl_min = ifelse(is.na(Anzahl), 1, Anzahl),
         Anzahl_max = ifelse(is.na(Anzahl), 3, Anzahl),) |>
  summarize(
    Fallzahl_OPS_min = sum(Anzahl_min, na.rm = FALSE),
    Fallzahl_OPS_max = sum(Anzahl_max, na.rm = FALSE)
  ) |> 
  right_join(
    nrw_krankenhausplanung_anhoerung |>
      filter(Leistungsgruppe == "Endoprothetik Hüfte"),
    by = c("Standortnummer")) |> 
  select(
    Jahr,
    Standortnummer,
    Name_Krankenhaus,
    beantragender_Standort_Name,
    Fallzahl_OPS_min,
    Fallzahl_OPS_max,
    beantragte_Fallzahl,
    genehmigte_Fallzahl,
    Leistungsgruppe,
    Genehmigung,
    lat,
    lon
  ) |>
  pivot_wider(
    names_from = Jahr,
    values_from = c(Fallzahl_OPS_min, Fallzahl_OPS_max)
  ) |>
  left_join(Qualitaetsdaten, by = "Standortnummer")

# Deal with cases where multiple entries for the same Standortnummer exist due to different IKs in the Qualitätsberichte (e.g. due to clinic renamings)
corrected_doublets <- example_endo_huefte |>
  add_count(Standortnummer) |> 
  filter(n >= 2) |> 
  select(-IK) |> 
  group_by(Standortnummer) |>
  reframe(across(everything(), ~ coalesce(., first(na.omit(.))))) |> 
  distinct() |> 
  select(-n) 

unique_rows <- example_endo_huefte |> 
  add_count(Standortnummer) |> 
  filter(n == 1) |> 
  select(-n) 

example_endo_huefte <- bind_rows(unique_rows, corrected_doublets)

###########################
# "Tiefe Rektumeingriffe" #
###########################

example_tiefe_rektum <- Fallzahlen_Prozeduren_2021 |>
  full_join(Fallzahlen_Prozeduren_2022) |>
  group_by(Jahr, Standortnummer) |>
  filter(Standortnummer %in% nrw_krankenhausplanung_anhoerung$Standortnummer) |>
  filter(
    str_detect(OPS_301, "5-484.2") |
      str_detect(OPS_301, "5-484.5") |
      str_detect(OPS_301, "5-484.6") | str_detect(OPS_301, "5-485")
  ) |>
  left_join(
    nrw_krankenhausplanung_anhoerung |>
      filter(Leistungsgruppe == "Tiefe Rektumeingriffe"),
    by = c("Standortnummer")) |> 
  # NA bedeutet: mindestens 1 Fall, < 4 Fälle -> also maximal 3 Fälle
  mutate(Anzahl_min = ifelse(is.na(Anzahl), 1, Anzahl),
         Anzahl_max = ifelse(is.na(Anzahl), 3, Anzahl),) |>
  summarize(
    Fallzahl_OPS_min = sum(Anzahl_min, na.rm = FALSE),
    Fallzahl_OPS_max = sum(Anzahl_max, na.rm = FALSE)
  ) |> 
  right_join(
    nrw_krankenhausplanung_anhoerung |>
      filter(Leistungsgruppe == "Tiefe Rektumeingriffe"),
    by = c("Standortnummer")) |> 
  select(
    Jahr,
    Standortnummer,
    Name_Krankenhaus,
    beantragender_Standort_Name,
    Fallzahl_OPS_min,
    Fallzahl_OPS_max,
    beantragte_Fallzahl,
    genehmigte_Fallzahl,
    Leistungsgruppe,
    Genehmigung,
    lat,
    lon
  ) |>
  pivot_wider(
    names_from = Jahr,
    values_from = c(Fallzahl_OPS_min, Fallzahl_OPS_max)
  )

#################
# "Stroke Unit" #
#################

example_stroke_unit <- Fallzahlen_Prozeduren_2021 |>
  full_join(Fallzahlen_Prozeduren_2022) |>
  group_by(Jahr, Standortnummer) |>
  filter(Standortnummer %in% nrw_krankenhausplanung_anhoerung$Standortnummer) |>
  filter(str_detect(OPS_301, "8-981") | str_detect(OPS_301, "8-98b")) |>
  left_join(
    nrw_krankenhausplanung_anhoerung |>
      filter(Leistungsgruppe == "Stroke Unit"),
    by = c("Standortnummer")) |> 
  # NA bedeutet: mindestens 1 Fall, < 4 Fälle -> also maximal 3 Fälle
  mutate(Anzahl_min = ifelse(is.na(Anzahl), 1, Anzahl),
         Anzahl_max = ifelse(is.na(Anzahl), 3, Anzahl),) |>
  summarize(
    Fallzahl_OPS_min = sum(Anzahl_min, na.rm = FALSE),
    Fallzahl_OPS_max = sum(Anzahl_max, na.rm = FALSE)
  ) |> 
  right_join(
    nrw_krankenhausplanung_anhoerung |>
      filter(Leistungsgruppe == "Stroke Unit"),
    by = c("Standortnummer")) |> 
  select(
    Jahr,
    Standortnummer,
    Name_Krankenhaus,
    beantragender_Standort_Name,
    Fallzahl_OPS_min,
    Fallzahl_OPS_max,
    beantragte_Fallzahl,
    genehmigte_Fallzahl,
    Leistungsgruppe,
    Genehmigung,
    lat,
    lon
  ) |>
  pivot_wider(
    names_from = Jahr,
    values_from = c(Fallzahl_OPS_min, Fallzahl_OPS_max)
  ) 

```

::: m-news-single__ce

- Klinikreform in NRW wird konkreter; Blaupause für den Bund
- vor allem in spezialisierten Bereichen deutliche Konzentrierung erkennbar
- Recherche-Tool: interaktives Dashboard und Data Report zur aktuellen Planung in NRW mit allen Kliniken und Leistungsgruppen

Auf Bundesebene streitet Gesundheitsminister Karl Lauterbach weiterhin mit den Ländern über die Details der geplanten Krankenhausreform. Während die Diskussionen auf höchster Ebene noch hitzig verlaufen, nimmt die Reform in Nordrhein-Westfalen Gestalt an. Dort wissen die Kliniken bereits, wie die neuen Leistungsgruppen verteilt werden sollen – ein wesentlicher Bestandteil der Reform, die das Gesundheitssystem revolutionieren soll. NRW dient hierbei als Blaupause für den Bund.

Die Zuweisung der Leistungsgruppen ist dabei entscheidend, da sie bestimmt, welche Krankenhäuser künftig welche Behandlungen in welchem Umfang anbieten dürfen. Dies soll zu einer stärkeren Spezialisierung führen, was bedeutet, dass künftig nicht jedes Krankenhaus jede Behandlung durchführen wird.

Konkrete Klinikschließungen aufgrund der Verteilung der neuen Leistungsgruppen sind bislang zwar nicht erkennbar, für viele Krankenhäuser bedeutet die Reform aber eine Herausforderung: Sie müssen sich anpassen und möglicherweise ihr bisheriges Angebot stark einschränken oder erweitern, um den neuen Anforderungen gerecht zu werden. Dies wird sich auch auf die Wirtschaftlichkeit der Häuser auswirken. Die Zuweisung der Leistungsgruppen wird zudem zu einer Umverteilung der Patientenströme führen, was den Wettbewerb unter den Kliniken verschärfen dürfte – zumal sich das Personal womöglich eher in Richtung von Kliniken mit vielen Leistungsgruppen und hohen Fallzahlen orientiert.

In NRW zeichnet sich nun vor allem im „Mittelbau“ der Leistungsgruppen, also im teilspezialisierten Bereich, eine veränderte Kliniklandschaft ab. Auch im hochspezialisierten Bereich, der bereits sehr konzentriert ist, sind bei einzelnen Leistungsgruppen weitere Verschiebungen bei den Fallzahlen zwischen Standorten zu erwarten. Etwa jede zehnte Klinik von insgesamt 553 Klinikstandorten bekommt mehr als die Hälfte ihrer beantragten Leistungsgruppen nicht genehmigt. Die bisherige Grundversorgung bleibt in weiten Teilen erhalten.

<b>Das SMC hat zu den vorläufigen Entscheidungen des Landes NRW eine Übersicht für alle Leistungsgruppen samt beantragter und genehmigter Fallzahlen erstellt, die Sie in unserem <a href="https://krankenhausplanung-nrw.smc.report/">interaktiven Dashboard</a> finden. Es beruht maßgeblich auf den Ergebnissen der aktuellen Anhörungsrunden des NRW-Gesundheitsministeriums. Nähere Erläuterungen zur Erstellung des Dashboards und zu etwaigen Limitationen finden Sie auf dessen Startseite. Alle Daten stehen dort auch als Download für regionale Recherchen zur Verfügung.</b>

Die Grundlage für die Erteilung eines Versorgungsauftrags durch das Land ergibt sich für jede Leistungsgruppe durch die Erfüllung von <a href="https://www.mags.nrw/system/files/media/document/file/krankenhausplan_nrw_2022.pdf">Mindestkriterien</a>. Dazu zählen etwa die Erbringung verwandter Leistungsgruppen, die technische und personelle Ausstattung sowie bestimmte Mindestfallzahlen. Diese Kriterien sollen sicherstellen, dass zum Beispiel nur gut ausgestattete und qualifizierte Kliniken komplexe Behandlungen durchführen dürfen.

In den vergangenen Monaten haben Klinikvertreter, die Krankenkassen sowie das NRW-Gesundheitsministerium in Planungs- und Anhörungsrunden die neuen Leistungsgruppen samt Fallzahlen verhandelt. Die vorläufige Entscheidung des Landes liegt seit Mitte Juni vor. Bis Ende des Jahres sollen nun etwaige Einsprüche von Kliniken bearbeitet werden. Ab 2025 gelten dann die neuen Leistungsgruppen. Mögliche Klagen von Kliniken haben keine aufschiebende Wirkung.

Im Folgenden haben wir anhand von vier Beispielen maßgebliche Veränderungen der Kliniklandschaft in NRW auf Basis der vorläufigen Entscheidung des Landes herausgearbeitet. Vergleichbare Entwicklungen sind auch im Bund zu erwarten – sofern sich die streitenden Parteien einigen. 

### Allgemeine Innere Medizin

```{r}
#| label: map-allgemeine-innere-medizin
#| output: true 

Leistungsgruppe <- "Allgemeine Innere Medizin"

markers_data <-
  nrw_krankenhausplanung_anhoerung |>
  filter(Leistungsgruppe == "Allgemeine Innere Medizin") |> 
  # markers_data
  mutate(
    color = case_when(
      genehmigte_Fallzahl > beantragte_Fallzahl &
        genehmigte_Fallzahl > 0 ~ COLOR_BLUE,
      genehmigte_Fallzahl == beantragte_Fallzahl &
        genehmigte_Fallzahl > 0 ~ COLOR_GREEN,
      genehmigte_Fallzahl > 0 ~ COLOR_YELLOW,
      genehmigte_Fallzahl == 0 ~ COLOR_RED
    )
  ) |>
  mutate(
    # create label column as html string
    label = paste0(
      "<strong>",
      Name_Krankenhaus,
      "</strong>",
      "<br/>",
      "<p>beantragender Standort: ",
      beantragender_Standort_Name,
      "<br/>",
      "<p>beantragte Fallzahl: ",
      beantragte_Fallzahl,
      "<br/>",
      "genehmigte Fallzahl: ",
      genehmigte_Fallzahl,
      '<br/>  </span></p>'
    )
  ) |>
  rowwise() |> # transform rowwise to html tag
  mutate(label = HTML(label))

map <- create_base_map(markers_data, Leistungsgruppe = Leistungsgruppe)

map

####################
## save + caption ##
####################

filename <- "Karte_Allgemeine-Innere-Medizin"

data_map <- tibble(
  fileformat = c("csv", "topojson"),
  filename_suffix = c("Kliniken_Allgemeine-Innere_Medizin", "Bundeslaender")
)

images_map <- tibble(fileformat = c("html"),
                     filename_suffix = c(""))

captions = c(caption_MAGS)

htmlpfad <- file.path(imagepath, paste0(filename, ".html"))
datenpfad_clinics <- file.path(imagepath,
                               paste0(filename, "_Kliniken_Allgemeine-Innere_Medizin.csv"))
datenpfad_distance <- file.path(imagepath, paste0(filename, "_Bundeslaender.topojson"))

mapshot(map, url = htmlpfad)
write_clinics <- markers_data |>
  write_csv(datenpfad_clinics)
write_bundeslaender <- topojson_write(input = bundeslaender, file = datenpfad_distance)

image_helper_light(
  filename = filename,
  filepath = imagepath,
  data = data_map,
  images = images_map,
  captions = captions
)

```
Die Leistungsgruppe (LG) „Allgemeine Innere Medizin“ umfasst die grundlegendsten Bereiche der medizinischen Versorgung, von der Behandlung von Atemwegs- und Herz-Kreislauf-Erkrankungen bis hin zu gastrointestinalen Problemen und Stoffwechselstörungen.

Diese Grundversorgung soll idealerweise nicht großflächig begrenzt werden. Schließlich soll jedes Krankenhaus auch die häufigsten Leiden sicher und gut behandeln können. Mit Blick auf die künftige Kliniklandschaft NRW zeigt sich daher für die LG „Allgemeine Innere Medizin“ keine nennenswerte Veränderung zum Status quo. 295 von 306 beantragenden Kliniken (96 Prozent) haben eine Genehmigung für die Leistungsgruppe erhalten. Nur in einzelnen Fällen lehnte das Land den Antrag ab.

Warum einer Klinik eine Genehmigung verwehrt wird, kann mehrere Gründe haben. Letztlich beruht die Entscheidung aber maßgeblich auf der Erfüllung der Mindestkriterien beziehungsweise auf der Plausibilität des jeweiligen Antrags.

So hat zum Beispiel das Krankenhaus Mörsenbroich-Rath (Düsseldorf) 100 Fälle beantragt – allerdings für seinen Standort „Geriatrisches Krankenhaus Elbroich“. Dort sieht das Land keine Grundversorgung im Bereich der „Allgemeinen Inneren Medizin“, das Krankenhaus ist als Spezialklinik zu werten, daher gab es keine Genehmigung für die LG.

In anderen Gebieten wiederum müssen die Fallzahlen zur Sicherstellung der Versorgung der Bevölkerung erhöht werden, zum Beispiel an den Klinikstandorten „Evangelisches Krankenhaus Mettmann“ und „Fachklinik 360°“ (Ratingen). Hintergrund ist in diesem Fall die Schließung des St.-Marien-Krankenhaus Ratingen im Mai dieses Jahres, wodurch umliegende Kliniken mehr Fälle übernehmen müssen.



### Endoprothetik Hüfte

```{r}
#| label: map-endoprothetik-huefte
#| output: true 

Leistungsgruppe <- "Endoprothetik Hüfte"

markers_data <-
  example_endo_huefte |>
  # markers_data
  mutate(
    color = case_when(
      genehmigte_Fallzahl > beantragte_Fallzahl &
        genehmigte_Fallzahl > 0 ~ COLOR_BLUE,
      genehmigte_Fallzahl == beantragte_Fallzahl &
        genehmigte_Fallzahl > 0 ~ COLOR_GREEN,
      genehmigte_Fallzahl > 0 ~ COLOR_YELLOW,
      genehmigte_Fallzahl == 0 ~ COLOR_RED
    )
  ) |>
  mutate(
    # create label column as html string
    label = paste0(
      "<strong>",
      Name_Krankenhaus,
      "</strong>",
      "<br/>",
      "<p>beantragender Standort: ",
      beantragender_Standort_Name,
      "<br/>",
      "<p>beantragte Fallzahl: ",
      beantragte_Fallzahl,
      "<br/>",
      "genehmigte Fallzahl: ",
      genehmigte_Fallzahl,
      "<br/></p>",
      "<p>Fallzahl OPS-Codes (2021): ",
      "[",
      Fallzahl_OPS_min_2021,
      "..",
      Fallzahl_OPS_max_2021,
      "]",
      "<br/>",
      "Fallzahl Qualitätssicherung (2021): ",
      Fallzahl_QS_2021,
      "<br/>",
      "Fallzahl OPS-Codes (2022): ",
      "[",
      Fallzahl_OPS_min_2022,
      "..",
      Fallzahl_OPS_max_2022,
      "]",
      "<br/>",
      "Fallzahl Qualitätssicherung (2022): ",
      Fallzahl_QS_2022,
      '</p>'
    )
  ) |>
  rowwise() |> # transform rowwise to html tag
  mutate(label = HTML(label))

map <- create_base_map(markers_data, Leistungsgruppe = Leistungsgruppe)

map


####################
## save + caption ##
####################

filename <- "Karte_Endoprothetik-Huefte"

data_map <- tibble(
  fileformat = c("csv", "topojson"),
  filename_suffix = c("Kliniken_Endoprothetik-Huefte", "Bundeslaender")
)

images_map <- tibble(fileformat = c("html"),
                     filename_suffix = c(""))

captions = c(caption_MAGS, caption_GBA)

htmlpfad <- file.path(imagepath, paste0(filename, ".html"))
datenpfad_clinics <- file.path(imagepath,
                               paste0(filename, "_Kliniken_Endoprothetik-Huefte.csv"))
datenpfad_distance <- file.path(imagepath, paste0(filename, "_Bundeslaender.topojson"))

mapshot(map, url = htmlpfad)
write_clinics <- markers_data |>
  write_csv(datenpfad_clinics)
write_bundeslaender <- topojson_write(input = bundeslaender, file = datenpfad_distance)

image_helper_light(
  filename = filename,
  filepath = imagepath,
  data = data_map,
  images = images_map,
  captions = captions
)

```

Die Leistungsgruppe „Endoprothetik Hüfte“ umfasst den geplanten erstmaligen Einsatz künstlicher Hüftgelenke. Die Endoprothetik war in den vergangenen Jahren für viele Kliniken ein sehr lukratives Behandlungsfeld. Häuser mit eher geringen Fallzahlen waren zuletzt keine Seltenheit. Im Zuge der Reform wird nun deutlich, wie eine optimierte Versorgungsstruktur aussehen könnte.

Zahlreiche Kliniken erfüllen nach Einschätzung des Landes NRW künftig nicht die geforderten Mindestkriterien für die LG „Endoprothetik Hüfte“ oder ihre Anträge waren nicht plausibel. Von 235 Kliniken, die die LG besetzen möchten, erhielten nur 126 eine Genehmigung (54 Prozent). Die angestrebte Konzentrierung der Leistungen in bestimmten Kliniken zeigt sich hier, wie auch auf der Karte zu sehen, sehr deutlich.

Im Süden Düsseldorfs zum Beispiel wurden die Anträge von gleich vier Kliniken abgelehnt. Dort gingen die Sana Kliniken, die Uniklinik, das Evangelische Krankenhaus und das St.-Martinus-Krankenhaus bislang leer aus. Auch das nahe Rheinland-Klinikum mit seinem Standort „Lukaskrankenhaus Neuss“ erhielt keine Genehmigung. Im Norden Düsseldorfs dürfen derweil das St-Vinzenz-Krankenhaus und die Schön Klinik die LG „Endoprothetik Hüfte“ besetzen, wenngleich mit weniger Fällen als beantragt.

Einige Kliniken in NRW haben den Bedarf an Eingriffen bei der LG „Endoprothetik Hüfte“ nach den Einschätzungen des Landes überschätzt, was sich in der Karte durch viele „gelbe“ Kliniken zeigt. Um das Verhältnis von zuletzt tatsächlich erbachten und nun beantragten Fallzahlen zu ermitteln, haben wir zum Vergleich die jeweiligen OPS-Codes aus den Qualitätsberichten der Jahre 2021 und 2022 ausgelesen.

Die tatsächlichen Fallenzahlen können sich jedoch je nach Leistungsgruppe an unterschiedlichen Stellen in den Qualitätsberichten der Kliniken finden. Im Falle der LG „Endoprothetik Hüfte“ haben wir deshalb zum einen die entsprechenden Prozedurenschlüssel (OPS-Codes) als auch das sogenannte Auswertungsmodul „Hüftendoprothesenversorgung“ im Kapitel Qualitätssicherung im C-Teil der Qualitätsberichte ausgelesen. Um Unsicherheiten bei Datenschutzangaben abzubilden, werden die OPS-Fallzahlen als mögliche Bandbreite [minimale Fallzahl..maximale Fallzahl] angegeben. Beispiel: [80..100] würde bedeuten, dass die Klinik tatsächlich mindestens 80 und maximal 100 Fälle der jeweiligen Leistungsgruppe erbracht hat (siehe zur Erläuterung auch Datengrundlage unten).

```{r}
#| label: scatter-endoprothetik-huefte
#| output: true 

data_to_plot <- example_endo_huefte |>
  mutate(
    `max. Fallzahl OPS-Codes (2022)` = ifelse(
      is.na(Fallzahl_OPS_max_2022),-max(Fallzahl_OPS_max_2022, na.rm = TRUE) / 10,
      Fallzahl_OPS_max_2022
    ),
    `beantragte Fallzahl` = as.numeric(beantragte_Fallzahl),
  ) |>
  mutate(
    # create label column as html string
    label = paste0(
      "<b>",
      Name_Krankenhaus,
      "</b>",
      "\n",
      "beantragender Standort: ",
      beantragender_Standort_Name,
      "\n",
      "\n",
      "beantragte Fallzahl: ",
      beantragte_Fallzahl,
      "\n",
      "genehmigte Fallzahl: ",
      genehmigte_Fallzahl,
      "\n",
      "\n",
      "Fallzahl OPS-Codes (2021): ",
      "[",
      Fallzahl_OPS_min_2021,
      "..",
      Fallzahl_OPS_max_2021,
      "]",
      "\n",
      "Fallzahl Qualitätssicherung (2021): ",
      Fallzahl_QS_2021,
      "\n",
      "Fallzahl OPS-Codes (2022): ",
      "[",
      Fallzahl_OPS_min_2022,
      "..",
      "<b>",
      Fallzahl_OPS_max_2022,
      "</b>",      
      "]",
      "\n",
      "Fallzahl Qualitätssicherung (2022): ",
      Fallzahl_QS_2022
    )
  ) |>
  rowwise() # transform rowwise to html tag

filename <- "Vergleich_Fallzahlen_Antrag_vs_QB_Endoprothetik-Huefte"

tmp <-
  data_to_plot |>
  write_csv(
    file.path(imagepath, paste0(filename, ".csv"))
    ) |> 
  ggplot(
    aes(
      x = `max. Fallzahl OPS-Codes (2022)`,
      y = `beantragte Fallzahl`,
      color = Genehmigung,
      text = label
    )
  ) +
  geom_point() +
  geom_abline(intercept = 0,
              slope = 1,
              linetype = "dashed") +
  scale_color_manual(
    values = c(
      "mehr genehmigt" = COLOR_BLUE,
      "vollständig genehmigt" = COLOR_GREEN,
      "teilweise genehmigt" = COLOR_YELLOW,
      "nicht genehmigt" = COLOR_RED
    )
  ) +
  # add some text
  annotate(
    geom = "text",
    x = -max(data_to_plot["max. Fallzahl OPS-Codes (2022)"], na.rm = TRUE) /
      10,
    y = 800,
    label = "OPS-Codes\nnicht\nvorhanden",
    fontface = "italic",
    hjust = 0
  ) +
  labs(color = NULL) +
  scale_x_continuous(limits = c(-300, NA))


ggplotly_SMC(tmp, tooltip = c("text")) |>
  plotly::layout(legend = list(y = -0.5))


####################
## save + caption ##
####################

tmp |>
  image_helper(filename, imagepath, plotly = TRUE, caption = caption_MAGS_GBA)
```


Den Vergleich tatsächliche vs. beantragte Fallzahl haben wir für drei unserer Beispiele auch in einem Plot-Diagramm dargestellt. Auf der x-Achse werden die OPS-Fallzahlen 2022 und auf der y-Achse die nun beantragte Fallzahl dargestellt. Jeder farbige Punkt entspricht einer Klinik. Die Bedeutung der Farben ist unverändert. Bei jeder Klinik ist zudem die vom Land genehmigte Fallzahl angegeben.

Um das Plot-Diagramm anschaulicher zu gestalten, haben wir die OPS-Fallzahlen aus 2021 und 2022 zwar ebenfalls als Bandbreite dargestellt, die Klinik ist aber in dem Diagramm mit ihrem Maximalwert aus dem Jahr 2022 verortet.

Je weiter eine Klinik von der sogenannten Identitätslinie (x = y) entfernt ist, desto größer ist die Diskrepanz zwischen tatsächlicher und beantragter Fallzahl – gemessen an den OPS-Fallzahlen von 2022. Für einen Plausibilitätscheck eignen sich dann noch die Fallzahlen aus der Qualitätssicherung.



### Tiefe Rektumeingriffe

```{r}
#| label: map-tiefe-rektumeingriffe
#| output: true 

Leistungsgruppe <- "Tiefe Rektumeingriffe"

markers_data <-
  example_tiefe_rektum |>
  # markers_data
  mutate(
    color = case_when(
      genehmigte_Fallzahl > beantragte_Fallzahl &
        genehmigte_Fallzahl > 0 ~ COLOR_BLUE,
      genehmigte_Fallzahl == beantragte_Fallzahl &
        genehmigte_Fallzahl > 0 ~ COLOR_GREEN,
      genehmigte_Fallzahl > 0 ~ COLOR_YELLOW,
      genehmigte_Fallzahl == 0 ~ COLOR_RED
    )
  ) |>
  mutate(
    # create label column as html string
    label = paste0(
      "<strong>",
      Name_Krankenhaus,
      "</strong>",
      "<br/>",
      "<p>beantragender Standort: ",
      beantragender_Standort_Name,
      "<br/>",
      "<p>beantragte Fallzahl: ",
      beantragte_Fallzahl,
      "<br/>",
      "genehmigte Fallzahl: ",
      genehmigte_Fallzahl,
      "<br/></p>",
      "<p>Fallzahl OPS-Codes (2021): ",
      "[",
      Fallzahl_OPS_min_2021,
      "..",
      Fallzahl_OPS_max_2021,
      "]",
      "<br/>",
      "Fallzahl OPS-Codes (2022): ",
      "[",
      Fallzahl_OPS_min_2022,
      "..",
      Fallzahl_OPS_max_2022,
      "]",
      '</p>'
    )
  ) |>
  rowwise() |> # transform rowwise to html tag
  mutate(label = HTML(label))

map <- create_base_map(markers_data, Leistungsgruppe = Leistungsgruppe)

map


####################
## save + caption ##
####################

filename <- "Karte_Tiefe-Rektumeingriffe"

data_map <- tibble(
  fileformat = c("csv", "topojson"),
  filename_suffix = c("Kliniken_Tiefe-Rektumeingriffe", "Bundeslaender")
)

images_map <- tibble(fileformat = c("html"),
                     filename_suffix = c(""))

captions = c(caption_MAGS, caption_GBA)

htmlpfad <- file.path(imagepath, paste0(filename, ".html"))
datenpfad_clinics <- file.path(imagepath,
                               paste0(filename, "_Kliniken_Tiefe-Rektumeingriffe.csv"))
datenpfad_distance <- file.path(imagepath, paste0(filename, "_Bundeslaender.topojson"))

mapshot(map, url = htmlpfad)
write_clinics <- markers_data |>
  write_csv(datenpfad_clinics)
write_bundeslaender <- topojson_write(input = bundeslaender, file = datenpfad_distance)

image_helper_light(
  filename = filename,
  filepath = imagepath,
  data = data_map,
  images = images_map,
  captions = captions
)

```

Ein besonders hohes Maß an Expertise erfordern Eingriffe am tiefen Rektum, also am Enddarm. Es handelt sich hierbei oftmals um schwere Krebserkrankungen. Bei der neuen LG „Tiefe Rektumeingriffe“ strebt das Land NRW eine deutlich stärkere Konzentrierung an, was im Dashboard durch viele „rote“ Kliniken ersichtlich wird und auch aus den Schreiben an die Kliniken hervorgeht.

Von 178 Kliniken, die die LG besetzen möchten, erhielten nur 80 den Zuschlag (45 Prozent). 

Dabei wird deutlich, dass bei dieser LG die Kliniken den Bedarf an derlei Operationen nach Ansicht des Landes oft falsch einschätzen. Im Regierungsbezirk Düsseldorf liege auf der Planungsebene insgesamt eine Überzeichnung durch die beantragenden Krankenhäuser vor, sodass zur Sicherstellung der Versorgung nur der Teil des prognostizierten Bedarfes berücksichtigt werden könne, heißt es zum Beispiel in der Anhörung der Bezirksregierung Düsseldorf. Dort wurden nur die leistungsstärksten Kliniken berücksichtigt, die derlei Eingriffe im Durchschnitt mindestens alle zwei Wochen oder öfter durchführen. Die Überzeichnung wird ebenfalls anhand unserer Analyse der OPS-Codes deutlich.

```{r}
#| label: scatter-tiefe-rektumeingriffe
#| output: true 

data_to_plot <- example_tiefe_rektum |>
  mutate(
    `max. Fallzahl OPS-Codes (2022)` = ifelse(
      is.na(Fallzahl_OPS_max_2022),
      -max(Fallzahl_OPS_max_2022, na.rm = TRUE) / 10,
      Fallzahl_OPS_max_2022
    ),
    `beantragte Fallzahl` = as.numeric(beantragte_Fallzahl),
  ) |>
  mutate(
    # create label column as html string
    label = paste0(
      "<b>",
      Name_Krankenhaus,
      "</b>",
      "\n",
      "beantragender Standort: ",
      beantragender_Standort_Name,
      "\n",
      "\n",
      "beantragte Fallzahl: ",
      beantragte_Fallzahl,
      "\n",
      "genehmigte Fallzahl: ",
      genehmigte_Fallzahl,
      "\n",
      "\n",
      "Fallzahl OPS-Codes (2021): ",
      "[",
      Fallzahl_OPS_min_2021,
      "..",
      Fallzahl_OPS_max_2021,
      "]",
      "\n",
      "Fallzahl OPS-Codes (2022): ",
      "[",
      Fallzahl_OPS_min_2022,
      "..",
      "<b>",
      Fallzahl_OPS_max_2022,
      "</b>",
      "]"
    )
  ) |>
  rowwise() # transform rowwise to html tag

filename <- "Vergleich_Fallzahlen_Antrag_vs_QB_Tiefe-Rektumeingriffe"

tmp <-
  data_to_plot |>
  write_csv(
    file.path(imagepath, paste0(filename, ".csv"))
    ) |> 
  ggplot(
    aes(
      x = `max. Fallzahl OPS-Codes (2022)`,
      y = `beantragte Fallzahl`,
      color = Genehmigung,
      text = label
    )
  ) +
  geom_point() +
  geom_abline(intercept = 0,
              slope = 1,
              linetype = "dashed") +
  scale_color_manual(
    values = c(
      "mehr genehmigt" = COLOR_BLUE,
      "vollständig genehmigt" = COLOR_GREEN,
      "teilweise genehmigt" = COLOR_YELLOW,
      "nicht genehmigt" = COLOR_RED
    )
  ) +
  # add some text
  annotate(
    geom = "text",
    x = -max(data_to_plot["max. Fallzahl OPS-Codes (2022)"], na.rm = TRUE) /
      10,
    y = 70,
    label = "OPS-Codes\nnicht\nvorhanden",
    fontface = "italic",
    hjust = 0
  ) +
  labs(color = NULL) +
  scale_x_continuous(limits = c(-15.4, NA))


ggplotly_SMC(tmp, tooltip = c("text")) |>
  plotly::layout(legend = list(y = -0.5))

####################
## save + caption ##
####################

tmp |>
  image_helper(filename, imagepath, plotly = TRUE, caption = caption_MAGS_GBA)
```


Im Plot-Diagramm ist die angestrebte stärkere Konzentrierung ebenfalls auffallend. Viele Kliniken mit zuletzt niedrigen OPS-Fallzahlen sollen die Leistungsgruppe künftig nicht besetzen dürfen. Erst ab ca. 20 OPS-Fällen scheint die Genehmigung zu greifen. Die schärfere Konzentrierung durch eine Mindestfallzahl erscheint vor allem deshalb logisch, weil für die tiefen Rektumeingriffe derzeit auch eine bundesweite Mindestmenge diskutiert wird, die der Gemeinsame Bundesausschuss erlassen würde.

Für das Jahr 2024 sind nach der Bedarfsprognose NRW-weit 3753 Fälle zu erwarten. Verglichen mit anderen Leistungsgruppen sind die Fallzahlen der LG „Tiefe Rektumeingriffe“ eher klein.



### Stroke Unit

```{r}
#| label: map-stroke-unit
#| output: true 

Leistungsgruppe <- "Stroke Unit"

markers_data <-
  example_stroke_unit |>
  # markers_data
  mutate(
    color = case_when(
      genehmigte_Fallzahl > beantragte_Fallzahl &
        genehmigte_Fallzahl > 0 ~ COLOR_BLUE,
      genehmigte_Fallzahl == beantragte_Fallzahl &
        genehmigte_Fallzahl > 0 ~ COLOR_GREEN,
      genehmigte_Fallzahl > 0 ~ COLOR_YELLOW,
      genehmigte_Fallzahl == 0 ~ COLOR_RED
    )
  ) |>
  mutate(
    # create label column as html string
    label = paste0(
      "<strong>",
      Name_Krankenhaus,
      "</strong>",
      "<br/>",
      "<p>beantragender Standort: ",
      beantragender_Standort_Name,
      "<br/>",
      "<p>beantragte Fallzahl: ",
      beantragte_Fallzahl,
      "<br/>",
      "genehmigte Fallzahl: ",
      genehmigte_Fallzahl,
      "<br/></p>",
      "<p>Fallzahl OPS-Codes (2021): ",
      "[",
      Fallzahl_OPS_min_2021,
      "..",
      Fallzahl_OPS_max_2021,
      "]",
      "<br/>",
      "Fallzahl OPS-Codes (2022): ",
      "[",
      Fallzahl_OPS_min_2022,
      "..",
      Fallzahl_OPS_max_2022,
      "]",
      '</p>'
    )
  ) |>
  rowwise() |> # transform rowwise to html tag
  mutate(label = HTML(label))

map <- create_base_map(markers_data, Leistungsgruppe = Leistungsgruppe)

map



####################
## save + caption ##
####################

filename <- "Karte_Stroke-Unit"

data_map <- tibble(
  fileformat = c("csv", "topojson"),
  filename_suffix = c("Kliniken_Stroke-Unit", "Bundeslaender")
)

images_map <- tibble(fileformat = c("html"),
                     filename_suffix = c(""))

captions = c(caption_MAGS, caption_GBA)

htmlpfad <- file.path(imagepath, paste0(filename, ".html"))
datenpfad_clinics <- file.path(imagepath, paste0(filename, "_Kliniken_Stroke-Unit.csv"))
datenpfad_distance <- file.path(imagepath, paste0(filename, "_Bundeslaender.topojson"))

mapshot(map, url = htmlpfad)
write_clinics <- markers_data |>
  write_csv(datenpfad_clinics)
write_bundeslaender <- topojson_write(input = bundeslaender, file = datenpfad_distance)

image_helper_light(
  filename = filename,
  filepath = imagepath,
  data = data_map,
  images = images_map,
  captions = captions
)

```

Die LG „Stroke Unit“ betrifft die Versorgung des akuten Schlaganfalls. Es handelt sich hierbei also um einen Notfall. Die Fahrtzeiten zum nächsten Krankenhaus spielen eine größere Rolle als bei planbaren Eingriffen. 

Drastische Einschnitte bei der Versorgungsstruktur sind bei dieser LG daher nicht zu erwarten. Dennoch lohnt sich ein Blick in manche Regionen. Im Hochsauerlandkreis zum Beispiel haben zwei beantragende Kliniken durch die Bezirksregierung keine Genehmigung für die LG „Stroke Unit“ erhalten: das St.-Vinzenz-Krankenhaus und die DGD Stadtklinik Hemer. Der Bezirksregierung zufolge erfüllten die beiden Kliniken entweder die Mindestkriterien nicht oder hatten keine Erfahrung in der speziellen Versorgung von Schlaganfallpatienten. Der bisherige Anbieter, das Karolinen-Hospital Hüsten (844 Fälle), wird für die Versorgung als ausreichend erachtet.

Südlich von Hüsten dürfen das Klinikum Lüdenscheid, das Kreisklinikum Siegen und die VAMED Klinik Bad Berleburg Schlaganfälle behandeln. Das St.-Franziskus-Hospital Winterberg, das Fachkrankenhaus Kloster Grafschaft sowie das Jung-Stilling-Krankenhaus gehen leer aus. Inwieweit sich die Fahrtzeiten in dieser Region unnötig verlängern könnten, ist zu prüfen.

Im Norden Nordrhein-Westfalens hat das St.-Antonius-Hospital Gronau die LG „Stroke Unit“ mit 150 Fällen beantragt. Es gab keine Genehmigung. Die Region erscheint damit auf den ersten Blick leicht unterversorgt, da die nächsten genehmigten Schlaganfall-Kliniken in NRW in Ibbenbüren, Münster, Dülmen und in Borken liegen. Zu berücksichtigen ist hier aber die Nähe zu Niedersachsen oder auch zu Enschede in den Niederlanden. Die Behandlung akuter Schlaganfälle könnte rund um Gronau also auch über Landesgrenzen hinweg erfolgen.

```{r}
#| label: scatter-stroke-unit
#| output: true 

data_to_plot <- example_stroke_unit |>
  mutate(
    `max. Fallzahl OPS-Codes (2022)` = ifelse(
      is.na(Fallzahl_OPS_max_2022),-max(Fallzahl_OPS_max_2022, na.rm = TRUE) / 10,
      Fallzahl_OPS_max_2022
    ),
    `beantragte Fallzahl` = as.numeric(beantragte_Fallzahl),
  ) |>
  mutate(
    # create label column as html string
    label = paste0(
      "<b>",
      Name_Krankenhaus,
      "</b>",
      "\n",
      "beantragender Standort: ",
      beantragender_Standort_Name,
      "\n",
      "\n",
      "beantragte Fallzahl: ",
      beantragte_Fallzahl,
      "\n",
      "genehmigte Fallzahl: ",
      genehmigte_Fallzahl,
      "\n",
      "\n",
      "Fallzahl OPS-Codes (2021): ",
      "[",
      Fallzahl_OPS_min_2021,
      "..",
      Fallzahl_OPS_max_2021,
      "]",
      "\n",
      "Fallzahl OPS-Codes (2022): ",
      "[",
      Fallzahl_OPS_min_2022,
      "..",
      "<b>",
      Fallzahl_OPS_max_2022,
      "</b>",
      "]"
    )
  ) |>
  rowwise() # transform rowwise to html tag

filename <- "Vergleich_Fallzahlen_Antrag_vs_QB_Stroke-Unit"

tmp <-
  data_to_plot |>
  write_csv(
    file.path(imagepath, paste0(filename, ".csv"))
    ) |> 
  ggplot(
    aes(
      x = `max. Fallzahl OPS-Codes (2022)`,
      y = `beantragte Fallzahl`,
      color = Genehmigung,
      text = label
    )
  ) +
  geom_point() +
  geom_abline(intercept = 0,
              slope = 1,
              linetype = "dashed") +
  scale_color_manual(
    values = c(
      "mehr genehmigt" = COLOR_BLUE,
      "vollständig genehmigt" = COLOR_GREEN,
      "teilweise genehmigt" = COLOR_YELLOW,
      "nicht genehmigt" = COLOR_RED
    )
  ) +
  # add some text
  annotate(
    geom = "text",
    x = -max(data_to_plot["max. Fallzahl OPS-Codes (2022)"], na.rm = TRUE) /
      10,
    y = 1300,
    label = "OPS-Codes\nnicht\nvorhanden",
    fontface = "italic",
    hjust = 0
  ) +
  labs(color = NULL)  +
  scale_x_continuous(limits = c(-300, NA))


ggplotly_SMC(tmp, tooltip = c("text")) |>
  plotly::layout(legend = list(y = -0.5))

####################
## save + caption ##
####################

tmp |>
  image_helper(filename, imagepath, plotly = TRUE, caption = caption_MAGS_GBA)

```


Wie auch bei den tiefen Rektrumeingriffen sehen einige Bezirksregierungen in NRW bei der LG „Stroke Unit“ eine Bedarfsüberzeichnung der beantragenden Kliniken. Die OPS-Fallzahlen bestätigen die Annahme mit Blick auf die Bedarfsplanung in NRW. Die Plot-Diagramme zeigen die Überzeichnung recht deutlich. Viele Kliniken befinden sich oberhalb der Identitätslinie, das heißt, die Diskrepanz zwischen tatsächlichen und beantragten Fällen ist bei dieser Leistungsgruppe recht häufig.


### Datengrundlage und Code

Den Code für diesen Data Report stellen wir [hier]( `r file.path(imagepath, paste0(today(), "_", file_name_code))` ){target="_blank"} zur Verfügung. Neben Standard R-Paketen wird ein eigenes Paket verwendet, das [hier](https://github.com/sciencemediacenter/SMChelpR){target="_blank"} bereitgestellt wird.

Der Report basiert auf den Ergebnissen der Anhörungsverfahren zwischen Kliniken, dem Ministerium für Arbeit, Gesundheit und Soziales sowie den Krankenkassen in NRW. Konkret wurden die Anhörungsschreiben (PDF) für die Leistungsgruppen auf allen Planungsebenen ausgelesen und visualisiert.

<b>Limitationen</b>: Für den Report wurden für drei Beispiele für die Jahre 2021 und 2022 die entsprechenden OPS-Codes der jeweiligen Leistungsgruppe aus den Qualitätsberichten der Kliniken ausgelesen. Endoprothetik Hüfte: 5-820; Tiefe Rektumeingriffe: 5-484.2, 5-484.5, 5-484.6, 5-485; Stroke Unit: 8-981, 8-98b. Die Angaben der Kliniken sind jedoch mitunter unzureichend oder fehlerhaft. Manche Fallzahlen werden aufgrund des Datenschutzes nicht dargestellt:

In den Qualitätsberichten der Krankenhäuser werden die Fallzahlen von Prozeduren (kodiert durch OPS-Codes) pro Organisationseinheit (Station, Fachabteilung o. ä.) angegeben. Wenn die Anzahl der Fälle, die mit einem bestimmten OPS-Code oder einer bestimmten Diagnose verknüpft sind, sehr gering ist (definiert als mindestens ein Fall und weniger als vier Fälle), wird der betreffende Code nicht direkt angegeben. Dies soll verhindern, dass durch Rückschlüsse auf diese wenigen Fälle eine Identifikation der betroffenen Personen möglich ist. Die in unseren Karten angegebenen OPS-Fallzahlen sind daher Summen über alle Organisationseinheiten aus dem jeweiligen Klinikstandort (definiert über die Standortnummer). Um die Unsicherheit durch die Datenschutzangabe abzubilden, wird die OPS-Fallzahl als mögliche Bandbreite [minimale Fallzahl..maximale Fallzahl] angegeben. "NA..NA" bedeutet, dass der jeweilige OPS-Code nicht im Qualitätsbericht auftaucht. Die Gründe dafür sind verschieden: Datenschutz, Aggregation von Daten oder sogar Dokumentationsfehler. Wenn 2021 und 2022 keine Daten ausgelesen werden konnten, ist es naheliegend, dass die jeweilige Klinik zuvor noch keine Fälle erbracht hat. Andere Gründe sind aber nicht ausgeschlossen.

Die OPS-Codes sind nicht für jede Leistungsgruppe eindeutig auslesbar. In unserem Dashboard haben wir deshalb auf die Angabe der OPS-Fallzahlen verzichtet.

Im Fall der LG „Endoprothetik Hüfte“ haben wir neben den OPS-Codes auch das sogenannte Auswertungsmodul „Hüftendoprothesenversorgung“ im Kapitel Qualitätssicherung im C-Teil der Qualitätsberichte ausgelesen. Daraus ergab sich für einige Kliniken ein klareres Bild zu den tatsächlichen Fallzahlen.

### Ihre Ansprechpersonen in Redaktion und SMC Lab

Wenn Sie Fragen zu diesen Daten haben oder weitere Auswertungen erhalten wollen, kann das SMC Lab auf Wunsch Auswertungen erzeugen.


*Redaktion*\
Philipp Jacobs, Redakteur für Medizin und Lebenswissenschaften\
[redaktion\@sciencemediacenter.de](mailto:redaktion@sciencemediacenter.de){.email}

*Datenauswertung*\
Simon Essink\
Lars Koppers\
[lab\@sciencemediacenter.de](mailto:lab@sciencemediacenter.de){.email}


Telefon: +49 221 8888 25-0\
E-Mail Inhalt: [redaktion\@sciencemediacenter.de](mailto:redaktion@sciencemediacenter.de){.email}\
E-Mail Datenauswertung: [lab\@sciencemediacenter.de](mailto:lab@sciencemediacenter.de){.email}
:::

```{r}
#| label: Code speichern
#| output: false
# dir.create(file.path(imagepath, "libs"), showWarnings = FALSE, recursive = TRUE)
file_name_code_without_ext <- tools::file_path_sans_ext(file_name_code)
file.copy(
  from = file.path(paste0(file_name_code_without_ext, "_files"), "libs"), 
  to = file.path(imagepath), 
  recursive = TRUE,
  overwrite = TRUE)
```

