Forstå LPR

Struktur, historie og nuancer - før du skriver kode

Published

July 2, 2026

Det Nationale Patientregister (LPR) er kilden til diagnoser og hospitalskontakter. Det dækker alle offentlige hospitalsindlæggelser og ambulante kontakter i Danmark.

LPR er mere komplekst end de fleste registre, fordi det skiftede format i 2019 og er splittet i somatiske og psykiatriske tabeller. Denne side forklarer strukturen - perioderne, ICD-koderne, diagnosetyperne og de faldgruber du skal kende, før du trækker data. De konkrete udtræksopskrifter ligger i Udtræk fra LPR.

Tip

Kort fortalt: LPR skiftede format i 2019 - brug LPR2 (frem til marts 2019) og LPR3 (derefter) og kombinér dem. Alle ICD-koder har et D-præfiks, du typisk stripper, og du vælger diagnosetyper (A/B til udfald, +G til baseline-komorbiditet).

Tip

Læserækkefølge: Læs denne side først for at forstå data. Gå derefter til Udtræk fra LPR for de kørende kodeeksempler. Du bygger selve kohorten i Fase 10.


LPR er opdelt i to perioder

I marts 2019 skiftede LPR format. Studier der dækker perioden på tværs af 2019 skal forespørge begge systemer og kombinere dem.

LPR2 somatisk LPR2 psykiatrisk LPR3
Periode frem til marts 2019 frem til marts 2019 marts 2019 og frem
Kontaktregister lpr_adm t_psyk_adm lpr_a_kontakt
Diagnoseregister lpr_diag t_psyk_diag lpr_a_diagnose
Dækker psykiatri Nej Ja Ja (begge samlet)
Join-nøgle recnum k_recnum / v_recnum¹ dw_ek_kontakt
Datokolonne d_inddto (Date) d_inddto (Date) kont_starttidspunkt (datetime)²
pnr-kolonne pnr v_cpr³ pnr
Diagnosekode c_diag c_diag diag_kode
Diagnosetype c_diagtype c_diagtype diag_kode_type
Kontakttype c_pattype ("0" = indlagt) c_pattype kont_type ("ALCA00" = indlagt)

¹ t_psyk_adm har k_recnum; t_psyk_diag har v_recnum - omdøb begge til recnum inden join. ² datetime-format - konverter med as.Date(). ³ Omdøb: rename(pnr = v_cpr).

Hvorfor to registre - kontakt og diagnose? LPR opdeler hver hospitalskontakt i to tabeller: kontaktregistret (fx lpr_adm) har én række per kontakt med pnr, datoer og hospital, men ikke diagnoserne; diagnoseregistret (fx lpr_diag) har én række per diagnose med ICD-koden, men ikke pnr eller dato. Én kontakt kan have flere diagnoser. Du joiner de to på kontakt-nøglen (recnum i LPR2, dw_ek_kontakt i LPR3) for at få pnr + dato + diagnose i samme tabel. Det er den join, udtræksopskrifterne i Udtræk fra LPR bygger på. Samme princip gælder operationer og procedurer: lpr_sksopr (LPR2) har SKS-koden + recnum, men ikke pnr eller dato, så den joines til lpr_adm på nøjagtig samme måde, når du vil finde hvem der fik en operation og hvornår.

Note

Psykiatri: separat i LPR2, samlet i LPR3 Inden 2019 var psykiatriske diagnoser (F-koder: demens, depression mv.) gemt i separate registre (t_psyk_adm, t_psyk_diag). Strukturen ligner somatisk LPR2, men kolonnenavnene afviger - se tabelnoterne ovenfor. Fra marts 2019 samler LPR3 begge: somatiske og psykiatriske kontakter og diagnoser indgår i de samme tabeller, og du behøver ikke en særskilt psykiatrisk forespørgsel.

