Einfache Verfahren zur Überprüfung vonReferenzintervallen
Georg Hoffmann (1), Frank Klawonn (2)
2022-06-15
- Trillium GmbH Med.Fachverlag, Grafrath
- Helmholtzzentrumfür Infektionsforschung (HZI), Braunschweig
Hintergrund und Aufgabenstellung
Nach nationalen und internationalen Vorschriften sind medizinischeLaboratorien verpflichtet, alle Referenzintervalle (RI) zu überprüfen,die sie aus Produktblättern oder anderen externen Quellen übernommenhaben (SackU & Özçürümez M 2019, Hoffmann2020). Definitionsgemäß umfassen RI die zentralen 95 % vonLaborwerten, die an gesunden Referenzpersonen gemessen wurden. Dieleitliniengerechte Identifizierung und Rekrutierung solcher Personen istallerdings in der Praxis aus Zeit- und Kostengründen nichtrealisierbar.
Deshalb werden heute vorwiegend indirekte Verfahren eingesetzt, diees erlauben, aus Routinewerten die „vermutlich nichtpathologischen“Werte zu identifizieren und deren nicht direkt ablesbare Referenzgrenzenüber mathematische Parameter zu schätzen. Dies ist organisatorischdeutlich einfacher als das direkte Verfahren, erfordert dafür aberstatistischen Mehraufwand, der oft mit langen Rechenzeiten und hohenAnforderungen an die Fallzahlen verbunden ist.
In diesem Beitrag geht es um die reine Überprüfung, ob vorgegebeneReferenzgrenzen zu den lokalen Gegebenheiten hinsichtlich Analytik undPostanalytik passen oder nicht. Hierfür kann und sollte kein so großerAufwand betrieben werden wie für die De-novo-Bestimmung vonReferenzintervallen. Wir stellen hier einfache grafische Verfahren vor,die es erlauben, mit geringem mathematischem Aufwand und moderatenFallzahlen zu prüfen, welche Referenzintervalle imLaborinformationssystem akzeptiert werden können und welche einerKorrektur bedürfen.
Material und Methodik
Die verwendeten Echtdaten stammen aus einem öffentlich zugänglichenData Repositoryfür Projekte zum maschinellen Lernen (Hoffmann G etal. 2018, Oladimeji O,2021). Sie können mit R unmittelbar eingelesen und analysiertwerden. `
x <- read.csv("https://archive.ics.uci.edu/ml/machine-learning-databases/00571/hcvdat0.csv")
head(x) #zeigt die ersten Zeilen des Datensatzes an
## X Category Age Sex ALB ALP ALT AST BIL CHE CHOL CREA GGT PROT
## 1 1 0=Blood Donor 32 m 38.5 52.5 7.7 22.1 7.5 6.93 3.23 106 12.1 69.0
## 2 2 0=Blood Donor 32 m 38.5 70.3 18.0 24.7 3.9 11.17 4.80 74 15.6 76.5
## 3 3 0=Blood Donor 32 m 46.9 74.7 36.2 52.6 6.1 8.84 5.20 86 33.2 79.3
## 4 4 0=Blood Donor 32 m 43.2 52.0 30.6 22.6 18.9 7.33 4.74 80 33.8 75.7
## 5 5 0=Blood Donor 32 m 39.2 74.1 32.6 24.8 9.6 9.15 4.32 76 29.9 68.7
## 6 6 0=Blood Donor 32 m 41.6 43.3 18.5 19.7 12.3 9.92 6.05 111 91.0 74.0
Der Datensatz besteht aus 615 Zeilen mit quantitativen Laborwertenvon 238 Frauen und 377 Männern im Alter von 19 bis 77 Jahren. Davon sindinsgesamt 540 Personen Blutspender, die übrigen 75 weisenunterschiedliche Schweregrade einer Hepatitis C auf. Bei allen Personenwurden zehn Biomarker für die Diagnostik einer Leberschädigungbestimmt.
x$Sex <- as.factor(x$Sex) #gruppiert die Angaben für das Geschlecht
x$Category <- as.factor(x$Category) #gruppiert die Angaben für die Kategorie (Blutspender, Hepatitis etc.)
summary(x[, 2 : 14])
## Category Age Sex ALB
## 0=Blood Donor :533 Min. :19.00 f:238 Min. :14.90
## 0s=suspect Blood Donor: 7 1st Qu.:39.00 m:377 1st Qu.:38.80
## 1=Hepatitis : 24 Median :47.00 Median :41.95
## 2=Fibrosis : 21 Mean :47.41 Mean :41.62
## 3=Cirrhosis : 30 3rd Qu.:54.00 3rd Qu.:45.20
## Max. :77.00 Max. :82.20
## NA's :1
## ALP ALT AST BIL
## Min. : 11.30 Min. : 0.90 Min. : 10.60 Min. : 0.8
## 1st Qu.: 52.50 1st Qu.: 16.40 1st Qu.: 21.60 1st Qu.: 5.3
## Median : 66.20 Median : 23.00 Median : 25.90 Median : 7.3
## Mean : 68.28 Mean : 28.45 Mean : 34.79 Mean : 11.4
## 3rd Qu.: 80.10 3rd Qu.: 33.08 3rd Qu.: 32.90 3rd Qu.: 11.2
## Max. :416.60 Max. :325.30 Max. :324.00 Max. :254.0
## NA's :18 NA's :1
## CHE CHOL CREA GGT
## Min. : 1.420 Min. :1.430 Min. : 8.00 Min. : 4.50
## 1st Qu.: 6.935 1st Qu.:4.610 1st Qu.: 67.00 1st Qu.: 15.70
## Median : 8.260 Median :5.300 Median : 77.00 Median : 23.30
## Mean : 8.197 Mean :5.368 Mean : 81.29 Mean : 39.53
## 3rd Qu.: 9.590 3rd Qu.:6.060 3rd Qu.: 88.00 3rd Qu.: 40.20
## Max. :16.410 Max. :9.670 Max. :1079.10 Max. :650.90
## NA's :10
## PROT
## Min. :44.80
## 1st Qu.:69.30
## Median :72.20
## Mean :72.04
## 3rd Qu.:75.40
## Max. :90.00
## NA's :1
Als zweites Input-File werden die Grenzwerte des Herstellersbenötigt, die überprüft werden sollen. Beispielhaft erzeugen wir eineMatrix mit den Angaben für Albumin (ALB) in g/l undAlanin-Aminotransverase (ALT) in U/l.
ref <- matrix(c(35.6, 46.1, 35.6, 46.1, 10, 35, 10, 50), nrow = 4)
rownames(ref) <- c("Frauen UG", "Frauen OG", "Männer UG", "Männer OG")
colnames(ref) <- c("ALB", "ALT")
ref
## ALB ALT
## Frauen UG 35.6 10
## Frauen OG 46.1 35
## Männer UG 35.6 10
## Männer OG 46.1 50
Alle hier vorgestellten Auswertungen werden mit R ausgeführt. DerCode kann aus diesem Dokument direkt kopiert und lokal ausgeführtwerden. Für die Berechnung sog. zlog-Werte HoffmannG et al. 2017 verwenden wir das R-Package zlog. Falls dieses nochnicht installiert wurde, wird dies mit install.packages()erledigt
if(!require(zlog)){install.packages("zlog")}
## Loading required package: zlog
library(zlog)
Datenaufbereitung
Im ersten Schritt erzeugen wir den gewünschten Ausschnitt aus denDaten und entfernen die Zeilen mit fehlenden Werten (NA).
xx <- na.omit(x[, c(2 : 5, 7)]) #extrahiert die Spalten 2 bis 4 plus die Werte für ALB und ALT
summary(xx)
## Category Age Sex ALB
## 0=Blood Donor :533 Min. :19.00 f:238 Min. :14.90
## 0s=suspect Blood Donor: 7 1st Qu.:39.00 m:375 1st Qu.:38.80
## 1=Hepatitis : 23 Median :47.00 Median :41.90
## 2=Fibrosis : 21 Mean :47.39 Mean :41.61
## 3=Cirrhosis : 29 3rd Qu.:54.00 3rd Qu.:45.20
## Max. :77.00 Max. :82.20
## ALT
## Min. : 0.90
## 1st Qu.: 16.40
## Median : 23.00
## Mean : 28.43
## 3rd Qu.: 33.00
## Max. :325.30
Für eine einheitliche statistische Weiterverarbeitung logarithmierenwir alle Messwerte unter der vereinfachenden Annahme, dass man dieallermeisten Laborresultate gesunder Referenzpersonen alslognormalverteilt modellieren kann (Haeckel R & WosniokW 2010).
x.log <- xx
x.log[, 4 : 5] <- log(x.log[, 4 : 5])
colnames(x.log)[4 : 5] <- paste0("log.", colnames(x.log)[4 : 5])
x.log[1,] #zeigt die erste Zeile der logarithmierten Werte an
## Category Age Sex log.ALB log.ALT
## 1 0=Blood Donor 32 m 3.650658 2.04122
Schließlich bereiten wir noch zwei nach dem Geschlecht getrennteSubkohorten vor, um Grenzwerte für Frauen und Männer separat überprüfenzu können.
x.log.f <- subset(x.log, x.log$Sex == "f")
x.log.m <- subset(x.log, x.log$Sex == "m")
paste(nrow(x.log.f), "Frauen und", nrow(x.log.m), "Männer")
## [1] "238 Frauen und 375 Männer"