Authors: Sebastian Gibb [aut, cre] (https://orcid.org/0000-0001-7406-4443)
Last modified: 2022-12-05 12:37:50
Compiled: Mon Dec 5 12:39:17 2022
ameld
Package
The ameld
R package provides a dataset, eldd
, of patients evaluated for liver transplantation at the University Hospital of Leipzig from November 2012 to June 2015. eldr
contains the reference limits for the laboratory measurements used in eldd
.
The datasets could be loaded as follows:
## [1] "Age" "Sex" "DaysAtRisk" "Deceased" "LTx"
## [6] "Cirrhosis" "ALF" "Ethyltoxic" "HBV" "HCV"
## [11] "AIH" "PBC" "PSC" "NASH" "Cryptogenic"
## [16] "Dialysis" "GIB" "HCC" "SBP" "ALAT_S"
## [21] "ALB_S" "AP_S" "ASAT_S" "B_MPV_E" "B_PLT_E"
## [26] "B_WBC_E" "BILI_S" "BILID_S" "CA_S" "CHE_S"
## [31] "CHOLG_S" "CL_S" "CRE_S" "CRP_S" "CYSC_S"
## [36] "GGT_S" "IL6_S" "INR_C" "NA_S" "P_S"
## [41] "PALB_S" "PROT_S" "PTH_S" "VDT_OH_S"
Age | Sex | DaysAtRisk | Deceased | LTx | Cirrhosis | ALF | Ethyltoxic | HBV | HCV |
---|---|---|---|---|---|---|---|---|---|
68 | male | 200 | 0 | 0 | 1 | 0 | 1 | 1 | 0 |
64 | male | 3 | 1 | 0 | 1 | 0 | 1 | 0 | 0 |
67 | female | 208 | 0 | 0 | 1 | 0 | 1 | 0 | 0 |
32 | female | 17 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
64 | female | 189 | 0 | 0 | 1 | 0 | 1 | 0 | 0 |
79 | male | 674 | 0 | 0 | 1 | 0 | 1 | 0 | 0 |
Code | Unit | LongDescription | ShortDescription | LowerLimit | UpperLimit | AgeDays | Sex |
---|---|---|---|---|---|---|---|
ALAT_S | µkat/l | alanine aminotransferase | ALAT | 0.17 | 0.85 | 6574 | male |
ALAT_S | µkat/l | alanine aminotransferase | ALAT | 0.17 | 0.58 | 6574 | female |
ALB_S | g/l | albumin | Alb | 35.00 | 52.00 | 6574 | both |
AP_S | µkat/l | alkaline phosphatase | AP | 0.67 | 2.15 | 6574 | male |
AP_S | µkat/l | alkaline phosphatase | AP | 0.58 | 1.74 | 6574 | female |
ASAT_S | µkat/l | aspartate aminotransferase | ASAT | 0.17 | 0.85 | 6574 | male |
The ameld
package provides a plot_surv
function that is similar to survival::plot.survfit()
but uses different defaults:
library("survival")
srv <- Surv(eldd$DaysAtRisk, eldd$Deceased)
srvfit <- survfit(srv ~ 1)
plot_surv(
srvfit,
main = "Kaplan-Meier Survival Estimate"
)
plot_surv(
srvfit,
cumhaz = TRUE,
main = "Cumulative Hazard"
)
A more complex example of the survival plot with risk tables could be generated by combining plot_surv
and plot_table
:
## timepoints of interest
times <- c(0, 30, 90)
## calculate risk tables
sm <- summary(srvfit, times = times)
nrisk <- as.matrix(sm$n.risk)
ncumevents <- as.matrix(cumsum(sm$n.event))
rownames(nrisk) <- rownames(ncumevents) <- times
## keep old graphic parameters and restore them afterwards
old.par <- par(no.readonly = TRUE)
layout(matrix(1:3, nrow = 3), height = c(5, 1, 1))
par(cex.main = 2)
plot_surv(
srvfit,
main = "Kaplan-Meier Survival Estimate to day 90",
times = times,
xmax = 90
)
par(mar = c(5.1, 4.1, 1.1, 2.1))
plot_table(
nrisk, at = times, main = "Number at risk",
xaxis = FALSE, cex.text = 1.5, ylabels = FALSE
)
par(mar = c(5.1, 4.1, 1.1, 2.1))
plot_table(
ncumevents, at = times, main = "Cumulative number of events",
xaxis = FALSE, cex.text = 1.5, ylabels = FALSE
)
par(old.par)
The \(z(log)\)-transformation was suggested in Hoffmann et al. (2017). It is similar to common \(z\)-transformation but standardizes laboratory measurements by their respective reference or normal values. An R implementation is provided by the zlog
package (Gibb 2021).
library("zlog")
## transform reference data.frame for zlog
r <- eldr[c("Code", "AgeDays", "Sex", "LowerLimit", "UpperLimit")]
names(r) <- c("param", "age", "sex", "lower", "upper")
r$age <- r$age / 365.25
r <- set_missing_limits(r)
## we just want to standardize laboratory values
cn <- colnames(eldd)
cnlabs <- cn[grepl("_[SCEFQ1]$", cn)]
zeldd <- eldd
zeldd[c("Age", "Sex", cnlabs)] <- zlog_df(eldd[, c("Age", "Sex", cnlabs)], r)
We could use the (mean) \(z(log)\) values to get a first impression of the influence of these values on survival/non-survival:
## divide data.frame by dead/alive
s <- split(zeldd[cnlabs], zeldd$Deceased)
names(s) <- c("survived", "dead")
## calculate mean standardized lab values
s <- lapply(s, colMeans, na.rm = TRUE)
o <- order(s$dead)
## comparison plot
col <- palette.colors(2)
## keep old graphic parameters and restore them afterwards
old.par <- par(no.readonly = TRUE)
par(mar = c(7.1, 4.1, 4.1, 2.1))
plot(
s$dead[o], type = "b", pch = 20, lwd = 2, col = col[1],
axes = FALSE, ann = FALSE
)
lines(s$survived[o], type = "b", pch = 20, lwd = 2, col = col[2])
legend(
"bottomright",
legend = c("dead", "survived"),
col = col, lwd = 2, pch = 20, bty = "n"
)
title(
main = "Mortality Status vs Mean Standardized Laboratory Values", adj = 0
)
title(xlab = "Laboratory Measurements", adj = 1L, line = 5)
title(ylab = "Mean Standardized Values", adj = 1L)
r <- range(unlist(s))
axis(
2, at = seq(from = floor(r[1]), to = ceiling(r[2])),
lwd.ticks = 0, col = "#808080"
)
axis(
1, at = seq_along(o), labels = names(s$dead[o]), las = 2,
lwd.ticks = 0L, col = "#808080"
)
par(old.par)
We divide our cohort into 5 MELD-score risk categories as described in Wiesner et al. (2003). Our observed 90 day mortality is higher than the predicted one, except in the lowest category.
eldd$MELD <- meld(
creatinine = as_metric(eldd$CRE_S, "creatinine"),
bilirubin = as_metric(eldd$BILI_S, "bilirubin"),
inr = eldd$INR_C,
dialysis = eldd$Dialysis,
cause = "other"
)
# Mortality rates and categories as reported in Wiesner et al. 2003
mr <- c(1.9, 6.0, 19.6, 52.6, 71.3) / 100
mcat <- cut(
eldd$MELD,
breaks = c(-Inf, seq(10, 40, by=10), Inf),
labels = c(
paste0("[", floor(min(eldd$MELD, na.rm = TRUE)), ",9]"),
"[10,20)", "[20,30)", "[30,40)",
paste0( "[40,", ceiling(max(eldd$MELD, na.rm = TRUE)), ")")
),
right = FALSE
)
tbl <- observed_vs_expected_mortality(srv, time = 90, f = mcat, expected = mr)
tbl[c("ObservedMortality", "ExpectedMortality")] <-
tbl[c("ObservedMortality", "ExpectedMortality")] * 100
knitr::kable(
tbl,
col.names =
c(
"Observed deaths (n)",
"Expected deaths (n)",
"Standardized mortality ratio (SMR)",
"Observed mortality (%)",
"Expected mortality (%)"
),
caption = paste0(
"Observed vs MELD-expected 90 day mortality. ",
"MELD mortality values are taken from @wiesner2003. ",
"All patients censored before day 90 are ignored for ",
" the calculation of the MELD-expected deaths. ",
"SMR, Standardized mortality ratio = observed deaths/expected deaths."
),
digits = 1
)
Observed deaths (n) | Expected deaths (n) | Standardized mortality ratio (SMR) | Observed mortality (%) | Expected mortality (%) | |
---|---|---|---|---|---|
[6,9] | 1 | 4.0 | 0.3 | 0.5 | 1.9 |
[10,20) | 21 | 13.0 | 1.6 | 8.9 | 6.0 |
[20,30) | 34 | 11.6 | 2.9 | 51.0 | 19.6 |
[30,40) | 18 | 10.0 | 1.8 | 92.8 | 52.6 |
[40,52) | 6 | 4.3 | 1.4 | 100.0 | 71.3 |
This work is part of the AMPEL (Analysis and Reporting System for the Improvement of Patient Safety through Real-Time Integration of Laboratory Findings) project.
This measure is co-funded with tax revenues based on the budget adopted by the members of the Saxon State Parliament.
## R version 4.2.2 (2022-10-31)
## Platform: x86_64-apple-darwin17.0 (64-bit)
## Running under: macOS Big Sur ... 10.16
##
## Matrix products: default
## BLAS: /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRblas.0.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRlapack.dylib
##
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] zlog_1.0.1.9000 ameld_0.0.31 survival_3.4-0 glmnet_4.1-6
## [5] Matrix_1.5-1
##
## loaded via a namespace (and not attached):
## [1] Rcpp_1.0.9 highr_0.9 bslib_0.4.1 compiler_4.2.2
## [5] jquerylib_0.1.4 iterators_1.0.14 tools_4.2.2 digest_0.6.30
## [9] jsonlite_1.8.3 evaluate_0.18 memoise_2.0.1 lifecycle_1.0.3
## [13] lattice_0.20-45 rlang_1.0.6 foreach_1.5.2 cli_3.4.1
## [17] yaml_2.3.6 pkgdown_2.0.6 xfun_0.35 fastmap_1.1.0
## [21] stringr_1.5.0 knitr_1.41 desc_1.4.2 fs_1.5.2
## [25] vctrs_0.5.1 sass_0.4.4 systemfonts_1.0.4 rprojroot_2.0.3
## [29] grid_4.2.2 glue_1.6.2 R6_2.5.1 textshaping_0.3.6
## [33] rmarkdown_2.18 purrr_0.3.5 magrittr_2.0.3 codetools_0.2-18
## [37] htmltools_0.5.3 splines_4.2.2 shape_1.4.6 ragg_1.2.4
## [41] stringi_1.7.8 cachem_1.0.6
Gibb, Sebastian. 2021. zlog: Z(log) Transformation for Laboratory Measurements. https://doi.org/10.5281/zenodo.4727117.
Hoffmann, Georg, Frank Klawonn, Ralf Lichtinghagen, and Matthias Orth. 2017. “The Zlog-Value as Basis for the Standardization of Laboratory Results.” LaboratoriumsMedizin 41 (1): 23–32. https://doi.org/10.1515/labmed-2016-0087.
Wiesner, Russell, Erick Edwards, Richard Freeman, Ann Harper, Ray Kim, Patrick Kamath, Walter Kremers, et al. 2003. “Model for End-Stage Liver Disease (MELD) and Allocation of Donor Livers.” Gastroenterology 124 (1): 91–96. https://doi.org/10.1053/gast.2003.50016.