Medicin (ATC)

Udtræk lægemiddeleksponering fra LMDB - filtreret til din kohorte

Published

July 2, 2026

Warning

Under udvikling. Strukturel skitse - udbygges. Mønstret er det samme som i Udtræk fra LPR: åbn registret, filtrér til kohorten, behold dine koder, reducér til én række per person.

Receptordineret medicin ligger i LMDB (Lægemiddelstatistikregistret). Registret har én række per ekspederet recept, så samme person kan have hundredvis af rækker. De to kolonner du næsten altid bruger, er:

Den fulde, bekræftede kolonneliste står i Register-overblik.

Note

LMDB dækker kun apoteksudleverede recepter. Tre ting mangler derfor systematisk: medicin givet under indlæggelse, medicin udleveret direkte fra hospitalet (fx kemoterapi og immundæmpende midler) og medicin til visse institutionaliserede personer (Pottegård et al. 2017). Skal du bruge hospitalsadministreret medicin, findes et nyere Sygehusmedicinregister (data fra 2018), men det er endnu uvalideret, ufuldstændigt og tilgås via Sundhedsdatastyrelsen, ikke DST - brug det med forbehold (Rosenkrantz et al. 2024).

Eksponering, udfald eller kovariat? Samme udtræk

Medicin kan være alle tre ting. Det løses præcis som for diagnoser (Udtræk fra LPR): du laver ét udtræk af dispenseringerne, og rollen afgøres af, hvornår eksd falder i forhold til index_date - ikke af en særskilt side per rolle:

Rolle Hvornår Hvad du gør Side
Eksponering Den dato eksponeringen starter Første eksd = personens index-dato Fase 10
Kovariat (medicin ved baseline) eksd < index_date (fx 6-12 mdr. før) Ever/never eller antal i et vindue før index Komorbiditet
Udfald (ny behandling) eksd > index_date Første eksd efter index Udfald
Tidsvarierende (i/ude af behandling) Ændrer sig undervejs Start/stop-format Tidsvarierende

Du skriver altså ikke tre forskellige medicin-udtræk. Du laver ét, og datofilteret relativt til index bestemmer rollen.

Mønstret

ATC-koder har intet D-præfiks (modsat ICD i LPR, se Forstå LPR), så du matcher direkte på begyndelsen af koden:

library(arrow); library(dplyr)

kohort_pnrs <- unique(readRDS("sti/til/full_cohort.rds")$pnr)   # din kohorte fra Fase 10

medicin <- open_dataset("sti/til/lmdb/") %>%
  rename_with(tolower) %>%
  semi_join(tibble(pnr = kohort_pnrs), by = "pnr") %>%   # KUN din kohorte
  filter(substr(atc, 1, 5) == "A10BJ") %>%               # GLP-1-analoger - filtrér FØR collect
  select(pnr, atc, eksd, vnr) %>%
  collect() %>%                                          # FØRST her hentes data i RAM
  group_by(pnr) %>% arrange(eksd) %>% slice(1) %>% ungroup()   # første dispensering per person

saveRDS(medicin, "sti/til/extract_medicin.rds")

substr(atc, 1, 5) == "A10BJ" matcher hele ATC-niveauet (alle GLP-1-analoger). Vil du have flere grupper på én gang, så brug regex som i LPR: grepl("^A10BJ|^A10BA", atc). Mønstret for kode-matching (regex, %in% med en kodeliste, !!) er forklaret i Udtræk fra LPR og Guide til funktioner. Reduktionen til én række per person er forklaret i Langt ↔︎ bredt format - her slice(1) for første dispensering, men det kan også være ever/never eller et antal i et vindue (se rolletabellen ovenfor).

ATC er ikke nok: samme stof, forskelligt produkt

ATC klassificerer efter aktivt stof, ikke efter produkt eller indikation. To brands med samme stof får derfor samme ATC - og kan ikke skelnes på atc alene:

  • Ozempic (semaglutid, type 2-diabetes) og Wegovy (semaglutid, vægttab) har begge ATC A10BJ06. Filtrerer du kun på ATC, blander du diabetesbehandling og vægttabsbehandling sammen.

