1. März 2021 | AGENS-Methodenworkshop 2021

Über mich

  • Statistiker bei der Kassenärztlichen Vereinigung Bayerns
    • Versorgungsanalysen und -forschung mit Routinedaten
  • Externe Dissertation unter Verwendung der KVB-Routinedaten
    • Betreuer:
      Prof. Paul Enck (Universitätsklinikum Tübingen)
      Prof. Antonius Schneider (TU München)
    • Funktionelle Erkrankungen in der ambulanten Versorgung
  • Autor des R-Packages ICD10gm

Motivation

How it started: Musterdaten

How it's going: Paper 1: Gut Paper 2: Scientific Reports

Die ICD-10 Klassifikation

Im Kern des Packages stehen vier Tabellen mit ICD-10-Metadaten für die Jahre 2004–2021:

  • icd_meta_codes: Endstellige Schlüsselnummer mit Labels und erweiterten Metadaten (z. B. ist der Code meldepflichtig oder endstellig?)
  • icd_meta_blocks: Definition der aus mehreren angrenzenden Codes gebildeten ICD-Blöcke
  • icd_meta_chapters: Labels für die 22 ICD-10-Kapitel
  • icd_meta_transition: Überleitungen von einer ICD-10-GM-Version ins nächste Version

Quelle: Bundesinstitut für Arzneimittel und Medizinprodukte. Die Bereitstellung der Daten in dieser Form ist erlaubt!

Stuktur der ICD-10-Klassifikation

Hierarchische Struktur mit 3–5 Stellen:

  1. Eine Buchstabe kodiert das Kapitel (Ätiologie)
    - F: Psychische und Verhaltensstörungen
    • G: Krankheiten des Nervensystems
  2. Zwei numerische Stellen bilden die "dreistellige" Diagnose
    • E11: Typ-2-Diabetes
    • Z00: Gesundheitsuntersuchung ohne Diagnose
  3. Zwei weitere numerische Stellen ermöglichen eine spezifische Kodierung
  • E11.31: Typ-2-Diabetes mit Augenkomplikationen, entgleist

Zwei Strategien für die Datenabfrage

1. Codes unmittelbar im Skript aufnehmen

select * from diagnosen
where icd = 'E11' and icd_sicher_id = 'G'

2. Trennung von Auswertungslogik und Programmcode

  • Externe Code-Liste (z.B. csv/Excel)
  • Programmcode referenziert diese Liste
  • Vorteil: Übersichtlich, transparent, weniger fehleranfällig
select * from diagnosen
inner join meta_icd using (JAHR, ICD_SUB, ICD_SICHER_ID)

Spezifikation einer Code-Liste

Ziel ist eine kompakte Spezifikation der relevanten Codes und Labels:

  1. Spezifikation wird immer "nach Rechts" erweitert
    • Ausnutzung der hierarchischen Struktur
  2. Weitere Attribute können in der Spezifikation aufgenommen werden
    • Gruppierungsmerkmal für die Zusammenführung von Diagnosen (z. B. Charlson-Diagnosen, Condition Categories)
    • Zusatzkennzeichen für die Diagnosesicherheit im ambulanten Bereich
    • Labels zur Verwendung in Abbildungen usw.

Beispiel: Charlson Comorbidities

1. Spezifikation der Codes

Charlson-Komorbiditäten in der Version der Royal College of Surgeons:

charlson <- readr::read_csv2("charlson_rcs.dat")

filter(charlson, Disease_Category == "Cerebrovascular disease")
## # A tibble: 3 x 2
##   Disease_Category        ICD_SPEC
##   <chr>                   <chr>   
## 1 Cerebrovascular disease G45     
## 2 Cerebrovascular disease G46     
## 3 Cerebrovascular disease I6

Beispiel: Charlson Comorbidities

2. Ermittlung aller zugehörigen Codes (icd_expand)

spec_charlson <- ICD10gm::icd_expand(charlson, year = 2020,
  col_meta = "Disease_Category", col_icd = "ICD_SPEC")

subset(spec_charlson,
       Disease_Category == "Cerebrovascular disease")[1:5, c(1:3,6:7)]
## # A tibble: 5 x 5
##   icd_spec Disease_Category         year icd_normcode icd_sub
##   <chr>    <chr>                   <int> <chr>        <chr>  
## 1 G45      Cerebrovascular disease  2020 G45          G45    
## 2 G45      Cerebrovascular disease  2020 G45.0        G450   
## 3 G45      Cerebrovascular disease  2020 G45.02       G4502  
## 4 G45      Cerebrovascular disease  2020 G45.03       G4503  
## 5 G45      Cerebrovascular disease  2020 G45.09       G4509