Endnu ældre psykiatri (1969-1994). Det Psykiatriske Centralregister er elektronisk fra 1969, men dækker kun indlagte patienter frem til 1995 (ambulante besøg kom først med fra 1995). Diagnoser før 1994 er kodet i ICD-8 (numeriske koder, fx 290-315, hvor 290 dækker demens), ikke ICD-10 F-koder. Disse ældre data ligger normalt ikke i standard-LPR-udtrækket og rekvireres særskilt (se Rigsarkivet og NCRR, Aarhus Universitet). Skal dit studie dække den periode, så husk at mappe ICD-8 til dine F-kode-grupper.

gantt
    title LPR-registre
    dateFormat  YYYY
    axisFormat  %Y
    section LPR2 somatisk
    lpr_adm + lpr_diag               :done,   1977, 2019
    section LPR2 psykiatrisk
    t_psyk_adm + t_psyk_diag         :done,   1995, 2019
    section LPR3 samlet
    lpr_a_kontakt + lpr_a_diagnose   :active, 2019, 2027

LPR3 dækker hospitalskontakter fra marts 2019 og frem, og du tilgår dem via LPR_A-filerne (lpr_a_kontakt, lpr_a_diagnose). Vær opmærksom på, at LPR_A også indeholder ambulante data tilbage fra omkring 2017, hvoraf noget allerede ligger i LPR2 - det skal derfor renses for dubletter (se faldgruben nedenfor).

Important

Ny forsker/nyt projekt? Brug kun LPR_A-filerne. LPR3 er blevet leveret i to formater: det ældre LPR_F (kontakter, diagnoser, forloeb) og det nuværende LPR_A (lpr_a_kontakt, lpr_a_diagnose). For nye projekter er LPR_F reelt dødt - brug LPR_A. Begge kan ligge i din mappe og dække de samme år, så hvis du også indlæser LPR_F (eller blander de to), får du duplikerede rækker. Alle eksempler på dette site bruger lpr_a_*.

Warning

Faldgrube: overlappende data. Nogle projekter har ældre kontakter (allerede dækket af LPR2) liggende inde i LPR3-tabellerne (lpr_a_kontakt). Fjern dem ved at filtrere lprindberetningssystem == "LPR3", så den samme kontakt ikke tælles to gange på tværs af LPR2 og LPR3. Det er projektspecifikt - på DARTER er det faldgrube 5; ellers tjek med din datamanager.

Baggrund: LPR_F vs LPR_A (kan springes over)

Da LPR3 blev lanceret i marts 2019, blev forskningsdata først distribueret i LPR_F-modellen: et forløbsorienteret (forloeb) format med separate kontakter-, diagnoser- og forloeb-tabeller. Forskerservice gik senere over til den kontaktbaserede LPR_A-model (lpr_a_kontakt, lpr_a_diagnose), som er den, projekter modtager i dag. De to repræsenterer de samme underliggende kontakter forskelligt, så de er ikke tænkt til at blive kombineret - vælg LPR_A.

Den officielle LPR_F-datamodel er dokumenteret i Vejledning til LPR3_F (og de øvrige links nederst på siden). Dokumentationen for LPR_A er endnu ufuldstændig.

ICD-koder og D-præfikset

ICD-10 (International Classification of Diseases, 10. revision) er WHO’s internationale system til klassifikation af sygdomme og tilstande. Alle hospitaldiagnoser i Danmark kodes med ICD-10, fx G30 for Alzheimers sygdom og F00 for demens ved Alzheimers.

Alle ICD-10-koder i DST har et foranstillet "D": "DG30" (Alzheimers), "DF00" (demens), "DI21" (akut myokardieinfarkt).

Strip typisk D-præfikset inden sammenligning - det giver mere læsbar kode og genbrug til mange udfald:

mutate(icd3 = substr(c_diag, 2, 4))   # "DG30" → "G30" (3-tegns kode)
mutate(icd4 = substr(c_diag, 2, 5))   # "DI219" → "I219" (4-tegns kode)

substr(x, start, stop) beholder tegnene fra position start til og med stop (talt fra 1). substr(c_diag, 2, 4) springer position 1 (D-præfikset) over og beholder tegn 2, 3 og 4: "DG30""G30". Brug 2–5 til 4-tegns koder: "DI219""I219".