To kolonner skelner dem:

  • vnr (varenummer): den unikke nøgle til det faktiske præparat (pakning). Det er den eneste sikre måde at isolere ét bestemt produkt på. vnr-til-produkt-opslaget kommer fra lægemiddeltaksonomien (KAT / Sundhedsdatastyrelsen); name/packtext indeholder produktteksten, hvis du vil genkende det med det blotte øje.
  • indo (indikationskode): en kodet indikation (fra Medicinpriser-kataloget, LMS 25), ikke fritekst. Koden registreres kun, når ordinatoren vælger en indikation fra rullemenuen i den elektroniske recept. Skriver lægen i stedet indikationen som fritekst, overføres den ikke til registret, og indo står tom. Den kan derfor i princippet adskille samme stof på forskellige indikationer, men er ofte tom. Brug vnr som primær produktnøgle og indo som et støttesignal, ikke et rent filter.
# 1. Lav din egen liste over de varenumre, der hører til produktet
#    (slå dem op i lægemiddeltaksonomien - ét produkt har flere varenumre):
ozempic_vnr <- c("xxxxxx", "yyyyyy")   # pladsholdere - erstat med dine opslåede numre

# 2. Behold kun de dispenseringer, hvis vnr står på din liste:
medicin %>%
  filter(atc == "A10BJ06") %>%         # semaglutid (Ozempic OG Wegovy)
  filter(vnr %in% !!ozempic_vnr)       # behold kun rækker med et vnr fra din liste

Hold de to navne i sidste linje adskilt: vnr (alene) er registrets kolonne med varenummeret - produktets ID, på samme måde som pnr er personens ID. ozempic_vnr er din egen R-vektor med de varenumre, du har slået op for Ozempic; navnet vælger du selv (samme mønster som kodelisten i Udtræk trin for trin). %in% beholder de rækker, hvor vnr findes i din liste, og !! sender din lokale liste ind i den dovne forespørgsel (uddybet i Udtræk fra LPR og Guide til funktioner).

Note

Hvilke vnr der hører til hvilket produkt afhænger af pakning og styrke (ét produkt har flere varenumre). Slå dem op i lægemiddeltaksonomien for netop din studieperiode frem for at antage, og dokumentér listen i din kode. For indo fandt Harbi & Pottegård 2024 en indikationskode på 82 % af recepterne (ca. 88 % korrigeret) og næsten 100 % korrekt, når den fandtes - men manglen er klart større før 1. oktober 2017 (hvor elektronisk ordination blev lovpligtig) og varierer med lægemiddelgruppe (ca. 8 % manglende for systemiske antiinfektiva mod 28 % for blodrelaterede midler). 5,6-36 % af koderne er uspecifikke (fx “for hjertet” for betablokkere); om en uspecifik kode er brugbar afhænger af dit spørgsmål. Værdisættet er Sundhedsdatastyrelsens klassifikation af lægemidler (Medicinpriser). Som sidenote: at en kode er gyldigt registreret betyder ikke, at lægen valgte den rigtige indikation - rullemenuer gør fejlvalg lette, så koden er ikke nødvendigvis den kliniske sandhed.

Warning

En ekspedering er ikke det samme som indtag. eksd fortæller, at recepten blev hentet på apoteket, ikke at patienten tog medicinen, og slet ikke hvor længe. Til en eksponering der varer over tid - behandlingsepisoder, grace-perioder (det tilladte ophold mellem to recepter, før man regnes som stoppet) og adherence-mål (efterlevelse) som PDC (proportion of days covered: andel af opfølgningstiden dækket af medicin) eller MPR (medication possession ratio: udleveret mængde delt med periodens længde) - skal du bygge eksponeringsvinduer ud fra mængde og styrke, ikke bare tælle dispenseringer. De relevante LMDB-felter er apk (antal pakninger), packsize (pakningsstørrelse, dvs. antal enheder per pakning) og strnum (styrkens talværdi; enheden står i strunit). Bemærk at selve doseringsfeltet doso stort set er tomt (registreret for ~0,06 % af recepterne i samme validering), så dosis må udledes af disse pakningsfelter. Færdige værktøjer til det ligger i heaven (drug exposure-vinduer fra LMDB). Afhænger din index-dato eller eksponeringsstatus af fremtidig medicin, opstår immortal time bias: kræver du fx, at en person skal indløse recepten (eller to recepter) efter index for at tælle som eksponeret, så har de pr. konstruktion overlevet frem til den dato - og den “udødelige” tid mellem index og første recept får eksponeringen til at se kunstigt beskyttende ud. Lad i stedet opfølgningen for de eksponerede starte ved første dispensering, eller behandl medicin som en tidsvarierende eksponering.

Se også

Back to top