Erkennung von ungültigen Codes

Die Funktion icd_expand prüft, ob die angegebenen Codes gültig sind:

ICD10gm::is_icd_code(c("A09.9", "A099", "A09.9-"))
## [1] TRUE TRUE TRUE
ICD10gm::is_icd_code(c("AA9", "W12", "K58.3"), year = 2018)
## [1] FALSE FALSE FALSE
ICD10gm::is_icd_code("K58.3", year = 2019)
## [1] TRUE

Problem: Instabilität der ICD-10-GM

Die ICD-10-GM wird jährlich angepasst:

  1. Aktualisierung der 4. und 5. Stelle entsprechend dem Stand der Medizin
    Beispiel: Reizdarmsyndrom 2019

  2. Neue Codes ermöglichen eine genauere Kodierung (Beispiel: Covid-19)

  3. Diagnose wechselt in ein anderes Kapitel
    Beispiel: nicht näher bezeichnete Gastroenteritis (K52.9 -> A09.9)

Folge: Eine ICD-10-Spezifikation kann nicht ohne Weiteres auf ein anderes Jahr übertragen werden!

Beispiel: Charlson Comorbidities

3. Such nach problematischen Codes (icd_showchanges)

Die Funktion icd_showchanges prüft, ob das Ergebnis von icd_expand "instabilen" Codes beinhaltet:

ICD10gm::icd_showchanges(spec_charlson) %>% 
  filter(change_3 & year_from > 2004) %>% 
  head(3)
##   year_from year_to icd_from icd_to automatic_forward automatic_backward
## 1      2005    2006   G45.01  I63.9                 A                   
## 2      2005    2006   G45.11  I63.9                 A                   
## 3      2005    2006   G45.21  I63.9                 A                   
##   change_5 change_4 change_3 change icd3 icd_kapitel
## 1    FALSE    FALSE     TRUE   TRUE  I63           I
## 2    FALSE    FALSE     TRUE   TRUE  I63           I
## 3    FALSE    FALSE     TRUE   TRUE  I63           I

Beispiel: Charlson Comorbidities

4. Historisierung (icd_history)

spec_charlson <- spec_charlson %>% 
  ICD10gm::icd_history(years = 2004:2020)

filter(spec_charlson, Disease_Category == "Cerebrovascular disease") %>%
  head()
## # A tibble: 6 x 8
##   icd_spec Disease_Category   year icd3  icd_code icd_normcode icd_sub label    
##   <chr>    <chr>             <int> <chr> <chr>    <chr>        <chr>   <chr>    
## 1 G45      Cerebrovascular …  2018 G45   G45.09   G45.09       G4509   Arteria-…
## 2 G45      Cerebrovascular …  2017 G45   G45.19   G45.19       G4519   Arteria-…
## 3 G45      Cerebrovascular …  2018 G45   G45.19   G45.19       G4519   Arteria-…
## 4 G45      Cerebrovascular …  2019 G45   G45.39   G45.39       G4539   Amaurosi…
## 5 G45      Cerebrovascular …  2017 G45   G45.22   G45.22       G4522   Multiple…
## 6 G45      Cerebrovascular …  2018 G45   G45.13   G45.13       G4513   Arteria-…

Beispiel: Ein "Real-World" Skript

# Metadaten aufbereiten
icd_spec <- readr::read_csv("data/metadata/meta_icd.csv") %>%
  ICD10gm::icd_expand(year = 2020, col_meta = "DIAG_LABEL") %>%
  ICD10gm::icd_history(years = 2004:2020)

# Metadaten in die Datenbank schreiben
db <- dbConnect(...)
kvb::write_to_oracle(db, icd_spec, "META_ICD")

# DB-Abzug (etwas vereinfacht)
tbl(db, "FAKT_DIAGNOSEN") %>%
  inner_join(tbl(db, "DIM_ICD"), by = c("ABRQ", "ICD_KEY")) %>%
  inner_join(tbl(db, "META_ICD"), by = "ICD_SUB") %>%
  select(PID, DIAG_GROUP, ABRQ) %>%
  distinct()

Fazit und Ausblick

  • ICD10gm
    • Das ICD10gm-Package unterstützt die Auswertung der Routinedaten des deutschen Gesundheitswesens
      • Stellt die gesamten Metadaten ICD-10-GM für die Versorgungsforschung bereit
      • Löst ein zentrales Problem: Die Historisierung von ICD-10-GM-Codes
  • Ausblick:
    • Übertragbarkeit der Ideen auf anderen Kodiersysteme (EBM, OPS)?
    • Besonders interessant erscheinen die neuen generischen R-Packages encoder und decoder.