antibiogram: Generate Antibiograms (WISCA, Traditional, Combination, or...

View source: R/antibiogram.R

antibiogramR Documentation

Generate Antibiograms (WISCA, Traditional, Combination, or Syndromic)

Description

Generate antibiograms from antimicrobial susceptibility data, with support for traditional, combination, syndromic, and WISCA (Weighted-Incidence Syndromic Combination Antibiogram) methods.

For empirical therapy guidance, WISCA is the recommended approach. When initiating empirical treatment, the causative pathogen is unknown, and the clinically relevant question is: "what is the probability that this regimen will cover whatever pathogen turns out to cause the infection?" WISCA answers that question directly by weighting susceptibility by pathogen incidence within a syndrome and providing credible intervals via Bayesian Monte Carlo simulation. Traditional antibiograms remain appropriate for tracking resistance per species for surveillance purposes. See the section Explaining WISCA on this page and the WISCA vignette for details.

All antibiogram types adhere to previously described approaches (see Source), and the WISCA method implements the Bayesian decision model by Bielicki et al. (2016, \Sexpr[results=rd]{tools:::Rd_expr_doi("10.1093/jac/dkv397")}). Output formats include plots and tables, ideal for integration with R Markdown and Quarto reports.

Usage

wisca(
  x,
  antimicrobials = where(is.sir),
  ab_transform = "name",
  syndromic_group = NULL,
  only_all_tested = FALSE,
  digits = 1,
  formatting_type = getOption("AMR_antibiogram_formatting_type", 14),
  col_mo = NULL,
  language = get_AMR_locale(),
  combine_SI,
  guideline = getOption("AMR_guideline", "EUCAST"),
  sep = " + ",
  sort_columns = TRUE,
  simulations = 1000,
  conf_interval = 0.95,
  interval_side = "two-tailed",
  info = interactive(),
  parallel = FALSE,
  ...
)

antibiogram(
  x,
  antimicrobials = where(is.sir),
  mo_transform = "shortname",
  ab_transform = "name",
  syndromic_group = NULL,
  add_total_n = FALSE,
  only_all_tested = FALSE,
  digits = ifelse(wisca, 1, 0),
  formatting_type = getOption("AMR_antibiogram_formatting_type", ifelse(wisca, 14, 18)),
  col_mo = NULL,
  language = get_AMR_locale(),
  minimum = 30,
  combine_SI,
  guideline = getOption("AMR_guideline", "EUCAST"),
  sep = " + ",
  sort_columns = TRUE,
  wisca = FALSE,
  simulations = 1000,
  conf_interval = 0.95,
  interval_side = "two-tailed",
  info = interactive(),
  parallel = FALSE,
  ...
)

retrieve_wisca_parameters(wisca_model, ...)

## S3 method for class 'antibiogram'
plot(x, ...)

## S3 method for class 'antibiogram'
autoplot(
  object,
  geom = c("pointrange", "point", "col", "bar", "errorbar"),
  ci = TRUE,
  sort = TRUE,
  flip = NULL,
  caption = NULL,
  ...
)

wisca_plot(
  wisca_model,
  wisca_plot_type = c("susceptibility_incidence", "posterior_coverage"),
  ...
)

## S3 method for class 'antibiogram'
knit_print(
  x,
  italicise = TRUE,
  na = getOption("knitr.kable.NA", default = ""),
  ...
)

Arguments

x

A data.frame containing at least a column with microorganisms and columns with antimicrobial results (class 'sir', see as.sir()).

antimicrobials

A vector specifying the antimicrobials containing SIR values to include in the antibiogram (see Examples). Will be evaluated using guess_ab_col(). This can be:

  • Any antimicrobial name or code that could match (see guess_ab_col()) to any column in x

  • Any antimicrobial selector, such as aminoglycosides() or carbapenems()

  • A combination of the above, using c(), e.g.:

    • c(aminoglycosides(), "AMP", "AMC")

    • c(aminoglycosides(), carbapenems())

  • Column indices using numbers

  • Combination therapy, indicated by using "+", with or without antimicrobial selectors, e.g.:

    • "cipro + genta"

    • "TZP+TOB"

    • c("TZP", "TZP+GEN", "TZP+TOB")

    • carbapenems() + "GEN"

    • carbapenems() + c("", "GEN")

    • carbapenems() + c("", aminoglycosides())

ab_transform

A character to transform antimicrobial input - must be one of the column names of the antimicrobials data set (defaults to "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 NULL to not transform the input.

syndromic_group

A column name of x, or values calculated to split rows of x, e.g. by using ifelse() or case_when(). See Examples.

only_all_tested

(for combination antibiograms): a logical to indicate that isolates must be tested for all antimicrobials, see Details.

digits

Number of digits to use for rounding the antimicrobial coverage, defaults to 1 for WISCA and 0 otherwise.

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 Details > Formatting Type for a list of options.

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().

language

Language to translate text, which defaults to the system language (see get_AMR_locale()).

combine_SI

(deprecated in favour of guideline) A logical. If set, it takes precedence over guideline: TRUE considers S, SDD, and I susceptible, and FALSE only S.

guideline

A guideline name, "EUCAST" or "CLSI" (or any version thereof, e.g. "CLSI 2025"), to determine whether the 'I' category is considered susceptible (EUCAST) or resistant (CLSI). 'SDD' is always considered susceptible. The default is the package option AMR_guideline, or "EUCAST" if it is not set. See section Interpretation of SIR below.

sep

A separating character for antimicrobial columns in combination antibiograms.

sort_columns

A logical to indicate whether the antimicrobial columns must be sorted on name.

simulations

(for WISCA) a numerical value to set the number of Monte Carlo simulations.

conf_interval

A numerical value to set confidence interval (default is 0.95).

interval_side

The side of the confidence interval, either "two-tailed" (default), "left" or "right".

info

A logical to indicate info should be printed - the default is TRUE only in interactive mode.

parallel

A logical to indicate if parallel computing must be used, defaults to FALSE. Requires the future.apply package. For WISCA, Monte Carlo simulations are distributed across workers; for grouped antibiograms, each group is processed by a separate worker. A non-sequential future::plan() must already be active before setting parallel = TRUE – for example, future::plan(future::multisession). An error is thrown if parallel = TRUE is used without a plan set by the user.

...

Currently unused.

mo_transform

A character to transform microorganism input - must be "name", "shortname" (default), "gramstain", or one of the column names of the microorganisms data set: "mo", "fullname", "status", "domain", "kingdom", "phylum", "class", "order", "family", "genus", "species", "subspecies", "rank", "ref", "oxygen_tolerance", "morphology", "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 NULL to not transform the input or NA to consider all microorganisms 'unknown'.

add_total_n

(deprecated in favour of formatting_type) A logical to indicate whether n_tested available numbers per pathogen should be added to the table (default is TRUE). This will add the lowest and highest number of available isolates per antimicrobial (e.g., if for E. coli 200 isolates are available for ciprofloxacin and 150 for amoxicillin, the returned number will be "150-200"). This option is unavailable when wisca = TRUE; in that case, use retrieve_wisca_parameters() to get the parameters used for WISCA.

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.

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. Per \Sexpr[results=rd]{tools:::Rd_expr_doi("10.1093/jac/dkv397")}, susceptibility priors are \beta(0.5, 0.5) (Jeffreys) and intrinsically resistant pairs (based on intrinsic_resistant) use \beta(1, 9999).

Set simulations, conf_interval, and interval_side to adjust.

wisca_model

The outcome of wisca() or antibiogram(..., wisca = TRUE).

object

An antibiogram() object.

geom

The plotting style for the point estimate. One of "pointrange" (default), "point", "col"/"bar", or "errorbar". "pointrange" is recommended for coverage data: bars imply a meaningful baseline at zero, which coverage estimates rarely have.

ci

Logical, whether to draw the credible/confidence interval. Defaults to TRUE. Ignored (forced TRUE) when geom = "pointrange" or "errorbar", since the interval is intrinsic to those geoms.

sort

Logical, whether to order regimens by coverage. Defaults to TRUE. When faceted (per pathogen) or grouped (syndromic), ordering is applied within each panel/group.

flip

Logical, whether to draw regimens on the y-axis (horizontal). Defaults to NULL, which flips automatically when any regimen label exceeds 20 characters (long combination names read poorly on the x-axis). Set TRUE/FALSE to override.

caption

Text to show as caption, will explain non-inferiority for WISCA models.

wisca_plot_type

Either "susceptibility_incidence" (default) or "posterior_coverage".

italicise

A logical to indicate whether the microorganism names in the knitr table should be made italic, using italicise_taxonomy().

na

Character to use for showing NA values.

Details

These functions return a table with values between 0 and 100 for susceptibility, not resistance.

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 with one of the four available algorithms: isolate-based, patient-based, episode-based, or phenotype-based.

For estimating antimicrobial coverage, especially when creating a WISCA, the outcome might become more reliable by only including the top n species encountered in the data. You can filter on this top n using top_n_microorganisms(). For example, use top_n_microorganisms(your_data, n = 10) as a pre-processing step to only include the top 10 species in the data.

The numeric values of an antibiogram are stored in a long format as the attribute long_numeric. You can retrieve them using attributes(x)$long_numeric, where x is the outcome of antibiogram() or wisca(). This is ideal for e.g. advanced plotting.

Formatting Type

The formatting of the 'cells' of the table can be set with the argument formatting_type. In these examples, 5 indicates the antimicrobial coverage (4-6 the confidence level), 15 the number of susceptible isolates, and 300 the number of tested (i.e., available) isolates:

  1. 5

  2. 15

  3. 300

  4. 15/300

  5. 5 (300)

  6. 5% (300)

  7. 5 (N=300)

  8. 5% (N=300)

  9. 5 (15/300)

  10. 5% (15/300)

  11. 5 (N=15/300)

  12. 5% (N=15/300)

  13. 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 non-WISCA

  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 can be set globally with the package option AMR_antibiogram_formatting_type, e.g. options(AMR_antibiogram_formatting_type = 5). Do note that for WISCA, the total numbers of tested and susceptible isolates 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.

When to Use WISCA vs. Traditional Antibiograms

There are various antibiogram types, as summarised by Klinker et al. (2021, \Sexpr[results=rd]{tools:::Rd_expr_doi("10.1177/20499361211011373")}), and they are all supported by antibiogram(): traditional, combination, syndromic, and WISCA.

If your goal is to guide empirical therapy, use WISCA. Traditional antibiograms fragment susceptibility information by species, but at the point of prescribing, the clinician does not know which species is causing the infection. WISCA shifts the unit of analysis from the isolate to the patient: it estimates the probability that a regimen will cover the infection, given the local distribution of causative pathogens. It evaluates combination regimens, weights by pathogen incidence, and provides credible intervals that honestly communicate uncertainty. Hebert et al. (2012) demonstrated this concretely for the first time: ciprofloxacin showed 84% susceptibility against E. coli in the traditional antibiogram, but WISCA coverage was only 62% for UTI and 37% for abdominal infections, because other species (including intrinsically resistant enterococci) contribute substantially to these syndromes. Note that WISCA is pathogen-agnostic: the outcome is not stratified by species, but by syndrome.

Traditional, combination, and syndromic antibiograms remain appropriate for AMR surveillance, i.e., tracking resistance trends per species over time. They are the right tool when the question is "how resistant is species X to drug Y in our setting?" rather than "what regimen best covers this syndrome?".

All four types are demonstrated in the Examples section below.

Grouped tibbles

For any type of antibiogram, grouped tibbles can also be used to calculate susceptibilities over various groups.

Code example:

library(dplyr)
your_data %>%
  group_by(has_sepsis, is_neonate, sex) %>%
  wisca(antimicrobials = c("TZP", "TZP+TOB", "TZP+GEN"))

Inclusion in Combination Antibiograms

For combination antibiograms, the results of the antimicrobials are combined using the same rules as sir_combine(), see the section Combination Therapy below. Whether isolates must be tested for all antimicrobials can be set with the only_all_tested argument (default is FALSE). Whether the 'I' category is considered susceptible follows the guideline argument, which also determines whether a missing result can be ignored. To use a combination in other analyses as well, create a new variable with sir_combine().

Plotting

All types of antibiograms as listed above can be plotted (using ggplot2::autoplot() or base R's plot() and barplot()). As mentioned above, the numeric values of an antibiogram are stored in a long format as the attribute long_numeric. You can retrieve them using attributes(x)$long_numeric, where x is the outcome of antibiogram() or wisca().

The outcome of antibiogram() can also be used directly in R Markdown / Quarto (i.e., knitr) for reports. In this case, knitr::kable() will be applied automatically and microorganism names will even be printed in italics at default (see argument italicise).

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().

Explaining WISCA

WISCA (Weighted-Incidence Syndromic Combination Antibiogram) estimates the probability that an empirical antimicrobial regimen will provide adequate coverage for a given infection syndrome, before the causative pathogen has been identified.

It does so by combining two quantities: the relative incidence of each pathogen within the syndrome (modelled as a Dirichlet distribution) and the susceptibility of each pathogen to the regimen (modelled as Beta distributions). These are combined via Monte Carlo simulation to produce a coverage estimate with a credible interval.

Prior distributions: Pathogen incidence uses a non-informative Dirichlet(1, 1, \ldots, 1) prior. Susceptibility proportions use the Jeffreys prior, \beta(0.5, 0.5), except for pathogen-drug combinations with known intrinsic resistance, which use a strongly informative \beta(1, 9999) prior that forces near-zero susceptibility regardless of observed data. Intrinsic resistance is determined using the intrinsic_resistant data set, which is based on 'EUCAST Expected Resistant Phenotypes' v1.2 (2023).

Interpreting the output: Overlapping credible intervals between regimens indicate no significant difference in coverage; if a narrower-spectrum regimen overlaps with a broader one, the narrower-spectrum option may be preferred on stewardship grounds. Non-overlapping intervals indicate a clinically meaningful difference. For small sample sizes, consider pooling data from multiple sites to improve precision, provided pathogen distributions are sufficiently similar (Bielicki et al., 2016).

For the full mathematical derivation and worked examples, see the WISCA vignette.

Combination Therapy

Results are ordered from susceptible to resistant: S (and WT), SDD, I, R (and NWT, NS). With method = "most_susceptible" (in sir_combine()), the most susceptible result of the antimicrobials is returned, and with method = "most_resistant", the most resistant result. The value "NI" (non-interpretable) is considered a missing result.

A missing result can only be ignored if it cannot change the conclusion: a susceptible result for "most_susceptible", and a non-susceptible result for "most_resistant". Under EUCAST, the 'I' category is considered susceptible (susceptible, increased exposure), and under CLSI, it is not. With only_all_tested = TRUE, any missing result leads to NA.

This is an example for two antimicrobials, Drug A and Drug B, under EUCAST (the order of the antimicrobials does not matter):

-------------------------------------------------------------------------
                      Result of method =            Result of method =
                     "most_susceptible"              "most_resistant"
                   -----------------------  -----------------------------
                    only_all_tested =        only_all_tested =
 Drug A    Drug B     FALSE      TRUE          FALSE         TRUE
--------  --------  ---------  ---------    -----------  -------------
    S        S          S          S             S             S
    S        I          S          S             I             I
    S        R          S          S             R             R
    I        R          I          I             R             R
    R        R          R          R             R             R
    S      <NA>         S        <NA>          <NA>          <NA>
    I      <NA>         I        <NA>          <NA>          <NA>
    R      <NA>       <NA>       <NA>            R           <NA>
  <NA>     <NA>       <NA>       <NA>          <NA>          <NA>
-------------------------------------------------------------------------

Under CLSI, the combination of I with a missing result is ⁠<NA>⁠ for "most_susceptible" and I for "most_resistant".

The count_*() and proportion_*() functions apply these rules when more than one variable is used. With only_all_tested = FALSE (default), the functions for susceptibility, such as susceptibility() and count_susceptible(), count an isolate as susceptible if any of the antimicrobials is susceptible ("most_susceptible"), and the functions for resistance, such as resistance() and count_resistant(), count an isolate as resistant if any of the antimicrobials is resistant ("most_resistant"). An isolate is considered tested if it has such a result, or if it was tested for all antimicrobials. Therefore, for combinations with only_all_tested = FALSE:

    count_S()    +   count_I()    +   count_R()    >= count_all()
  proportion_S() + proportion_I() + proportion_R() >= 1

With only_all_tested = TRUE, all these functions count the result of the combination therapy ("most_susceptible") of isolates tested for all antimicrobials, so that:

    count_S()    +   count_I()    +   count_R()    = count_all()
  proportion_S() + proportion_I() + proportion_R() = 1

In antibiogram() and wisca(), the result of the combination therapy ("most_susceptible") is used, the 'I' category is considered susceptible or not following the guideline argument ('SDD' is always considered susceptible), and the result is then reduced to S or R.

Interpretation of SIR

In 2019, the European Committee on Antimicrobial Susceptibility Testing (EUCAST) has decided to change the definitions of susceptibility testing categories S, I, and R (https://www.eucast.org/bacteria/clinical-breakpoints-and-interpretation/definition-of-s-i-and-r/).

In aggregated analyses, such as proportions, counts, antibiograms, and plots, the 'I' category must be considered either susceptible or resistant. In epidemiological AMR data analysis, this follows the guideline: EUCAST considers 'I' susceptible, while CLSI considers 'I' resistant. The dose-dependent susceptibility of CLSI ('SDD') is always considered susceptible, as it equals what EUCAST defines as 'I'. All functions with a guideline argument for this purpose use these categories:

guideline Susceptible Resistant
"EUCAST" S, SDD, I, WT R, NWT, NS
"CLSI" S, SDD, WT I, R, NWT, NS

The values 'WT' (wild type) and 'NWT' (non-wild type) result from epidemiological cut-off values (ECOFFs) instead of clinical breakpoints. Since they are no clinical categories, 'WT' is always considered susceptible and 'NWT' always resistant, regardless of the guideline. The value 'NS' (non-susceptible) is always considered resistant, and 'NI' (non-interpretable) is always considered a missing result.

The guideline argument can be:

  • Left unset, to use the package option AMR_guideline, or "EUCAST" if this option is not set. In the latter case, a message is shown once per session (but not in R Markdown or Quarto documents); set the option to silence it.

  • "EUCAST", or any EUCAST version such as "EUCAST 2025", to consider 'I' susceptible, e.g., to return "SI" vs. "R" in proportion_df().

  • "CLSI", or any CLSI version such as "CLSI 2025", to consider 'I' resistant, e.g., to return "S" vs. "IR" in proportion_df().

  • NULL or FALSE, to keep S, I, and R separate. This is only possible in functions that return results per category: count_df(), proportion_df(), sir_df(), ggplot_sir(), geom_sir(), labels_sir_count(), and bug_drug_combinations(). Functions that return a single proportion or count, such as susceptibility(), count_resistant(), antibiogram(), wisca(), and format() on the result of bug_drug_combinations(), require 'I' to be considered either susceptible or resistant, and return an error.

Use susceptibility() and resistance() (or count_susceptible() and count_resistant()) to follow the guideline, or e.g. proportion_SI() and proportion_R() to be explicit regardless of the guideline.

The combine_SI argument of the functions that return results per category, antibiogram(), and wisca() is deprecated in favour of guideline. If set, it is followed literally and takes precedence over guideline.

Author(s)

Implementation: Dr. Larisse Bolton and Dr. Matthijs Berends

References

  • Hebert C et al. (2012). Demonstration of the weighted-incidence syndromic combination antibiogram: an empiric prescribing decision aid. Infection Control & Hospital Epidemiology 33(4):381-388; \Sexpr[results=rd]{tools:::Rd_expr_doi("10.1086/664768")}

  • Bielicki JA et al. (2016). Selecting appropriate empirical antibiotic regimens for paediatric bloodstream infections: application of a Bayesian decision model to local and pooled antimicrobial resistance surveillance data. Journal of Antimicrobial Chemotherapy 71(3):794-802; \Sexpr[results=rd]{tools:::Rd_expr_doi("10.1093/jac/dkv397")}

  • Cook A et al. (2022). Improving empiric antibiotic prescribing in pediatric bloodstream infections: a potential application of weighted-incidence syndromic combination antibiograms (WISCA). Expert Review of Anti-infective Therapy 20(3):445-456; \Sexpr[results=rd]{tools:::Rd_expr_doi("10.1080/14787210.2021.1967145")}

  • Klinker KP et al. (2021). Antimicrobial stewardship and antibiograms: importance of moving beyond traditional antibiograms. Therapeutic Advances in Infectious Disease, May 5;8:20499361211011373; \Sexpr[results=rd]{tools:::Rd_expr_doi("10.1177/20499361211011373")}

  • Barbieri E et al. (2021). Development of a Weighted-Incidence Syndromic Combination Antibiogram (WISCA) to guide the choice of the empiric antibiotic treatment for urinary tract infection in paediatric patients: a Bayesian approach. Antimicrobial Resistance & Infection Control May 1;10(1):74; \Sexpr[results=rd]{tools:::Rd_expr_doi("10.1186/s13756-021-00939-2")}

  • M39 Analysis and Presentation of Cumulative Antimicrobial Susceptibility Test Data, 5th Edition, 2022, Clinical and Laboratory Standards Institute (CLSI). https://clsi.org/standards/products/microbiology/documents/m39/.

Examples

# example_isolates is a data set available in the AMR package.
# run ?example_isolates for more info.
example_isolates


# WISCA antibiogram (recommended for empirical therapy) -----------------

# basic WISCA: empirical coverage per regimen, weighted by pathogen
# incidence, with 95% credible intervals
wisca(example_isolates,
  antimicrobials = c("AMC", "AMC+CIP", "AMC+GEN")
)

# equivalent using antibiogram():
antibiogram(example_isolates,
  antimicrobials = c("AMC", "AMC+CIP", "AMC+GEN"),
  wisca = TRUE
)

# stratified by syndrome or clinical group (5 most common species, for a readable plot)
out <- wisca(top_n_microorganisms(example_isolates, n = 5),
  antimicrobials = c("TZP", "TZP+TOB", "TZP+GEN"),
  syndromic_group = "ward"
)
out
if (requireNamespace("ggplot2")) {
  wisca_plot(out)
}

# stratified using grouped tibbles (e.g. by age and gender)
if (requireNamespace("dplyr")) {
  library(dplyr)
  example_isolates %>%
    top_n_microorganisms(n = 10) %>%
    group_by(
      age_group = age_groups(age, c(25, 50, 75)),
      gender
    ) %>%
    wisca(antimicrobials = c("TZP", "TZP+TOB", "TZP+GEN"))
}


# Traditional antibiogram (for AMR surveillance) ------------------------

antibiogram(example_isolates,
  antimicrobials = c(aminoglycosides(), carbapenems())
)

antibiogram(example_isolates,
  antimicrobials = aminoglycosides(),
  ab_transform = "atc",
  mo_transform = "gramstain"
)


# Combination antibiogram (for AMR surveillance) ------------------------

antibiogram(example_isolates,
  antimicrobials = c("TZP", "TZP+TOB", "TZP+GEN"),
  mo_transform = "gramstain"
)

# you can use any antimicrobial selector with `+` too:
antibiogram(example_isolates,
  antimicrobials = ureidopenicillins() + c("", "GEN", "tobra"),
  mo_transform = "gramstain"
)

# names of antimicrobials do not need to resemble columns exactly:
antibiogram(example_isolates,
  antimicrobials = c("Cipro", "cipro + genta"),
  mo_transform = "gramstain",
  ab_transform = "name",
  sep = " & "
)


# Syndromic antibiogram (for AMR surveillance) --------------------------

antibiogram(example_isolates,
  antimicrobials = c(aminoglycosides(), carbapenems()),
  syndromic_group = "ward"
)

# with a custom language, though this will be determined automatically
# (i.e., this table will be in Spanish on Spanish systems)
ex1 <- example_isolates[which(mo_genus() == "Escherichia"), ]
antibiogram(ex1,
  antimicrobials = aminoglycosides(),
  ab_transform = "name",
  syndromic_group = ifelse(ex1$ward == "ICU",
    "UCI", "No UCI"
  ),
  language = "es"
)


# Print the output for R Markdown / Quarto -----------------------------

ureido <- wisca(example_isolates,
  antimicrobials = ureidopenicillins(),
  syndromic_group = "ward"
)

# in an Rmd file, you would just need to return `ureido` in a chunk,
# but to be explicit here:
if (requireNamespace("knitr")) {
  cat(knitr::knit_print(ureido))
}


# Generate plots with ggplot2 or base R --------------------------------

ab1 <- antibiogram(example_isolates,
  antimicrobials = c("AMC", "CIP", "TZP", "TZP+TOB"),
  mo_transform = "gramstain"
)
ab2 <- wisca(example_isolates,
  antimicrobials = c("AMC", "CIP", "TZP", "TZP+TOB"),
  syndromic_group = "ward"
)

if (requireNamespace("ggplot2")) {
  ggplot2::autoplot(ab1)
}
if (requireNamespace("ggplot2")) {
  ggplot2::autoplot(ab2)
}

plot(ab1)
plot(ab2)


AMR documentation built on Oct. 16, 2026, 5:10 p.m.