From baea4323c77e0a2c3eb8d38abb657c67f20e508d Mon Sep 17 00:00:00 2001 From: Matthijs Berends Date: Wed, 5 Feb 2025 20:48:35 +0100 Subject: [PATCH] (v2.1.1.9140) WISCA fix --- DESCRIPTION | 4 +- NAMESPACE | 1 + NEWS.md | 2 +- PythonPackage/AMR/AMR.egg-info/PKG-INFO | 2 +- PythonPackage/AMR/AMR/__init__.py | 1 + PythonPackage/AMR/AMR/functions.py | 3 + .../AMR/dist/AMR-2.1.1.9139-py3-none-any.whl | Bin 10167 -> 0 bytes .../AMR/dist/AMR-2.1.1.9140-py3-none-any.whl | Bin 0 -> 10211 bytes PythonPackage/AMR/dist/amr-2.1.1.9139.tar.gz | Bin 10004 -> 0 bytes PythonPackage/AMR/dist/amr-2.1.1.9140.tar.gz | Bin 0 -> 10044 bytes PythonPackage/AMR/setup.py | 2 +- R/aa_globals.R | 2 +- R/antibiogram.R | 202 ++++++++++++------ R/proportion.R | 26 +-- ....txt => gpt_training_text_v2.1.1.9140.txt} | 180 ++++++++++------ man/antibiogram.Rd | 121 ++++++++--- man/as.mo.Rd | 2 +- man/count.Rd | 24 +-- man/microorganisms.Rd | 2 +- man/mo_property.Rd | 2 +- man/proportion.Rd | 26 +-- pkgdown/extra.js | 2 +- tests/testthat/test-zzz.R | 6 +- 23 files changed, 408 insertions(+), 202 deletions(-) delete mode 100644 PythonPackage/AMR/dist/AMR-2.1.1.9139-py3-none-any.whl create mode 100644 PythonPackage/AMR/dist/AMR-2.1.1.9140-py3-none-any.whl delete mode 100644 PythonPackage/AMR/dist/amr-2.1.1.9139.tar.gz create mode 100644 PythonPackage/AMR/dist/amr-2.1.1.9140.tar.gz rename data-raw/{gpt_training_text_v2.1.1.9139.txt => gpt_training_text_v2.1.1.9140.txt} (98%) diff --git a/DESCRIPTION b/DESCRIPTION index 839ad37c9..dd8045479 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: AMR -Version: 2.1.1.9139 -Date: 2025-02-01 +Version: 2.1.1.9140 +Date: 2025-02-05 Title: Antimicrobial Resistance Data Analysis Description: Functions to simplify and standardise antimicrobial resistance (AMR) data analysis and to work with microbial and antimicrobial properties by diff --git a/NAMESPACE b/NAMESPACE index 78f103355..e9f742afd 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -316,6 +316,7 @@ export(rescale_mic) export(reset_AMR_locale) export(resistance) export(resistance_predict) +export(retrieve_wisca_parameters) export(rifamycins) export(right_join_microorganisms) export(scale_colour_mic) diff --git a/NEWS.md b/NEWS.md index 7847a9919..b6cbfe83a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# AMR 2.1.1.9139 +# AMR 2.1.1.9140 *(this beta version will eventually become v3.0. We're happy to reach a new major milestone soon, which will be all about the new One Health support! Install this beta using [the instructions here](https://msberends.github.io/AMR/#latest-development-version).)* diff --git a/PythonPackage/AMR/AMR.egg-info/PKG-INFO b/PythonPackage/AMR/AMR.egg-info/PKG-INFO index 6048f01fd..869f562b1 100644 --- a/PythonPackage/AMR/AMR.egg-info/PKG-INFO +++ b/PythonPackage/AMR/AMR.egg-info/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 2.2 Name: AMR -Version: 2.1.1.9139 +Version: 2.1.1.9140 Summary: A Python wrapper for the AMR R package Home-page: https://github.com/msberends/AMR Author: Matthijs Berends diff --git a/PythonPackage/AMR/AMR/__init__.py b/PythonPackage/AMR/AMR/__init__.py index 26567f233..f952d9d00 100644 --- a/PythonPackage/AMR/AMR/__init__.py +++ b/PythonPackage/AMR/AMR/__init__.py @@ -27,6 +27,7 @@ from .functions import age from .functions import age_groups from .functions import antibiogram from .functions import wisca +from .functions import retrieve_wisca_parameters from .functions import amr_class from .functions import amr_selector from .functions import aminoglycosides diff --git a/PythonPackage/AMR/AMR/functions.py b/PythonPackage/AMR/AMR/functions.py index 020e71f82..2d2160d6e 100644 --- a/PythonPackage/AMR/AMR/functions.py +++ b/PythonPackage/AMR/AMR/functions.py @@ -111,6 +111,9 @@ def antibiogram(x, *args, **kwargs): def wisca(x, *args, **kwargs): """See our website of the R package for the manual: https://msberends.github.io/AMR/index.html""" return convert_to_python(amr_r.wisca(x, *args, **kwargs)) +def retrieve_wisca_parameters(wisca_model, *args, **kwargs): + """See our website of the R package for the manual: https://msberends.github.io/AMR/index.html""" + return convert_to_python(amr_r.retrieve_wisca_parameters(wisca_model, *args, **kwargs)) def amr_class(amr_class, *args, **kwargs): """See our website of the R package for the manual: https://msberends.github.io/AMR/index.html""" return convert_to_python(amr_r.amr_class(amr_class, *args, **kwargs)) diff --git a/PythonPackage/AMR/dist/AMR-2.1.1.9139-py3-none-any.whl b/PythonPackage/AMR/dist/AMR-2.1.1.9139-py3-none-any.whl deleted file mode 100644 index 5e476bb59c826bc5685ce1a5a96f1fc8104e6c9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10167 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 Z?_Yvakq7=IWB}Zsas5Y!%T#|o{STbP?6d#? literal 0 HcmV?d00001 diff --git a/PythonPackage/AMR/dist/amr-2.1.1.9139.tar.gz b/PythonPackage/AMR/dist/amr-2.1.1.9139.tar.gz deleted file mode 100644 index 8703644fa399b7e0a9a601651dd1802990f7769b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10004 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 diff --git a/PythonPackage/AMR/dist/amr-2.1.1.9140.tar.gz b/PythonPackage/AMR/dist/amr-2.1.1.9140.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..70c085e6bdbcc14cf9a7f5398c02bc4ce1e8d9f5 GIT binary patch literal 10044 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 *Formatting Type* for a list of options. #' @param col_mo column name of the names or codes of the microorganisms (see [as.mo()]) - the default is the first column of class [`mo`]. Values will be coerced using [as.mo()]. #' @param language language to translate text, which defaults to the system language (see [get_AMR_locale()]) #' @param minimum the minimum allowed number of available (tested) isolates. Any isolate count lower than `minimum` will return `NA` with a warning. The default number of `30` isolates is advised by the Clinical and Laboratory Standards Institute (CLSI) as best practice, see *Source*. #' @param combine_SI a [logical] to indicate whether all susceptibility should be determined by results of either S, SDD, or I, instead of only S (default is `TRUE`) #' @param sep a separating character for antimicrobial columns in combination antibiograms -#' @param wisca a [logical] to indicate whether a Weighted-Incidence Syndromic Combination Antibiogram (WISCA) must be generated (default is `FALSE`). This will use a Bayesian hierarchical model to estimate regimen coverage probabilities using Montecarlo simulations. Set `simulations` to adjust. -#' @param simulations (for WISCA) a numerical value to set the number of Montecarlo simulations +#' @param wisca a [logical] to indicate whether a Weighted-Incidence Syndromic Combination Antibiogram (WISCA) must be generated (default is `FALSE`). This will use a Bayesian decision model to estimate regimen coverage probabilities using [Monte Carlo simulations](https://en.wikipedia.org/wiki/Monte_Carlo_method). Set `simulations` to adjust. +#' @param simulations (for WISCA) a numerical value to set the number of Monte Carlo simulations #' @param conf_interval (for WISCA) a numerical value to set confidence interval (default is `0.95`) #' @param interval_side (for WISCA) the side of the confidence interval, either `"two-tailed"` (default), `"left"` or `"right"` #' @param info a [logical] to indicate info should be printed - the default is `TRUE` only in interactive mode @@ -64,7 +64,7 @@ #' #' ### Formatting Type #' -#' The formatting of the 'cells' of the table can be set with the argument `formatting_type`. In these examples, `5` is the susceptibility percentage (for WISCA: `4-6` indicates the confidence level), `15` the numerator, and `300` the denominator: +#' The formatting of the 'cells' of the table can be set with the argument `formatting_type`. In these examples, `5` is the antimicrobial coverage (for WISCA: `4-6` indicates the confidence level), `15` the numerator, and `300` the denominator: #' #' 1. 5 #' 2. 15 @@ -81,17 +81,17 @@ #' #' Additional options for WISCA (using `antibiogram(..., wisca = TRUE)` or `wisca()`): #' 13. 5 (4-6) -#' 14. 5% (4-6%) +#' 14. 5% (4-6%) - **default for WISCA** #' 15. 5 (4-6,300) #' 16. 5% (4-6%,300) #' 17. 5 (4-6,N=300) -#' 18. 5% (4-6%,N=300) - **default for WISCA** +#' 18. 5% (4-6%,N=300) #' 19. 5 (4-6,15/300) #' 20. 5% (4-6%,15/300) #' 21. 5 (4-6,N=15/300) #' 22. 5% (4-6%,N=15/300) #' -#' The default is `18` for WISCA and `10` for non-WISCA, which can be set globally with the package option [`AMR_antibiogram_formatting_type`][AMR-options], e.g. `options(AMR_antibiogram_formatting_type = 5)`. +#' The default is `14` for WISCA and `10` for non-WISCA, which can be set globally with the package option [`AMR_antibiogram_formatting_type`][AMR-options], e.g. `options(AMR_antibiogram_formatting_type = 5)`. Do note that for WISCA, the numerator and denominator are less useful to report, since these are included in the Bayesian model and apparent from the susceptibility and its confidence level. #' #' Set `digits` (defaults to `0`) to alter the rounding of the susceptibility percentages. #' @@ -99,7 +99,7 @@ #' #' There are various antibiogram types, as summarised by Klinker *et al.* (2021, \doi{10.1177/20499361211011373}), and they are all supported by [antibiogram()]. #' -#' **Use WISCA whenever possible**, since it provides more precise coverage estimates by accounting for pathogen incidence and antimicrobial susceptibility, as has been shown by Bielicki *et al.* (2020, \doi{10.1001.jamanetworkopen.2019.21124}). See the section *Why Use WISCA?* on this page. +#' **Use WISCA whenever possible**, since it provides more precise coverage estimates by accounting for pathogen incidence and antimicrobial susceptibility, as has been shown by Bielicki *et al.* (2020, \doi{10.1001.jamanetworkopen.2019.21124}). See the section *Explaining WISCA* on this page. #' #' 1. **Traditional Antibiogram** #' @@ -137,7 +137,7 @@ #' #' 4. **Weighted-Incidence Syndromic Combination Antibiogram (WISCA)** #' -#' WISCA can be applied to any antibiogram, see the section *Why Use WISCA?* on this page for more information. +#' WISCA can be applied to any antibiogram, see the section *Explaining WISCA* on this page for more information. #' #' Code example: #' @@ -152,37 +152,88 @@ #' ``` #' #' WISCA uses a sophisticated Bayesian decision model to combine both local and pooled antimicrobial resistance data. This approach not only evaluates local patterns but can also draw on multi-centre datasets to improve regimen accuracy, even in low-incidence infections like paediatric bloodstream infections (BSIs). +#' +#' ### Grouped tibbles #' -#' Grouped [tibbles][tibble::tibble] can also be used to calculate susceptibilities over various groups. +#' For any type of antibiogram, grouped [tibbles][tibble::tibble] can also be used to calculate susceptibilities over various groups. #' #' Code example: #' #' ```r +#' library(dplyr) #' your_data %>% #' group_by(has_sepsis, is_neonate, sex) %>% #' wisca(antibiotics = c("TZP", "TZP+TOB", "TZP+GEN")) #' ``` +#' +#' ### Stepped Approach for Clinical Insight +#' +#' In clinical practice, antimicrobial coverage decisions evolve as more microbiological data becomes available. This theoretical stepped approach ensures empirical coverage can continuously assessed to improve patient outcomes: +#' +#' 1. **Initial Empirical Therapy (Admission / Pre-Culture Data)** +#' +#' At admission, no pathogen information is available. +#' +#' - Action: broad-spectrum coverage is based on local resistance patterns and syndromic antibiograms. +#' - Code example: +#' +#' ```r +#' antibiogram(your_data, +#' antibiotics = selected_regimens, +#' wisca = TRUE, +#' mo_transform = NA) # all pathogens set to `NA` +#' ``` +#' +#' 2. **Refinement with Gram Stain Results** +#' +#' When a blood culture becomes positive, the Gram stain provides an initial and crucial first stratification (Gram-positive vs. Gram-negative). +#' +#' - Action: narrow coverage based on Gram stain-specific resistance patterns. +#' - Code example: +#' +#' ```r +#' antibiogram(your_data, +#' antibiotics = selected_regimens, +#' wisca = TRUE, +#' mo_transform = "gramstain") # all pathogens set to Gram-pos/Gram-neg +#' ``` +#' +#' 3. **Definitive Therapy Based on Species Identification** +#' +#' After cultivation of the pathogen, full pathogen identification allows precise targeting of therapy. +#' +#' - Action: adjust treatment to pathogen-specific antibiograms, minimizing resistance risks. +#' - Code example: +#' +#' ```r +#' antibiogram(your_data, +#' antibiotics = selected_regimens, +#' wisca = TRUE, +#' mo_transform = "shortname") # all pathogens set to 'G. species', e.g., E. coli +#' ``` +#' +#' By structuring antibiograms around this stepped approach, clinicians can make data-driven adjustments at each stage, ensuring optimal empirical and targeted therapy while reducing unnecessary broad-spectrum antimicrobial use. #' -#' ### Inclusion in Combination Antibiogram and Syndromic Antibiogram -#' -#' Note that for types 2 and 3 (Combination Antibiogram and Syndromic Antibiogram), it is important to realise that susceptibility can be calculated in two ways, which can be set with the `only_all_tested` argument (default is `FALSE`). See this example for two antimicrobials, Drug A and Drug B, about how [antibiogram()] works to calculate the %SI: +#' ### Inclusion in Combination Antibiograms #' +#' Note that for combination antibiograms, it is important to realise that susceptibility can be calculated in two ways, which can be set with the `only_all_tested` argument (default is `FALSE`). See this example for two antimicrobials, Drug A and Drug B, about how [antibiogram()] works to calculate the %SI: +#' #' ``` #' -------------------------------------------------------------------- #' only_all_tested = FALSE only_all_tested = TRUE #' ----------------------- ----------------------- -#' Drug A Drug B include as include as include as include as -#' numerator denominator numerator denominator -#' -------- -------- ---------- ----------- ---------- ----------- -#' S or I S or I X X X X -#' R S or I X X X X -#' S or I X X - - -#' S or I R X X X X -#' R R - X - X -#' R - - - - -#' S or I X X - - -#' R - - - - -#' - - - - +#' Drug A Drug B considered considered considered considered +#' susceptible tested susceptible tested +#' -------- -------- ----------- ---------- ----------- ---------- +#' S or I S or I X X X X +#' R S or I X X X X +#' S or I X X - - +#' S or I R X X X X +#' R R - X - X +#' R - - - - +#' S or I X X - - +#' R - - - - +#' - - - - #' -------------------------------------------------------------------- #' ``` #' @@ -194,7 +245,7 @@ #' #' You can also use functions from specific 'table reporting' packages to transform the output of [antibiogram()] to your needs, e.g. with `flextable::as_flextable()` or `gt::gt()`. #' -#' @section Why Use WISCA?: +#' @section Explaining WISCA: #' #' WISCA, as outlined by Bielicki *et al.* (\doi{10.1093/jac/dkv397}), stands for Weighted-Incidence Syndromic Combination Antibiogram, which estimates the probability of adequate empirical antimicrobial regimen coverage for specific infection syndromes. This method leverages a Bayesian hierarchical logistic regression framework with random effects for pathogens and regimens, enabling robust estimates in the presence of sparse data. #' @@ -361,8 +412,8 @@ antibiogram <- function(x, syndromic_group = NULL, add_total_n = FALSE, only_all_tested = FALSE, - digits = 0, - formatting_type = getOption("AMR_antibiogram_formatting_type", ifelse(wisca, 18, 10)), + digits = ifelse(wisca, 1, 0), + formatting_type = getOption("AMR_antibiogram_formatting_type", ifelse(wisca, 14, 10)), col_mo = NULL, language = get_AMR_locale(), minimum = 30, @@ -385,8 +436,8 @@ antibiogram.default <- function(x, syndromic_group = NULL, add_total_n = FALSE, only_all_tested = FALSE, - digits = 0, - formatting_type = getOption("AMR_antibiogram_formatting_type", ifelse(wisca, 18, 10)), + digits = ifelse(wisca, 1, 0), + formatting_type = getOption("AMR_antibiogram_formatting_type", ifelse(wisca, 14, 10)), col_mo = NULL, language = get_AMR_locale(), minimum = 30, @@ -400,7 +451,7 @@ antibiogram.default <- function(x, meet_criteria(x, allow_class = "data.frame") x <- ascertain_sir_classes(x, "x") if (!is.function(mo_transform)) { - meet_criteria(mo_transform, allow_class = "character", has_length = 1, is_in = c("name", "shortname", "gramstain", colnames(AMR::microorganisms)), allow_NULL = TRUE) + meet_criteria(mo_transform, allow_class = "character", has_length = 1, is_in = c("name", "shortname", "gramstain", colnames(AMR::microorganisms)), allow_NULL = TRUE, allow_NA = TRUE) } if (!is.function(ab_transform)) { meet_criteria(ab_transform, allow_class = "character", has_length = 1, is_in = colnames(AMR::antibiotics), allow_NULL = TRUE) @@ -429,7 +480,9 @@ antibiogram.default <- function(x, # transform MOs x$`.mo` <- x[, col_mo, drop = TRUE] if (is.null(mo_transform)) { - # leave as is + # leave as is, no transformation + } else if (is.na(mo_transform)) { + x$`.mo` <- NA_character_ } else if (is.function(mo_transform)) { x$`.mo` <- mo_transform(x$`.mo`) } else if (mo_transform == "gramstain") { @@ -536,6 +589,7 @@ antibiogram.default <- function(x, ) counts <- out + wisca_params <- NULL if (wisca == TRUE) { # WISCA ---- @@ -547,9 +601,12 @@ antibiogram.default <- function(x, title = "Calculating beta/gamma parameters for WISCA") on.exit(close(progress)) - out$percentage = NA_real_ - out$lower = NA_real_ - out$upper = NA_real_ + out$coverage <- NA_real_ + out$lower <- NA_real_ + out$upper <- NA_real_ + out$gamma_posterior <- NA_real_ + out$beta_posterior_1 <- NA_real_ + out$beta_posterior_2 <- NA_real_ for (i in seq_len(NROW(out))) { if (out$total[i] == 0) { @@ -559,22 +616,29 @@ antibiogram.default <- function(x, out_current <- out[i, , drop = FALSE] priors <- calculate_priors(out_current, combine_SI = combine_SI) + out$gamma_posterior[i] = priors$gamma_posterior + out$beta_posterior_1[i] = priors$beta_posterior_1 + out$beta_posterior_2[i] = priors$beta_posterior_2 + # Monte Carlo simulation coverage_simulations <- replicate(simulations, { + # simulate pathogen incidence # = Dirichlet (Gamma) parameters - simulated_incidence <- stats::rgamma( - n = length(priors$gamma_posterior), + random_incidence <- runif(1, min = 0, max = 1) + simulated_incidence <- stats::qgamma( + p = random_incidence, shape = priors$gamma_posterior, - rate = 1 # Scale = 1 for gamma + scale = 1 ) # normalise simulated_incidence <- simulated_incidence / sum(simulated_incidence) # simulate susceptibility # = Beta parameters - simulated_susceptibility <- stats::rbeta( - n = length(priors$beta_posterior_1), + random_susceptibity <- runif(1, min = 0, max = 1) + simulated_susceptibility <- stats::qbeta( + p = random_susceptibity, shape1 = priors$beta_posterior_1, shape2 = priors$beta_posterior_2 ) @@ -592,7 +656,7 @@ antibiogram.default <- function(x, } coverage_ci <- unname(stats::quantile(coverage_simulations, probs = probs)) - out$percentage[i] <- coverage_mean + out$coverage[i] <- coverage_mean out$lower[i] <- coverage_ci[1] out$upper[i] <- coverage_ci[2] } @@ -640,19 +704,25 @@ antibiogram.default <- function(x, if (wisca == TRUE) { long_numeric <- out %pm>% - pm_summarise(percentage = percentage, - lower = lower, - upper = upper, - numerator = numerator, - total = total) + pm_summarise(coverage = coverage, + lower_ci = lower, + upper_ci = upper, + n_tested = total, + n_total = total_rows, + n_susceptible = numerator, + p_susceptible = numerator / total, + gamma_posterior = gamma_posterior, + beta_posterior1 = beta_posterior_1, + beta_posterior2 = beta_posterior_2) } else { long_numeric <- out %pm>% - pm_summarise(percentage = numerator / total, + pm_summarise(coverage = numerator / total, numerator = numerator, total = total) } out$digits <- digits # since pm_sumarise() cannot work with an object outside the current frame + # formatting type: # 1. 5 # 2. 15 @@ -688,12 +758,12 @@ antibiogram.default <- function(x, if (formatting_type == 10) out <- out %pm>% pm_summarise(out_value = paste0(round((numerator / total) * 100, digits = digits), "% (", numerator, "/", total, ")")) if (formatting_type == 11) out <- out %pm>% pm_summarise(out_value = paste0(round((numerator / total) * 100, digits = digits), " (N=", numerator, "/", total, ")")) if (formatting_type == 12) out <- out %pm>% pm_summarise(out_value = paste0(round((numerator / total) * 100, digits = digits), "% (N=", numerator, "/", total, ")")) - if (formatting_type == 13) out <- out %pm>% pm_summarise(out_value = paste0(round(percentage * 100, digits = digits), " (", round(lower * 100, digits = digits), "-", round(upper * 100, digits = digits), ")")) - if (formatting_type == 14) out <- out %pm>% pm_summarise(out_value = paste0(round(percentage * 100, digits = digits), "% (", round(lower * 100, digits = digits), "-", round(upper * 100, digits = digits), "%)")) - if (formatting_type == 15) out <- out %pm>% pm_summarise(out_value = paste0(round(percentage * 100, digits = digits), " (", round(lower * 100, digits = digits), "-", round(upper * 100, digits = digits), ",", total, ")")) - if (formatting_type == 16) out <- out %pm>% pm_summarise(out_value = paste0(round(percentage * 100, digits = digits), "% (", round(lower * 100, digits = digits), "-", round(upper * 100, digits = digits), "%,", total, ")")) - if (formatting_type == 17) out <- out %pm>% pm_summarise(out_value = paste0(round(percentage * 100, digits = digits), " (", round(lower * 100, digits = digits), "-", round(upper * 100, digits = digits), ",N=", total, ")")) - if (formatting_type == 18) out <- out %pm>% pm_summarise(out_value = paste0(round(percentage * 100, digits = digits), "% (", round(lower * 100, digits = digits), "-", round(upper * 100, digits = digits), "%,N=", total, ")")) + if (formatting_type == 13) out <- out %pm>% pm_summarise(out_value = paste0(round(coverage * 100, digits = digits), " (", round(lower * 100, digits = digits), "-", round(upper * 100, digits = digits), ")")) + if (formatting_type == 14) out <- out %pm>% pm_summarise(out_value = paste0(round(coverage * 100, digits = digits), "% (", round(lower * 100, digits = digits), "-", round(upper * 100, digits = digits), "%)")) + if (formatting_type == 15) out <- out %pm>% pm_summarise(out_value = paste0(round(coverage * 100, digits = digits), " (", round(lower * 100, digits = digits), "-", round(upper * 100, digits = digits), ",", total, ")")) + if (formatting_type == 16) out <- out %pm>% pm_summarise(out_value = paste0(round(coverage * 100, digits = digits), "% (", round(lower * 100, digits = digits), "-", round(upper * 100, digits = digits), "%,", total, ")")) + if (formatting_type == 17) out <- out %pm>% pm_summarise(out_value = paste0(round(coverage * 100, digits = digits), " (", round(lower * 100, digits = digits), "-", round(upper * 100, digits = digits), ",N=", total, ")")) + if (formatting_type == 18) out <- out %pm>% pm_summarise(out_value = paste0(round(coverage * 100, digits = digits), "% (", round(lower * 100, digits = digits), "-", round(upper * 100, digits = digits), "%,N=", total, ")")) # transform names of antibiotics ab_naming_function <- function(x, t, l, s) { @@ -812,8 +882,8 @@ antibiogram.grouped_df <- function(x, syndromic_group = NULL, add_total_n = FALSE, only_all_tested = FALSE, - digits = 0, - formatting_type = getOption("AMR_antibiogram_formatting_type", ifelse(wisca, 18, 10)), + digits = ifelse(wisca, 1, 0), + formatting_type = getOption("AMR_antibiogram_formatting_type", ifelse(wisca, 14, 10)), col_mo = NULL, language = get_AMR_locale(), minimum = 30, @@ -910,8 +980,8 @@ wisca <- function(x, syndromic_group = NULL, add_total_n = FALSE, only_all_tested = FALSE, - digits = 0, - formatting_type = getOption("AMR_antibiogram_formatting_type", 18), + digits = 1, + formatting_type = getOption("AMR_antibiogram_formatting_type", 14), col_mo = NULL, language = get_AMR_locale(), minimum = 30, @@ -938,9 +1008,15 @@ wisca <- function(x, info = info) } +#' @export +#' @param wisca_model the outcome of [wisca()] or [antibiogram(..., wisca = TRUE)] +#' @rdname antibiogram +retrieve_wisca_parameters <- function(wisca_model, ...) { + stop_ifnot(isTRUE(attributes(wisca_model)$wisca), "This function only applies to WISCA models. Use `wisca()` or `antibiogram(..., wisca = TRUE)` to create a WISCA model.") + attributes(wisca_model)$long_numeric +} + calculate_priors <- function(data, combine_SI = TRUE) { - # Ensure data has required columns - stopifnot(all(c("mo", "total_rows", "total", "S") %in% colnames(data))) if (combine_SI == TRUE && "I" %in% colnames(data)) { data$S <- data$S + data$I } @@ -1013,7 +1089,7 @@ plot.antibiogram <- function(x, ...) { df_sub <- df[df$mo == mo, , drop = FALSE] bp <- barplot( - height = df_sub$percentage * 100, + height = df_sub$coverage * 100, xlab = NULL, ylab = ifelse(isTRUE(attributes(x)$combine_SI), "%SI", "%S"), names.arg = df_sub$ab, @@ -1055,7 +1131,7 @@ autoplot.antibiogram <- function(object, ...) { out <- ggplot2::ggplot(df, mapping = ggplot2::aes( x = ab, - y = percentage * 100, + y = coverage * 100, fill = if ("syndromic_group" %in% colnames(df)) { syndromic_group } else { diff --git a/R/proportion.R b/R/proportion.R index b527610c4..bdf50f9ae 100644 --- a/R/proportion.R +++ b/R/proportion.R @@ -46,6 +46,8 @@ #' @param collapse a [logical] to indicate whether the output values should be 'collapsed', i.e. be merged together into one value, or a character value to use for collapsing #' @inheritSection as.sir Interpretation of SIR #' @details +#' For a more automated and comprehensive analysis, consider using [antibiogram()] or [wisca()], which streamline many aspects of susceptibility reporting and, importantly, also support WISCA. The functions described here offer a more hands-on, manual approach for greater customisation. +#' #' **Remember that you should filter your data to let it contain only first isolates!** This is needed to exclude duplicates and to reduce selection bias. Use [first_isolate()] to determine them in your data set with one of the four available algorithms. #' #' The function [resistance()] is equal to the function [proportion_R()]. The function [susceptibility()] is equal to the function [proportion_SI()]. Since AMR v3.0, [proportion_SI()] and [proportion_I()] include dose-dependent susceptibility ('SDD'). @@ -63,18 +65,18 @@ #' -------------------------------------------------------------------- #' only_all_tested = FALSE only_all_tested = TRUE #' ----------------------- ----------------------- -#' Drug A Drug B include as include as include as include as -#' numerator denominator numerator denominator -#' -------- -------- ---------- ----------- ---------- ----------- -#' S or I S or I X X X X -#' R S or I X X X X -#' S or I X X - - -#' S or I R X X X X -#' R R - X - X -#' R - - - - -#' S or I X X - - -#' R - - - - -#' - - - - +#' Drug A Drug B considered considered considered considered +#' susceptible tested susceptible tested +#' -------- -------- ----------- ---------- ----------- ---------- +#' S or I S or I X X X X +#' R S or I X X X X +#' S or I X X - - +#' S or I R X X X X +#' R R - X - X +#' R - - - - +#' S or I X X - - +#' R - - - - +#' - - - - #' -------------------------------------------------------------------- #' ``` #' diff --git a/data-raw/gpt_training_text_v2.1.1.9139.txt b/data-raw/gpt_training_text_v2.1.1.9140.txt similarity index 98% rename from data-raw/gpt_training_text_v2.1.1.9139.txt rename to data-raw/gpt_training_text_v2.1.1.9140.txt index ac6b904b5..e1bab74e3 100644 --- a/data-raw/gpt_training_text_v2.1.1.9139.txt +++ b/data-raw/gpt_training_text_v2.1.1.9140.txt @@ -1,6 +1,6 @@ This knowledge base contains all context you must know about the AMR package for R. You are a GPT trained to be an assistant for the AMR package in R. You are an incredible R specialist, especially trained in this package and in the tidyverse. -First and foremost, you are trained on version 2.1.1.9139. Remember this whenever someone asks which AMR package version you’re at. +First and foremost, you are trained on version 2.1.1.9140. Remember this whenever someone asks which AMR package version you’re at. Below are the contents of the file, the file, and all the files (documentation) in the package. Every file content is split using 100 hypens. ---------------------------------------------------------------------------------------------------- @@ -327,6 +327,7 @@ export(rescale_mic) export(reset_AMR_locale) export(resistance) export(resistance_predict) +export(retrieve_wisca_parameters) export(rifamycins) export(right_join_microorganisms) export(scale_colour_mic) @@ -1625,6 +1626,7 @@ THE PART HEREAFTER CONTAINS CONTENTS FROM FILE 'man/antibiogram.Rd': \name{antibiogram} \alias{antibiogram} \alias{wisca} +\alias{retrieve_wisca_parameters} \alias{plot.antibiogram} \alias{autoplot.antibiogram} \alias{knit_print.antibiogram} @@ -1641,21 +1643,23 @@ THE PART HEREAFTER CONTAINS CONTENTS FROM FILE 'man/antibiogram.Rd': \usage{ antibiogram(x, antibiotics = where(is.sir), mo_transform = "shortname", ab_transform = "name", syndromic_group = NULL, add_total_n = FALSE, - only_all_tested = FALSE, digits = 0, + only_all_tested = FALSE, digits = ifelse(wisca, 1, 0), formatting_type = getOption("AMR_antibiogram_formatting_type", - ifelse(wisca, 18, 10)), col_mo = NULL, language = get_AMR_locale(), + ifelse(wisca, 14, 10)), col_mo = NULL, language = get_AMR_locale(), minimum = 30, combine_SI = TRUE, sep = " + ", wisca = FALSE, simulations = 1000, conf_interval = 0.95, interval_side = "two-tailed", info = interactive()) wisca(x, antibiotics = where(is.sir), mo_transform = "shortname", ab_transform = "name", syndromic_group = NULL, add_total_n = FALSE, - only_all_tested = FALSE, digits = 0, - formatting_type = getOption("AMR_antibiogram_formatting_type", 18), + only_all_tested = FALSE, digits = 1, + formatting_type = getOption("AMR_antibiogram_formatting_type", 14), col_mo = NULL, language = get_AMR_locale(), minimum = 30, combine_SI = TRUE, sep = " + ", simulations = 1000, info = interactive()) +retrieve_wisca_parameters(wisca_model, ...) + \method{plot}{antibiogram}(x, ...) \method{autoplot}{antibiogram}(object, ...) @@ -1666,9 +1670,9 @@ wisca(x, antibiotics = where(is.sir), mo_transform = "shortname", \arguments{ \item{x}{a \link{data.frame} containing at least a column with microorganisms and columns with antimicrobial results (class 'sir', see \code{\link[=as.sir]{as.sir()}})} -\item{antibiotics}{vector of any antimicrobial name or code (will be evaluated with \code{\link[=as.ab]{as.ab()}}, column name of \code{x}, or (any combinations of) \link[=antimicrobial_class_selectors]{antimicrobial selectors} such as \code{\link[=aminoglycosides]{aminoglycosides()}} or \code{\link[=carbapenems]{carbapenems()}}. For combination antibiograms, this can also be set to values separated with \code{"+"}, such as "TZP+TOB" or "cipro + genta", given that columns resembling such antimicrobials exist in \code{x}. See \emph{Examples}.} +\item{antibiotics}{vector of any antimicrobial name or code (will be evaluated with \code{\link[=as.ab]{as.ab()}}, column name of \code{x}, or (any combinations of) \link[=antimicrobial_class_selectors]{antimicrobial selectors} such as \code{\link[=aminoglycosides]{aminoglycosides()}} or \code{\link[=carbapenems]{carbapenems()}}. For combination antibiograms, this can also be set to values separated with \code{"+"}, such as \code{"TZP+TOB"} or \code{"cipro + genta"}, given that columns resembling such antimicrobials exist in \code{x}. See \emph{Examples}.} -\item{mo_transform}{a character to transform microorganism input - must be \code{"name"}, \code{"shortname"} (default), \code{"gramstain"}, or one of the column names of the \link{microorganisms} data set: "mo", "fullname", "status", "kingdom", "phylum", "class", "order", "family", "genus", "species", "subspecies", "rank", "ref", "oxygen_tolerance", "source", "lpsn", "lpsn_parent", "lpsn_renamed_to", "mycobank", "mycobank_parent", "mycobank_renamed_to", "gbif", "gbif_parent", "gbif_renamed_to", "prevalence", or "snomed". Can also be \code{NULL} to not transform the input.} +\item{mo_transform}{a character to transform microorganism input - must be \code{"name"}, \code{"shortname"} (default), \code{"gramstain"}, or one of the column names of the \link{microorganisms} data set: "mo", "fullname", "status", "kingdom", "phylum", "class", "order", "family", "genus", "species", "subspecies", "rank", "ref", "oxygen_tolerance", "source", "lpsn", "lpsn_parent", "lpsn_renamed_to", "mycobank", "mycobank_parent", "mycobank_renamed_to", "gbif", "gbif_parent", "gbif_renamed_to", "prevalence", or "snomed". Can also be \code{NULL} to not transform the input or \code{NA} to consider all microorganisms 'unknown'.} \item{ab_transform}{a character to transform antimicrobial input - must be one of the column names of the \link{antibiotics} data set (defaults to \code{"name"}): "ab", "cid", "name", "group", "atc", "atc_group1", "atc_group2", "abbreviations", "synonyms", "oral_ddd", "oral_units", "iv_ddd", "iv_units", or "loinc". Can also be \code{NULL} to not transform the input.} @@ -1678,7 +1682,7 @@ wisca(x, antibiotics = where(is.sir), mo_transform = "shortname", \item{only_all_tested}{(for combination antibiograms): a \link{logical} to indicate that isolates must be tested for all antimicrobials, see \emph{Details}} -\item{digits}{number of digits to use for rounding the susceptibility percentage} +\item{digits}{number of digits to use for rounding the antimicrobial coverage, defaults to 1 for WISCA and 0 otherwise} \item{formatting_type}{numeric value (1–22 for WISCA, 1-12 for non-WISCA) indicating how the 'cells' of the antibiogram table should be formatted. See \emph{Details} > \emph{Formatting Type} for a list of options.} @@ -1692,9 +1696,9 @@ wisca(x, antibiotics = where(is.sir), mo_transform = "shortname", \item{sep}{a separating character for antimicrobial columns in combination antibiograms} -\item{wisca}{a \link{logical} to indicate whether a Weighted-Incidence Syndromic Combination Antibiogram (WISCA) must be generated (default is \code{FALSE}). This will use a Bayesian hierarchical model to estimate regimen coverage probabilities using Montecarlo simulations. Set \code{simulations} to adjust.} +\item{wisca}{a \link{logical} to indicate whether a Weighted-Incidence Syndromic Combination Antibiogram (WISCA) must be generated (default is \code{FALSE}). This will use a Bayesian decision model to estimate regimen coverage probabilities using \href{https://en.wikipedia.org/wiki/Monte_Carlo_method}{Monte Carlo simulations}. Set \code{simulations} to adjust.} -\item{simulations}{(for WISCA) a numerical value to set the number of Montecarlo simulations} +\item{simulations}{(for WISCA) a numerical value to set the number of Monte Carlo simulations} \item{conf_interval}{(for WISCA) a numerical value to set confidence interval (default is \code{0.95})} @@ -1702,6 +1706,8 @@ wisca(x, antibiotics = where(is.sir), mo_transform = "shortname", \item{info}{a \link{logical} to indicate info should be printed - the default is \code{TRUE} only in interactive mode} +\item{wisca_model}{the outcome of \code{\link[=wisca]{wisca()}} or \link{antibiogram(..., wisca = TRUE)}} + \item{...}{when used in \link[knitr:kable]{R Markdown or Quarto}: arguments passed on to \code{\link[knitr:kable]{knitr::kable()}} (otherwise, has no use)} \item{object}{an \code{\link[=antibiogram]{antibiogram()}} object} @@ -1725,7 +1731,7 @@ For estimating antimicrobial coverage, especially when creating a WISCA, the out The numeric values of an antibiogram are stored in a long format as the \link[=attributes]{attribute} \code{long_numeric}. You can retrieve them using \code{attributes(x)$long_numeric}, where \code{x} is the outcome of \code{\link[=antibiogram]{antibiogram()}} or \code{\link[=wisca]{wisca()}}. This is ideal for e.g. advanced plotting. \subsection{Formatting Type}{ -The formatting of the 'cells' of the table can be set with the argument \code{formatting_type}. In these examples, \code{5} is the susceptibility percentage (for WISCA: \code{4-6} indicates the confidence level), \code{15} the numerator, and \code{300} the denominator: +The formatting of the 'cells' of the table can be set with the argument \code{formatting_type}. In these examples, \code{5} is the antimicrobial coverage (for WISCA: \code{4-6} indicates the confidence level), \code{15} the numerator, and \code{300} the denominator: \enumerate{ \item 5 \item 15 @@ -1742,18 +1748,18 @@ The formatting of the 'cells' of the table can be set with the argument \code{fo Additional options for WISCA (using \code{antibiogram(..., wisca = TRUE)} or \code{wisca()}): \item 5 (4-6) -\item 5\% (4-6\%) +\item 5\% (4-6\%) - \strong{default for WISCA} \item 5 (4-6,300) \item 5\% (4-6\%,300) \item 5 (4-6,N=300) -\item 5\% (4-6\%,N=300) - \strong{default for WISCA} +\item 5\% (4-6\%,N=300) \item 5 (4-6,15/300) \item 5\% (4-6\%,15/300) \item 5 (4-6,N=15/300) \item 5\% (4-6\%,N=15/300) } -The default is \code{18} for WISCA and \code{10} for non-WISCA, which can be set globally with the package option \code{\link[=AMR-options]{AMR_antibiogram_formatting_type}}, e.g. \code{options(AMR_antibiogram_formatting_type = 5)}. +The default is \code{14} for WISCA and \code{10} for non-WISCA, which can be set globally with the package option \code{\link[=AMR-options]{AMR_antibiogram_formatting_type}}, e.g. \code{options(AMR_antibiogram_formatting_type = 5)}. Do note that for WISCA, the numerator and denominator are less useful to report, since these are included in the Bayesian model and apparent from the susceptibility and its confidence level. Set \code{digits} (defaults to \code{0}) to alter the rounding of the susceptibility percentages. } @@ -1762,7 +1768,7 @@ Set \code{digits} (defaults to \code{0}) to alter the rounding of the susceptibi There are various antibiogram types, as summarised by Klinker \emph{et al.} (2021, \doi{10.1177/20499361211011373}), and they are all supported by \code{\link[=antibiogram]{antibiogram()}}. -\strong{Use WISCA whenever possible}, since it provides more precise coverage estimates by accounting for pathogen incidence and antimicrobial susceptibility, as has been shown by Bielicki \emph{et al.} (2020, \doi{10.1001.jamanetworkopen.2019.21124}). See the section \emph{Why Use WISCA?} on this page. +\strong{Use WISCA whenever possible}, since it provides more precise coverage estimates by accounting for pathogen incidence and antimicrobial susceptibility, as has been shown by Bielicki \emph{et al.} (2020, \doi{10.1001.jamanetworkopen.2019.21124}). See the section \emph{Explaining WISCA} on this page. \enumerate{ \item \strong{Traditional Antibiogram} @@ -1794,7 +1800,7 @@ Code example: }\if{html}{\out{}} \item \strong{Weighted-Incidence Syndromic Combination Antibiogram (WISCA)} -WISCA can be applied to any antibiogram, see the section \emph{Why Use WISCA?} on this page for more information. +WISCA can be applied to any antibiogram, see the section \emph{Explaining WISCA} on this page for more information. Code example: @@ -1809,36 +1815,88 @@ wisca(your_data, WISCA uses a sophisticated Bayesian decision model to combine both local and pooled antimicrobial resistance data. This approach not only evaluates local patterns but can also draw on multi-centre datasets to improve regimen accuracy, even in low-incidence infections like paediatric bloodstream infections (BSIs). } +} -Grouped \link[tibble:tibble]{tibbles} can also be used to calculate susceptibilities over various groups. +\subsection{Grouped tibbles}{ + +For any type of antibiogram, grouped \link[tibble:tibble]{tibbles} can also be used to calculate susceptibilities over various groups. Code example: -\if{html}{\out{
}}\preformatted{your_data \%>\% +\if{html}{\out{
}}\preformatted{library(dplyr) +your_data \%>\% group_by(has_sepsis, is_neonate, sex) \%>\% wisca(antibiotics = c("TZP", "TZP+TOB", "TZP+GEN")) }\if{html}{\out{
}} } -\subsection{Inclusion in Combination Antibiogram and Syndromic Antibiogram}{ +\subsection{Stepped Approach for Clinical Insight}{ -Note that for types 2 and 3 (Combination Antibiogram and Syndromic Antibiogram), it is important to realise that susceptibility can be calculated in two ways, which can be set with the \code{only_all_tested} argument (default is \code{FALSE}). See this example for two antimicrobials, Drug A and Drug B, about how \code{\link[=antibiogram]{antibiogram()}} works to calculate the \%SI: +In clinical practice, antimicrobial coverage decisions evolve as more microbiological data becomes available. This theoretical stepped approach ensures empirical coverage can continuously assessed to improve patient outcomes: +\enumerate{ +\item \strong{Initial Empirical Therapy (Admission / Pre-Culture Data)} + +At admission, no pathogen information is available. +\itemize{ +\item Action: broad-spectrum coverage is based on local resistance patterns and syndromic antibiograms. +\item Code example: + +\if{html}{\out{
}}\preformatted{antibiogram(your_data, + antibiotics = selected_regimens, + wisca = TRUE, + mo_transform = NA) # all pathogens set to `NA` +}\if{html}{\out{
}} +} +\item \strong{Refinement with Gram Stain Results} + +When a blood culture becomes positive, the Gram stain provides an initial and crucial first stratification (Gram-positive vs. Gram-negative). +\itemize{ +\item Action: narrow coverage based on Gram stain-specific resistance patterns. +\item Code example: + +\if{html}{\out{
}}\preformatted{antibiogram(your_data, + antibiotics = selected_regimens, + wisca = TRUE, + mo_transform = "gramstain") # all pathogens set to Gram-pos/Gram-neg +}\if{html}{\out{
}} +} +\item \strong{Definitive Therapy Based on Species Identification} + +After cultivation of the pathogen, full pathogen identification allows precise targeting of therapy. +\itemize{ +\item Action: adjust treatment to pathogen-specific antibiograms, minimizing resistance risks. +\item Code example: + +\if{html}{\out{
}}\preformatted{antibiogram(your_data, + antibiotics = selected_regimens, + wisca = TRUE, + mo_transform = "shortname") # all pathogens set to 'G. species', e.g., E. coli +}\if{html}{\out{
}} +} +} + +By structuring antibiograms around this stepped approach, clinicians can make data-driven adjustments at each stage, ensuring optimal empirical and targeted therapy while reducing unnecessary broad-spectrum antimicrobial use. +} + +\subsection{Inclusion in Combination Antibiograms}{ + +Note that for combination antibiograms, it is important to realise that susceptibility can be calculated in two ways, which can be set with the \code{only_all_tested} argument (default is \code{FALSE}). See this example for two antimicrobials, Drug A and Drug B, about how \code{\link[=antibiogram]{antibiogram()}} works to calculate the \%SI: \if{html}{\out{
}}\preformatted{-------------------------------------------------------------------- only_all_tested = FALSE only_all_tested = TRUE ----------------------- ----------------------- - Drug A Drug B include as include as include as include as - numerator denominator numerator denominator --------- -------- ---------- ----------- ---------- ----------- - S or I S or I X X X X - R S or I X X X X - S or I X X - - - S or I R X X X X - R R - X - X - R - - - - - S or I X X - - - R - - - - - - - - - + Drug A Drug B considered considered considered considered + susceptible tested susceptible tested +-------- -------- ----------- ---------- ----------- ---------- + S or I S or I X X X X + R S or I X X X X + S or I X X - - + S or I R X X X X + R R - X - X + R - - - - + S or I X X - - + R - - - - + - - - - -------------------------------------------------------------------- }\if{html}{\out{
}} } @@ -1852,7 +1910,7 @@ The outcome of \code{\link[=antibiogram]{antibiogram()}} can also be used direct You can also use functions from specific 'table reporting' packages to transform the output of \code{\link[=antibiogram]{antibiogram()}} to your needs, e.g. with \code{flextable::as_flextable()} or \code{gt::gt()}. } } -\section{Why Use WISCA?}{ +\section{Explaining WISCA}{ WISCA, as outlined by Bielicki \emph{et al.} (\doi{10.1093/jac/dkv397}), stands for Weighted-Incidence Syndromic Combination Antibiogram, which estimates the probability of adequate empirical antimicrobial regimen coverage for specific infection syndromes. This method leverages a Bayesian hierarchical logistic regression framework with random effects for pathogens and regimens, enabling robust estimates in the presence of sparse data. @@ -3082,7 +3140,7 @@ This is based on: \item Vincent, R \emph{et al} (2013). \strong{MycoBank gearing up for new horizons.} IMA Fungus, 4(2), 371-9; \doi{10.5598/imafungus.2013.04.02.16}. Accessed from \url{https://www.mycobank.org} on June 24th, 2024. \item GBIF Secretariat (2023). GBIF Backbone Taxonomy. Checklist dataset \doi{10.15468/39omei}. Accessed from \url{https://www.gbif.org} on June 24th, 2024. \item Reimer, LC \emph{et al.} (2022). \strong{\emph{BacDive} in 2022: the knowledge base for standardized bacterial and archaeal data.} Nucleic Acids Res., 50(D1):D741-D74; \doi{10.1093/nar/gkab961}. Accessed from \url{https://bacdive.dsmz.de} on July 16th, 2024. -\item Public Health Information Network Vocabulary Access and Distribution System (PHIN VADS). US Edition of SNOMED CT from 1 September 2020. Value Set Name 'Microorganism', OID 2.16.840.1.114222.4.11.1009 (v12). URL: \url{https://phinvads.cdc.gov} +\item Public Health Information Network Vocabulary Access and Distribution System (PHIN VADS). US Edition of SNOMED CT from 1 September 2020. Value Set Name 'Microorganism', OID 2.16.840.1.114222.4.11.1009 (v12). URL: \url{https://www.cdc.gov/phin/php/phinvads} \item Bartlett A \emph{et al.} (2022). \strong{A comprehensive list of bacterial pathogens infecting humans} \emph{Microbiology} 168:001269; \doi{10.1099/mic.0.001269} } } @@ -4155,18 +4213,18 @@ When using more than one variable for \code{...} (= combination therapy), use \c \if{html}{\out{
}}\preformatted{-------------------------------------------------------------------- only_all_tested = FALSE only_all_tested = TRUE ----------------------- ----------------------- - Drug A Drug B include as include as include as include as - numerator denominator numerator denominator --------- -------- ---------- ----------- ---------- ----------- - S or I S or I X X X X - R S or I X X X X - S or I X X - - - S or I R X X X X - R R - X - X - R - - - - - S or I X X - - - R - - - - - - - - - + Drug A Drug B considered considered considered considered + susceptible tested susceptible tested +-------- -------- ----------- ---------- ----------- ---------- + S or I S or I X X X X + R S or I X X X X + S or I X X - - + S or I R X X X X + R R - X - X + R - - - - + S or I X X - - + R - - - - + - - - - -------------------------------------------------------------------- }\if{html}{\out{
}} @@ -6441,7 +6499,7 @@ Furthermore, these sources were used for additional details: \item BacDive:\cr\cr Reimer, LC \emph{et al.} (2022). \strong{\emph{BacDive} in 2022: the knowledge base for standardized bacterial and archaeal data.} Nucleic Acids Res., 50(D1):D741-D74; \doi{10.1093/nar/gkab961}. Accessed from \url{https://bacdive.dsmz.de} on July 16th, 2024. \item Systematized Nomenclature of Medicine - Clinical Terms (SNOMED-CT):\cr\cr -Public Health Information Network Vocabulary Access and Distribution System (PHIN VADS). US Edition of SNOMED CT from 1 September 2020. Value Set Name 'Microorganism', OID 2.16.840.1.114222.4.11.1009 (v12). Accessed from \url{https://phinvads.cdc.gov} on July 16th, 2024. +Public Health Information Network Vocabulary Access and Distribution System (PHIN VADS). US Edition of SNOMED CT from 1 September 2020. Value Set Name 'Microorganism', OID 2.16.840.1.114222.4.11.1009 (v12). Accessed from \url{https://www.cdc.gov/phin/php/phinvads} on July 16th, 2024. \item Grimont \emph{et al.} (2007). Antigenic Formulae of the Salmonella Serovars, 9th Edition. WHO Collaborating Centre for Reference and Research on \emph{Salmonella} (WHOCC-SALM). \item Bartlett \emph{et al.} (2022). \strong{A comprehensive list of bacterial pathogens infecting humans} \emph{Microbiology} 168:001269; \doi{10.1099/mic.0.001269} } @@ -6897,7 +6955,7 @@ This function uses \code{\link[=as.mo]{as.mo()}} internally, which uses an advan \item Vincent, R \emph{et al} (2013). \strong{MycoBank gearing up for new horizons.} IMA Fungus, 4(2), 371-9; \doi{10.5598/imafungus.2013.04.02.16}. Accessed from \url{https://www.mycobank.org} on June 24th, 2024. \item GBIF Secretariat (2023). GBIF Backbone Taxonomy. Checklist dataset \doi{10.15468/39omei}. Accessed from \url{https://www.gbif.org} on June 24th, 2024. \item Reimer, LC \emph{et al.} (2022). \strong{\emph{BacDive} in 2022: the knowledge base for standardized bacterial and archaeal data.} Nucleic Acids Res., 50(D1):D741-D74; \doi{10.1093/nar/gkab961}. Accessed from \url{https://bacdive.dsmz.de} on July 16th, 2024. -\item Public Health Information Network Vocabulary Access and Distribution System (PHIN VADS). US Edition of SNOMED CT from 1 September 2020. Value Set Name 'Microorganism', OID 2.16.840.1.114222.4.11.1009 (v12). URL: \url{https://phinvads.cdc.gov} +\item Public Health Information Network Vocabulary Access and Distribution System (PHIN VADS). US Edition of SNOMED CT from 1 September 2020. Value Set Name 'Microorganism', OID 2.16.840.1.114222.4.11.1009 (v12). URL: \url{https://www.cdc.gov/phin/php/phinvads} \item Bartlett A \emph{et al.} (2022). \strong{A comprehensive list of bacterial pathogens infecting humans} \emph{Microbiology} 168:001269; \doi{10.1099/mic.0.001269} } } @@ -7603,6 +7661,8 @@ These functions can be used to calculate the (co-)resistance or susceptibility o \code{\link[=resistance]{resistance()}} should be used to calculate resistance, \code{\link[=susceptibility]{susceptibility()}} should be used to calculate susceptibility.\cr } \details{ +For a more automated and comprehensive analysis, consider using \code{\link[=antibiogram]{antibiogram()}} or \code{\link[=wisca]{wisca()}}, which streamline many aspects of susceptibility reporting and, importantly, also support WISCA. The functions described here offer a more hands-on, manual approach for greater customisation. + \strong{Remember that you should filter your data to let it contain only first isolates!} This is needed to exclude duplicates and to reduce selection bias. Use \code{\link[=first_isolate]{first_isolate()}} to determine them in your data set with one of the four available algorithms. The function \code{\link[=resistance]{resistance()}} is equal to the function \code{\link[=proportion_R]{proportion_R()}}. The function \code{\link[=susceptibility]{susceptibility()}} is equal to the function \code{\link[=proportion_SI]{proportion_SI()}}. Since AMR v3.0, \code{\link[=proportion_SI]{proportion_SI()}} and \code{\link[=proportion_I]{proportion_I()}} include dose-dependent susceptibility ('SDD'). @@ -7620,18 +7680,18 @@ When using more than one variable for \code{...} (= combination therapy), use \c \if{html}{\out{
}}\preformatted{-------------------------------------------------------------------- only_all_tested = FALSE only_all_tested = TRUE ----------------------- ----------------------- - Drug A Drug B include as include as include as include as - numerator denominator numerator denominator --------- -------- ---------- ----------- ---------- ----------- - S or I S or I X X X X - R S or I X X X X - S or I X X - - - S or I R X X X X - R R - X - X - R - - - - - S or I X X - - - R - - - - - - - - - + Drug A Drug B considered considered considered considered + susceptible tested susceptible tested +-------- -------- ----------- ---------- ----------- ---------- + S or I S or I X X X X + R S or I X X X X + S or I X X - - + S or I R X X X X + R R - X - X + R - - - - + S or I X X - - + R - - - - + - - - - -------------------------------------------------------------------- }\if{html}{\out{
}} diff --git a/man/antibiogram.Rd b/man/antibiogram.Rd index 8cfa0b357..463d8da99 100644 --- a/man/antibiogram.Rd +++ b/man/antibiogram.Rd @@ -3,6 +3,7 @@ \name{antibiogram} \alias{antibiogram} \alias{wisca} +\alias{retrieve_wisca_parameters} \alias{plot.antibiogram} \alias{autoplot.antibiogram} \alias{knit_print.antibiogram} @@ -19,21 +20,23 @@ \usage{ antibiogram(x, antibiotics = where(is.sir), mo_transform = "shortname", ab_transform = "name", syndromic_group = NULL, add_total_n = FALSE, - only_all_tested = FALSE, digits = 0, + only_all_tested = FALSE, digits = ifelse(wisca, 1, 0), formatting_type = getOption("AMR_antibiogram_formatting_type", - ifelse(wisca, 18, 10)), col_mo = NULL, language = get_AMR_locale(), + ifelse(wisca, 14, 10)), col_mo = NULL, language = get_AMR_locale(), minimum = 30, combine_SI = TRUE, sep = " + ", wisca = FALSE, simulations = 1000, conf_interval = 0.95, interval_side = "two-tailed", info = interactive()) wisca(x, antibiotics = where(is.sir), mo_transform = "shortname", ab_transform = "name", syndromic_group = NULL, add_total_n = FALSE, - only_all_tested = FALSE, digits = 0, - formatting_type = getOption("AMR_antibiogram_formatting_type", 18), + only_all_tested = FALSE, digits = 1, + formatting_type = getOption("AMR_antibiogram_formatting_type", 14), col_mo = NULL, language = get_AMR_locale(), minimum = 30, combine_SI = TRUE, sep = " + ", simulations = 1000, info = interactive()) +retrieve_wisca_parameters(wisca_model, ...) + \method{plot}{antibiogram}(x, ...) \method{autoplot}{antibiogram}(object, ...) @@ -44,9 +47,9 @@ wisca(x, antibiotics = where(is.sir), mo_transform = "shortname", \arguments{ \item{x}{a \link{data.frame} containing at least a column with microorganisms and columns with antimicrobial results (class 'sir', see \code{\link[=as.sir]{as.sir()}})} -\item{antibiotics}{vector of any antimicrobial name or code (will be evaluated with \code{\link[=as.ab]{as.ab()}}, column name of \code{x}, or (any combinations of) \link[=antimicrobial_class_selectors]{antimicrobial selectors} such as \code{\link[=aminoglycosides]{aminoglycosides()}} or \code{\link[=carbapenems]{carbapenems()}}. For combination antibiograms, this can also be set to values separated with \code{"+"}, such as "TZP+TOB" or "cipro + genta", given that columns resembling such antimicrobials exist in \code{x}. See \emph{Examples}.} +\item{antibiotics}{vector of any antimicrobial name or code (will be evaluated with \code{\link[=as.ab]{as.ab()}}, column name of \code{x}, or (any combinations of) \link[=antimicrobial_class_selectors]{antimicrobial selectors} such as \code{\link[=aminoglycosides]{aminoglycosides()}} or \code{\link[=carbapenems]{carbapenems()}}. For combination antibiograms, this can also be set to values separated with \code{"+"}, such as \code{"TZP+TOB"} or \code{"cipro + genta"}, given that columns resembling such antimicrobials exist in \code{x}. See \emph{Examples}.} -\item{mo_transform}{a character to transform microorganism input - must be \code{"name"}, \code{"shortname"} (default), \code{"gramstain"}, or one of the column names of the \link{microorganisms} data set: "mo", "fullname", "status", "kingdom", "phylum", "class", "order", "family", "genus", "species", "subspecies", "rank", "ref", "oxygen_tolerance", "source", "lpsn", "lpsn_parent", "lpsn_renamed_to", "mycobank", "mycobank_parent", "mycobank_renamed_to", "gbif", "gbif_parent", "gbif_renamed_to", "prevalence", or "snomed". Can also be \code{NULL} to not transform the input.} +\item{mo_transform}{a character to transform microorganism input - must be \code{"name"}, \code{"shortname"} (default), \code{"gramstain"}, or one of the column names of the \link{microorganisms} data set: "mo", "fullname", "status", "kingdom", "phylum", "class", "order", "family", "genus", "species", "subspecies", "rank", "ref", "oxygen_tolerance", "source", "lpsn", "lpsn_parent", "lpsn_renamed_to", "mycobank", "mycobank_parent", "mycobank_renamed_to", "gbif", "gbif_parent", "gbif_renamed_to", "prevalence", or "snomed". Can also be \code{NULL} to not transform the input or \code{NA} to consider all microorganisms 'unknown'.} \item{ab_transform}{a character to transform antimicrobial input - must be one of the column names of the \link{antibiotics} data set (defaults to \code{"name"}): "ab", "cid", "name", "group", "atc", "atc_group1", "atc_group2", "abbreviations", "synonyms", "oral_ddd", "oral_units", "iv_ddd", "iv_units", or "loinc". Can also be \code{NULL} to not transform the input.} @@ -56,7 +59,7 @@ wisca(x, antibiotics = where(is.sir), mo_transform = "shortname", \item{only_all_tested}{(for combination antibiograms): a \link{logical} to indicate that isolates must be tested for all antimicrobials, see \emph{Details}} -\item{digits}{number of digits to use for rounding the susceptibility percentage} +\item{digits}{number of digits to use for rounding the antimicrobial coverage, defaults to 1 for WISCA and 0 otherwise} \item{formatting_type}{numeric value (1–22 for WISCA, 1-12 for non-WISCA) indicating how the 'cells' of the antibiogram table should be formatted. See \emph{Details} > \emph{Formatting Type} for a list of options.} @@ -70,9 +73,9 @@ wisca(x, antibiotics = where(is.sir), mo_transform = "shortname", \item{sep}{a separating character for antimicrobial columns in combination antibiograms} -\item{wisca}{a \link{logical} to indicate whether a Weighted-Incidence Syndromic Combination Antibiogram (WISCA) must be generated (default is \code{FALSE}). This will use a Bayesian hierarchical model to estimate regimen coverage probabilities using Montecarlo simulations. Set \code{simulations} to adjust.} +\item{wisca}{a \link{logical} to indicate whether a Weighted-Incidence Syndromic Combination Antibiogram (WISCA) must be generated (default is \code{FALSE}). This will use a Bayesian decision model to estimate regimen coverage probabilities using \href{https://en.wikipedia.org/wiki/Monte_Carlo_method}{Monte Carlo simulations}. Set \code{simulations} to adjust.} -\item{simulations}{(for WISCA) a numerical value to set the number of Montecarlo simulations} +\item{simulations}{(for WISCA) a numerical value to set the number of Monte Carlo simulations} \item{conf_interval}{(for WISCA) a numerical value to set confidence interval (default is \code{0.95})} @@ -80,6 +83,8 @@ wisca(x, antibiotics = where(is.sir), mo_transform = "shortname", \item{info}{a \link{logical} to indicate info should be printed - the default is \code{TRUE} only in interactive mode} +\item{wisca_model}{the outcome of \code{\link[=wisca]{wisca()}} or \link{antibiogram(..., wisca = TRUE)}} + \item{...}{when used in \link[knitr:kable]{R Markdown or Quarto}: arguments passed on to \code{\link[knitr:kable]{knitr::kable()}} (otherwise, has no use)} \item{object}{an \code{\link[=antibiogram]{antibiogram()}} object} @@ -103,7 +108,7 @@ For estimating antimicrobial coverage, especially when creating a WISCA, the out The numeric values of an antibiogram are stored in a long format as the \link[=attributes]{attribute} \code{long_numeric}. You can retrieve them using \code{attributes(x)$long_numeric}, where \code{x} is the outcome of \code{\link[=antibiogram]{antibiogram()}} or \code{\link[=wisca]{wisca()}}. This is ideal for e.g. advanced plotting. \subsection{Formatting Type}{ -The formatting of the 'cells' of the table can be set with the argument \code{formatting_type}. In these examples, \code{5} is the susceptibility percentage (for WISCA: \code{4-6} indicates the confidence level), \code{15} the numerator, and \code{300} the denominator: +The formatting of the 'cells' of the table can be set with the argument \code{formatting_type}. In these examples, \code{5} is the antimicrobial coverage (for WISCA: \code{4-6} indicates the confidence level), \code{15} the numerator, and \code{300} the denominator: \enumerate{ \item 5 \item 15 @@ -120,18 +125,18 @@ The formatting of the 'cells' of the table can be set with the argument \code{fo Additional options for WISCA (using \code{antibiogram(..., wisca = TRUE)} or \code{wisca()}): \item 5 (4-6) -\item 5\% (4-6\%) +\item 5\% (4-6\%) - \strong{default for WISCA} \item 5 (4-6,300) \item 5\% (4-6\%,300) \item 5 (4-6,N=300) -\item 5\% (4-6\%,N=300) - \strong{default for WISCA} +\item 5\% (4-6\%,N=300) \item 5 (4-6,15/300) \item 5\% (4-6\%,15/300) \item 5 (4-6,N=15/300) \item 5\% (4-6\%,N=15/300) } -The default is \code{18} for WISCA and \code{10} for non-WISCA, which can be set globally with the package option \code{\link[=AMR-options]{AMR_antibiogram_formatting_type}}, e.g. \code{options(AMR_antibiogram_formatting_type = 5)}. +The default is \code{14} for WISCA and \code{10} for non-WISCA, which can be set globally with the package option \code{\link[=AMR-options]{AMR_antibiogram_formatting_type}}, e.g. \code{options(AMR_antibiogram_formatting_type = 5)}. Do note that for WISCA, the numerator and denominator are less useful to report, since these are included in the Bayesian model and apparent from the susceptibility and its confidence level. Set \code{digits} (defaults to \code{0}) to alter the rounding of the susceptibility percentages. } @@ -140,7 +145,7 @@ Set \code{digits} (defaults to \code{0}) to alter the rounding of the susceptibi There are various antibiogram types, as summarised by Klinker \emph{et al.} (2021, \doi{10.1177/20499361211011373}), and they are all supported by \code{\link[=antibiogram]{antibiogram()}}. -\strong{Use WISCA whenever possible}, since it provides more precise coverage estimates by accounting for pathogen incidence and antimicrobial susceptibility, as has been shown by Bielicki \emph{et al.} (2020, \doi{10.1001.jamanetworkopen.2019.21124}). See the section \emph{Why Use WISCA?} on this page. +\strong{Use WISCA whenever possible}, since it provides more precise coverage estimates by accounting for pathogen incidence and antimicrobial susceptibility, as has been shown by Bielicki \emph{et al.} (2020, \doi{10.1001.jamanetworkopen.2019.21124}). See the section \emph{Explaining WISCA} on this page. \enumerate{ \item \strong{Traditional Antibiogram} @@ -172,7 +177,7 @@ Code example: }\if{html}{\out{
}} \item \strong{Weighted-Incidence Syndromic Combination Antibiogram (WISCA)} -WISCA can be applied to any antibiogram, see the section \emph{Why Use WISCA?} on this page for more information. +WISCA can be applied to any antibiogram, see the section \emph{Explaining WISCA} on this page for more information. Code example: @@ -187,36 +192,88 @@ wisca(your_data, WISCA uses a sophisticated Bayesian decision model to combine both local and pooled antimicrobial resistance data. This approach not only evaluates local patterns but can also draw on multi-centre datasets to improve regimen accuracy, even in low-incidence infections like paediatric bloodstream infections (BSIs). } +} -Grouped \link[tibble:tibble]{tibbles} can also be used to calculate susceptibilities over various groups. +\subsection{Grouped tibbles}{ + +For any type of antibiogram, grouped \link[tibble:tibble]{tibbles} can also be used to calculate susceptibilities over various groups. Code example: -\if{html}{\out{
}}\preformatted{your_data \%>\% +\if{html}{\out{
}}\preformatted{library(dplyr) +your_data \%>\% group_by(has_sepsis, is_neonate, sex) \%>\% wisca(antibiotics = c("TZP", "TZP+TOB", "TZP+GEN")) }\if{html}{\out{
}} } -\subsection{Inclusion in Combination Antibiogram and Syndromic Antibiogram}{ +\subsection{Stepped Approach for Clinical Insight}{ -Note that for types 2 and 3 (Combination Antibiogram and Syndromic Antibiogram), it is important to realise that susceptibility can be calculated in two ways, which can be set with the \code{only_all_tested} argument (default is \code{FALSE}). See this example for two antimicrobials, Drug A and Drug B, about how \code{\link[=antibiogram]{antibiogram()}} works to calculate the \%SI: +In clinical practice, antimicrobial coverage decisions evolve as more microbiological data becomes available. This theoretical stepped approach ensures empirical coverage can continuously assessed to improve patient outcomes: +\enumerate{ +\item \strong{Initial Empirical Therapy (Admission / Pre-Culture Data)} + +At admission, no pathogen information is available. +\itemize{ +\item Action: broad-spectrum coverage is based on local resistance patterns and syndromic antibiograms. +\item Code example: + +\if{html}{\out{
}}\preformatted{antibiogram(your_data, + antibiotics = selected_regimens, + wisca = TRUE, + mo_transform = NA) # all pathogens set to `NA` +}\if{html}{\out{
}} +} +\item \strong{Refinement with Gram Stain Results} + +When a blood culture becomes positive, the Gram stain provides an initial and crucial first stratification (Gram-positive vs. Gram-negative). +\itemize{ +\item Action: narrow coverage based on Gram stain-specific resistance patterns. +\item Code example: + +\if{html}{\out{
}}\preformatted{antibiogram(your_data, + antibiotics = selected_regimens, + wisca = TRUE, + mo_transform = "gramstain") # all pathogens set to Gram-pos/Gram-neg +}\if{html}{\out{
}} +} +\item \strong{Definitive Therapy Based on Species Identification} + +After cultivation of the pathogen, full pathogen identification allows precise targeting of therapy. +\itemize{ +\item Action: adjust treatment to pathogen-specific antibiograms, minimizing resistance risks. +\item Code example: + +\if{html}{\out{
}}\preformatted{antibiogram(your_data, + antibiotics = selected_regimens, + wisca = TRUE, + mo_transform = "shortname") # all pathogens set to 'G. species', e.g., E. coli +}\if{html}{\out{
}} +} +} + +By structuring antibiograms around this stepped approach, clinicians can make data-driven adjustments at each stage, ensuring optimal empirical and targeted therapy while reducing unnecessary broad-spectrum antimicrobial use. +} + +\subsection{Inclusion in Combination Antibiograms}{ + +Note that for combination antibiograms, it is important to realise that susceptibility can be calculated in two ways, which can be set with the \code{only_all_tested} argument (default is \code{FALSE}). See this example for two antimicrobials, Drug A and Drug B, about how \code{\link[=antibiogram]{antibiogram()}} works to calculate the \%SI: \if{html}{\out{
}}\preformatted{-------------------------------------------------------------------- only_all_tested = FALSE only_all_tested = TRUE ----------------------- ----------------------- - Drug A Drug B include as include as include as include as - numerator denominator numerator denominator --------- -------- ---------- ----------- ---------- ----------- - S or I S or I X X X X - R S or I X X X X - S or I X X - - - S or I R X X X X - R R - X - X - R - - - - - S or I X X - - - R - - - - - - - - - + Drug A Drug B considered considered considered considered + susceptible tested susceptible tested +-------- -------- ----------- ---------- ----------- ---------- + S or I S or I X X X X + R S or I X X X X + S or I X X - - + S or I R X X X X + R R - X - X + R - - - - + S or I X X - - + R - - - - + - - - - -------------------------------------------------------------------- }\if{html}{\out{
}} } @@ -230,7 +287,7 @@ The outcome of \code{\link[=antibiogram]{antibiogram()}} can also be used direct You can also use functions from specific 'table reporting' packages to transform the output of \code{\link[=antibiogram]{antibiogram()}} to your needs, e.g. with \code{flextable::as_flextable()} or \code{gt::gt()}. } } -\section{Why Use WISCA?}{ +\section{Explaining WISCA}{ WISCA, as outlined by Bielicki \emph{et al.} (\doi{10.1093/jac/dkv397}), stands for Weighted-Incidence Syndromic Combination Antibiogram, which estimates the probability of adequate empirical antimicrobial regimen coverage for specific infection syndromes. This method leverages a Bayesian hierarchical logistic regression framework with random effects for pathogens and regimens, enabling robust estimates in the presence of sparse data. diff --git a/man/as.mo.Rd b/man/as.mo.Rd index 988e733f1..2dd3b28fc 100644 --- a/man/as.mo.Rd +++ b/man/as.mo.Rd @@ -160,7 +160,7 @@ This is based on: \item Vincent, R \emph{et al} (2013). \strong{MycoBank gearing up for new horizons.} IMA Fungus, 4(2), 371-9; \doi{10.5598/imafungus.2013.04.02.16}. Accessed from \url{https://www.mycobank.org} on June 24th, 2024. \item GBIF Secretariat (2023). GBIF Backbone Taxonomy. Checklist dataset \doi{10.15468/39omei}. Accessed from \url{https://www.gbif.org} on June 24th, 2024. \item Reimer, LC \emph{et al.} (2022). \strong{\emph{BacDive} in 2022: the knowledge base for standardized bacterial and archaeal data.} Nucleic Acids Res., 50(D1):D741-D74; \doi{10.1093/nar/gkab961}. Accessed from \url{https://bacdive.dsmz.de} on July 16th, 2024. -\item Public Health Information Network Vocabulary Access and Distribution System (PHIN VADS). US Edition of SNOMED CT from 1 September 2020. Value Set Name 'Microorganism', OID 2.16.840.1.114222.4.11.1009 (v12). URL: \url{https://phinvads.cdc.gov} +\item Public Health Information Network Vocabulary Access and Distribution System (PHIN VADS). US Edition of SNOMED CT from 1 September 2020. Value Set Name 'Microorganism', OID 2.16.840.1.114222.4.11.1009 (v12). URL: \url{https://www.cdc.gov/phin/php/phinvads} \item Bartlett A \emph{et al.} (2022). \strong{A comprehensive list of bacterial pathogens infecting humans} \emph{Microbiology} 168:001269; \doi{10.1099/mic.0.001269} } } diff --git a/man/count.Rd b/man/count.Rd index a667da7ff..1f77c99d0 100644 --- a/man/count.Rd +++ b/man/count.Rd @@ -90,18 +90,18 @@ When using more than one variable for \code{...} (= combination therapy), use \c \if{html}{\out{
}}\preformatted{-------------------------------------------------------------------- only_all_tested = FALSE only_all_tested = TRUE ----------------------- ----------------------- - Drug A Drug B include as include as include as include as - numerator denominator numerator denominator --------- -------- ---------- ----------- ---------- ----------- - S or I S or I X X X X - R S or I X X X X - S or I X X - - - S or I R X X X X - R R - X - X - R - - - - - S or I X X - - - R - - - - - - - - - + Drug A Drug B considered considered considered considered + susceptible tested susceptible tested +-------- -------- ----------- ---------- ----------- ---------- + S or I S or I X X X X + R S or I X X X X + S or I X X - - + S or I R X X X X + R R - X - X + R - - - - + S or I X X - - + R - - - - + - - - - -------------------------------------------------------------------- }\if{html}{\out{
}} diff --git a/man/microorganisms.Rd b/man/microorganisms.Rd index e44414384..5419d5ea8 100644 --- a/man/microorganisms.Rd +++ b/man/microorganisms.Rd @@ -44,7 +44,7 @@ Furthermore, these sources were used for additional details: \item BacDive:\cr\cr Reimer, LC \emph{et al.} (2022). \strong{\emph{BacDive} in 2022: the knowledge base for standardized bacterial and archaeal data.} Nucleic Acids Res., 50(D1):D741-D74; \doi{10.1093/nar/gkab961}. Accessed from \url{https://bacdive.dsmz.de} on July 16th, 2024. \item Systematized Nomenclature of Medicine - Clinical Terms (SNOMED-CT):\cr\cr -Public Health Information Network Vocabulary Access and Distribution System (PHIN VADS). US Edition of SNOMED CT from 1 September 2020. Value Set Name 'Microorganism', OID 2.16.840.1.114222.4.11.1009 (v12). Accessed from \url{https://phinvads.cdc.gov} on July 16th, 2024. +Public Health Information Network Vocabulary Access and Distribution System (PHIN VADS). US Edition of SNOMED CT from 1 September 2020. Value Set Name 'Microorganism', OID 2.16.840.1.114222.4.11.1009 (v12). Accessed from \url{https://www.cdc.gov/phin/php/phinvads} on July 16th, 2024. \item Grimont \emph{et al.} (2007). Antigenic Formulae of the Salmonella Serovars, 9th Edition. WHO Collaborating Centre for Reference and Research on \emph{Salmonella} (WHOCC-SALM). \item Bartlett \emph{et al.} (2022). \strong{A comprehensive list of bacterial pathogens infecting humans} \emph{Microbiology} 168:001269; \doi{10.1099/mic.0.001269} } diff --git a/man/mo_property.Rd b/man/mo_property.Rd index c3905eebf..4cda75d78 100644 --- a/man/mo_property.Rd +++ b/man/mo_property.Rd @@ -222,7 +222,7 @@ This function uses \code{\link[=as.mo]{as.mo()}} internally, which uses an advan \item Vincent, R \emph{et al} (2013). \strong{MycoBank gearing up for new horizons.} IMA Fungus, 4(2), 371-9; \doi{10.5598/imafungus.2013.04.02.16}. Accessed from \url{https://www.mycobank.org} on June 24th, 2024. \item GBIF Secretariat (2023). GBIF Backbone Taxonomy. Checklist dataset \doi{10.15468/39omei}. Accessed from \url{https://www.gbif.org} on June 24th, 2024. \item Reimer, LC \emph{et al.} (2022). \strong{\emph{BacDive} in 2022: the knowledge base for standardized bacterial and archaeal data.} Nucleic Acids Res., 50(D1):D741-D74; \doi{10.1093/nar/gkab961}. Accessed from \url{https://bacdive.dsmz.de} on July 16th, 2024. -\item Public Health Information Network Vocabulary Access and Distribution System (PHIN VADS). US Edition of SNOMED CT from 1 September 2020. Value Set Name 'Microorganism', OID 2.16.840.1.114222.4.11.1009 (v12). URL: \url{https://phinvads.cdc.gov} +\item Public Health Information Network Vocabulary Access and Distribution System (PHIN VADS). US Edition of SNOMED CT from 1 September 2020. Value Set Name 'Microorganism', OID 2.16.840.1.114222.4.11.1009 (v12). URL: \url{https://www.cdc.gov/phin/php/phinvads} \item Bartlett A \emph{et al.} (2022). \strong{A comprehensive list of bacterial pathogens infecting humans} \emph{Microbiology} 168:001269; \doi{10.1099/mic.0.001269} } } diff --git a/man/proportion.Rd b/man/proportion.Rd index 9428cc7dd..29d9e3c96 100644 --- a/man/proportion.Rd +++ b/man/proportion.Rd @@ -85,6 +85,8 @@ These functions can be used to calculate the (co-)resistance or susceptibility o \code{\link[=resistance]{resistance()}} should be used to calculate resistance, \code{\link[=susceptibility]{susceptibility()}} should be used to calculate susceptibility.\cr } \details{ +For a more automated and comprehensive analysis, consider using \code{\link[=antibiogram]{antibiogram()}} or \code{\link[=wisca]{wisca()}}, which streamline many aspects of susceptibility reporting and, importantly, also support WISCA. The functions described here offer a more hands-on, manual approach for greater customisation. + \strong{Remember that you should filter your data to let it contain only first isolates!} This is needed to exclude duplicates and to reduce selection bias. Use \code{\link[=first_isolate]{first_isolate()}} to determine them in your data set with one of the four available algorithms. The function \code{\link[=resistance]{resistance()}} is equal to the function \code{\link[=proportion_R]{proportion_R()}}. The function \code{\link[=susceptibility]{susceptibility()}} is equal to the function \code{\link[=proportion_SI]{proportion_SI()}}. Since AMR v3.0, \code{\link[=proportion_SI]{proportion_SI()}} and \code{\link[=proportion_I]{proportion_I()}} include dose-dependent susceptibility ('SDD'). @@ -102,18 +104,18 @@ When using more than one variable for \code{...} (= combination therapy), use \c \if{html}{\out{
}}\preformatted{-------------------------------------------------------------------- only_all_tested = FALSE only_all_tested = TRUE ----------------------- ----------------------- - Drug A Drug B include as include as include as include as - numerator denominator numerator denominator --------- -------- ---------- ----------- ---------- ----------- - S or I S or I X X X X - R S or I X X X X - S or I X X - - - S or I R X X X X - R R - X - X - R - - - - - S or I X X - - - R - - - - - - - - - + Drug A Drug B considered considered considered considered + susceptible tested susceptible tested +-------- -------- ----------- ---------- ----------- ---------- + S or I S or I X X X X + R S or I X X X X + S or I X X - - + S or I R X X X X + R R - X - X + R - - - - + S or I X X - - + R - - - - + - - - - -------------------------------------------------------------------- }\if{html}{\out{
}} diff --git a/pkgdown/extra.js b/pkgdown/extra.js index 86c7cb24f..f36e2e153 100644 --- a/pkgdown/extra.js +++ b/pkgdown/extra.js @@ -118,7 +118,7 @@ $(document).ready(function() { x = x.replace("Christian", "Dr. Christian"); x = x.replace("Corinna", "Dr. Corinna"); x = x.replace("Dennis", "Dr. Dennis"); - x = x.replace("Gwen", "Dr. Gwen"); + x = x.replace("Gwen", "Prof. Gwen"); x = x.replace("Jason", "Dr. Jason"); x = x.replace("Javier", "Prof. Javier"); x = x.replace("Jonas", "Dr. Jonas"); diff --git a/tests/testthat/test-zzz.R b/tests/testthat/test-zzz.R index 57c7b0a2b..618e8fd0e 100644 --- a/tests/testthat/test-zzz.R +++ b/tests/testthat/test-zzz.R @@ -141,7 +141,11 @@ call_functions <- c( import_functions <- c(import_functions, call_functions) -suggests <- strsplit(utils::packageDescription(pkg = ".", lib.loc = ".", fields = "Suggests"), "[,\n ]+")[[1]] +suggests <- tryCatch(strsplit(utils::packageDescription(pkg = ".", lib.loc = ".", fields = "Suggests"), "[,\n ]+")[[1]], + error = function(e) { + print(list.files()) + return(import_functions) + }) for (i in seq_len(length(import_functions))) { fn <- names(import_functions)[i] pkg <- unname(import_functions[i])