Diagnosetyper: A, B og G

Kode Betydning Hvornår inkluderes den
A Aktionsdiagnose - primær årsag til kontakten Altid til udfald
B Bidiagnose - yderligere tilstand til stede Altid til udfald
G Grundmorbus - underliggende baggrundstilstand Kun til baseline-komorbiditet
# Til udfald og eksklusionsdiagnoser:
filter(c_diagtype %in% c("A", "B"))

# Til baseline-komorbiditet (NMI):
filter(c_diagtype %in% c("A", "B", "G"))
Tip

Behold type-kolonnen i dit udtræk. Tag c_diagtype (i LPR3: diag_kode_type) med i dit output, ikke kun diagnosekoden. Det koster én kolonne og lader dig senere variere case-definitionen - fx hovedanalyse på A + B, sensitivitetsanalyse på kun A (aktionsdiagnose) eller inklusive G - uden at forespørge LPR igen.


Tilbagekaldte diagnoser i LPR3 (senere_afkraeftet)

LPR3 markerer diagnoser der er tilbagekaldt. Standardfiltret:

filter(is.na(senere_afkraeftet) | senere_afkraeftet != "Ja")

is.na()-delen er bevidst. R’s standardadfærd er: NA != "Ja" returnerer NA - ikke TRUE. Et filter betragter NA som FALSE og dropper rækken. filter(senere_afkraeftet != "Ja") alene ville derfor fjerne alle diagnoser der slet ikke har en tilbagekaldelsesmarkering (dvs. NA-felter) - selvom de bestemt ikke er tilbagekaldt. is.na(...) retter det: “behold rækken hvis feltet er NA ELLER hvis det ikke er "Ja"”. Filtret beholder dermed ukategoriserede diagnoser, hvilket er den sikreste antagelse.


Udfordring med LPR_A: diagnose-spike omkring 2019-2020

Overgangen til LPR3’s kontaktbaserede model ændrede også hvordan ambulante diagnoser registreres, og det kan forvrænge antallet af diagnoser hen over overgangen.

I LPR2 blev et forløb af ambulante besøg typisk opsummeret med én (aktions)diagnose for hele forløbet. I LPR3 kan hver kontakt bære sine egne diagnoser. Så en patient med 10 ambulante besøg for depression, der gav én diagnoserække i LPR2, kan give ti rækker i LPR3 - samme sygdom, langt flere registreringer.

Den synlige effekt er et spike i antallet af diagnoser omkring 2019-2020, til stede for de fleste diagnoser, og synligt selv hvis du kun ser på primærdiagnosen (aktionsdiagnosen). Det kompliceres yderligere af et overlap med COVID-19 i 2020 og gør perioden endnu sværere at tolke.

Warning

Der findes ingen samlet, vedtaget løsning. Det er et reelt problem i registerforskning, især for analyser der kun bygger på hospitalsdiagnoser.

Vi opfordrer derfor til at visualisere antallet af de diagnoser der bruges i jeres studie på tværs af kalenderår

library(lubridate)
alle_dx %>%
  mutate(year = year(date_contact)) %>%   # date_contact fra dit LPR-udtræk
  count(year) %>%
  arrange(year)
# plot n mod year og kig efter et spring omkring 2019-2020

De fleste diagnoser viser spiket. Nogle få er stabile hen over overgangen (fx type 1-diabetes) og er et nyttigt sanity check: springer selv en stabil diagnose i dine data, er der noget andet galt.

Til inspiration og evaluering af diagnostisk stabilitet hen over overgangen, se Aarhus-Psychiatry-Research/diagnostic-stability-lpr2-lpr3 (metodisk inspiration, ikke kode til genbrug).


Næste skridt

Nu kender du LPR’s struktur og de vigtigste faldgruber. Næste skridt er at trække diagnoserne ud med kode:

Udtræk fra LPR

Se også

Eksternt om LPR3 og 2019-overgangen

Kodeopslag

Back to top