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

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](https://amr-for-r.org/articles/WISCA.html) 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,
[doi:10.1093/jac/dkv397](https://doi.org/10.1093/jac/dkv397) ). Output
formats include plots and tables, ideal for integration with R Markdown
and Quarto reports.

## Usage

``` r
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 = TRUE,
  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 = TRUE,
  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](https://rdrr.io/r/base/data.frame.html) containing at
  least a column with microorganisms and columns with antimicrobial
  results (class 'sir', see
  [`as.sir()`](https://amr-for-r.org/reference/as.sir.md)).

- antimicrobials:

  A vector specifying the antimicrobials containing SIR values to
  include in the antibiogram (see *Examples*). Will be evaluated using
  [`guess_ab_col()`](https://amr-for-r.org/reference/guess_ab_col.md).
  This can be:

  - Any antimicrobial name or code that could match (see
    [`guess_ab_col()`](https://amr-for-r.org/reference/guess_ab_col.md))
    to any column in `x`

  - Any [antimicrobial
    selector](https://amr-for-r.org/reference/antimicrobial_selectors.md),
    such as
    [`aminoglycosides()`](https://amr-for-r.org/reference/antimicrobial_selectors.md)
    or
    [`carbapenems()`](https://amr-for-r.org/reference/antimicrobial_selectors.md)

  - A combination of the above, using
    [`c()`](https://rdrr.io/r/base/c.html), e.g.:

    - `c(aminoglycosides(), "AMP", "AMC")`

    - `c(aminoglycosides(), carbapenems())`

  - Column indices using numbers

  - Combination therapy, indicated by using `"+"`, with or without
    [antimicrobial
    selectors](https://amr-for-r.org/reference/antimicrobial_selectors.md),
    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](https://amr-for-r.org/reference/antimicrobials.md)
  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()`](https://rdrr.io/r/base/ifelse.html) or
  [`case_when()`](https://dplyr.tidyverse.org/reference/case-and-replace-when.html).
  See *Examples*.

- only_all_tested:

  (for combination antibiograms): a
  [logical](https://rdrr.io/r/base/logical.html) 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()`](https://amr-for-r.org/reference/as.mo.md)) - the default
  is the first column of class
  [`mo`](https://amr-for-r.org/reference/as.mo.md). Values will be
  coerced using [`as.mo()`](https://amr-for-r.org/reference/as.mo.md).

- language:

  Language to translate text, which defaults to the system language (see
  [`get_AMR_locale()`](https://amr-for-r.org/reference/translate.md)).

- combine_SI:

  A [logical](https://rdrr.io/r/base/logical.html) to indicate whether
  all susceptibility should be determined by results of either S, SDD,
  or I, instead of only S (default is `TRUE`).

- sep:

  A separating character for antimicrobial columns in combination
  antibiograms.

- sort_columns:

  A [logical](https://rdrr.io/r/base/logical.html) 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](https://rdrr.io/r/base/logical.html) to indicate info
  should be printed - the default is `TRUE` only in interactive mode.

- parallel:

  A [logical](https://rdrr.io/r/base/logical.html) to indicate if
  parallel computing must be used, defaults to `FALSE`. Requires the
  [`future.apply`](https://future.apply.futureverse.org/reference/future_lapply.html)
  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()`](https://future.futureverse.org/reference/plan.html)
  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](https://amr-for-r.org/reference/microorganisms.md)
  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](https://rdrr.io/r/base/logical.html) 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](https://rdrr.io/r/base/logical.html) 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). Per
  [doi:10.1093/jac/dkv397](https://doi.org/10.1093/jac/dkv397) ,
  susceptibility priors are \\\beta(0.5, 0.5)\\ (Jeffreys) and
  intrinsically resistant pairs (based on
  [intrinsic_resistant](https://amr-for-r.org/reference/intrinsic_resistant.md))
  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](https://rdrr.io/r/base/logical.html) to indicate whether
  the microorganism names in the
  [knitr](https://rdrr.io/pkg/knitr/man/kable.html) table should be made
  italic, using
  [`italicise_taxonomy()`](https://amr-for-r.org/reference/italicise_taxonomy.md).

- 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()`](https://amr-for-r.org/reference/first_isolate.md) 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()`](https://amr-for-r.org/reference/top_n_microorganisms.md).
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](https://rdrr.io/r/base/attributes.html) `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`](https://amr-for-r.org/reference/AMR-options.md),
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,
[doi:10.1177/20499361211011373](https://doi.org/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](https://tibble.tidyverse.org/reference/tibble.html) 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

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   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
      <NA>     S or I        X            X           -            -
     S or I      R           X            X           X            X
       R         R           -            X           -            X
      <NA>       R           -            -           -            -
     S or I     <NA>         X            X           -            -
       R        <NA>         -            -           -            -
      <NA>      <NA>         -            -           -            -
    --------------------------------------------------------------------

### Plotting

All types of antibiograms as listed above can be plotted (using
[`ggplot2::autoplot()`](https://ggplot2.tidyverse.org/reference/autoplot.html)
or base R's [`plot()`](https://amr-for-r.org/reference/plot.md) and
[`barplot()`](https://rdrr.io/r/graphics/barplot.html)). As mentioned
above, the numeric values of an antibiogram are stored in a long format
as the [attribute](https://rdrr.io/r/base/attributes.html)
`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()`](https://rdrr.io/pkg/knitr/man/kable.html) 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](https://amr-for-r.org/reference/intrinsic_resistant.md)
data set, which is based on ['EUCAST Expected Resistant Phenotypes'
v1.2](https://www.eucast.org/bacteria/important-additional-information/expert-rules/)
(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](https://amr-for-r.org/articles/WISCA.html).

## 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;
  [doi:10.1086/664768](https://doi.org/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;
  [doi:10.1093/jac/dkv397](https://doi.org/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;
  [doi:10.1080/14787210.2021.1967145](https://doi.org/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;
  [doi:10.1177/20499361211011373](https://doi.org/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;
  [doi:10.1186/s13756-021-00939-2](https://doi.org/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/>.

## Author

Implementation: Dr. Larisse Bolton and Dr. Matthijs Berends

## Examples

``` r
# example_isolates is a data set available in the AMR package.
# run ?example_isolates for more info.
example_isolates
#> # A tibble: 2,000 × 46
#>    date       patient   age gender ward     mo           PEN   OXA   FLC   AMX  
#>    <date>     <chr>   <dbl> <chr>  <chr>    <mo>         <sir> <sir> <sir> <sir>
#>  1 2002-01-02 A77334     65 F      Clinical B_ESCHR_COLI   R     NA    NA    NA 
#>  2 2002-01-03 A77334     65 F      Clinical B_ESCHR_COLI   R     NA    NA    NA 
#>  3 2002-01-07 067927     45 F      ICU      B_STPHY_EPDR   R     NA    R     NA 
#>  4 2002-01-07 067927     45 F      ICU      B_STPHY_EPDR   R     NA    R     NA 
#>  5 2002-01-13 067927     45 F      ICU      B_STPHY_EPDR   R     NA    R     NA 
#>  6 2002-01-13 067927     45 F      ICU      B_STPHY_EPDR   R     NA    R     NA 
#>  7 2002-01-14 462729     78 M      Clinical B_STPHY_AURS   R     NA    S     R  
#>  8 2002-01-14 462729     78 M      Clinical B_STPHY_AURS   R     NA    S     R  
#>  9 2002-01-16 067927     45 F      ICU      B_STPHY_EPDR   R     NA    R     NA 
#> 10 2002-01-17 858515     79 F      ICU      B_STPHY_EPDR   R     NA    S     NA 
#> # ℹ 1,990 more rows
#> # ℹ 36 more variables: AMC <sir>, AMP <sir>, TZP <sir>, CZO <sir>, FEP <sir>,
#> #   CXM <sir>, FOX <sir>, CTX <sir>, CAZ <sir>, CRO <sir>, GEN <sir>,
#> #   TOB <sir>, AMK <sir>, KAN <sir>, TMP <sir>, SXT <sir>, NIT <sir>,
#> #   FOS <sir>, LNZ <sir>, CIP <sir>, MFX <sir>, VAN <sir>, TEC <sir>,
#> #   TCY <sir>, TGC <sir>, DOX <sir>, ERY <sir>, CLI <sir>, AZM <sir>,
#> #   IPM <sir>, MEM <sir>, MTR <sir>, CHL <sir>, COL <sir>, MUP <sir>, …

# \donttest{
# 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")
)
#> Warning: invalid microorganism code, NA generated
#> # A tibble:       1 × 3
#> # Type:           Weighted-Incidence Syndromic Combination Antibiogram (WISCA)
#> # Cred. interval: 95%
#> # Simulations:    1000 per stratum
#>   `Amoxicillin/clavulanic acid` Amoxicillin/clavulanic …¹ Amoxicillin/clavulan…²
#>   <chr>                         <chr>                     <chr>                 
#> 1 74.2% (72.2-76.1%)            88.8% (87.1-90.3%)        90.8% (89.3-92.2%)    
#> # ℹ abbreviated names: ¹​`Amoxicillin/clavulanic acid + Ciprofloxacin`,
#> #   ²​`Amoxicillin/clavulanic acid + Gentamicin`
#> # Use `ggplot2::autoplot()` or base R `plot()` to create a plot of this antibiogram,
#> # and use `wisca_plot()` to assess the simulation outcomes.
#> # Or, use it directly in R Markdown or Quarto, see `antibiogram()`.

# equivalent using antibiogram():
antibiogram(example_isolates,
  antimicrobials = c("AMC", "AMC+CIP", "AMC+GEN"),
  wisca = TRUE
)
#> Warning: invalid microorganism code, NA generated
#> # A tibble:       1 × 3
#> # Type:           Weighted-Incidence Syndromic Combination Antibiogram (WISCA)
#> # Cred. interval: 95%
#> # Simulations:    1000 per stratum
#>   `Amoxicillin/clavulanic acid` Amoxicillin/clavulanic …¹ Amoxicillin/clavulan…²
#>   <chr>                         <chr>                     <chr>                 
#> 1 74.1% (72.1-75.9%)            88.8% (87.1-90.3%)        90.8% (89.5-92.1%)    
#> # ℹ abbreviated names: ¹​`Amoxicillin/clavulanic acid + Ciprofloxacin`,
#> #   ²​`Amoxicillin/clavulanic acid + Gentamicin`
#> # Use `ggplot2::autoplot()` or base R `plot()` to create a plot of this antibiogram,
#> # and use `wisca_plot()` to assess the simulation outcomes.
#> # Or, use it directly in R Markdown or Quarto, see `antibiogram()`.

# stratified by syndrome or clinical group
out <- wisca(example_isolates,
  antimicrobials = c("TZP", "TZP+TOB", "TZP+GEN"),
  syndromic_group = "ward"
)
#> Warning: invalid microorganism code, NA generated
out
#> # A tibble:       3 × 4
#> # Type:           Weighted-Incidence Syndromic Combination Antibiogram (WISCA)
#> # Cred. interval: 95%
#> # Simulations:    1000 per stratum
#>   `Syndromic Group` `Piperacillin/tazobactam` Piperacillin/tazobactam + Gentam…¹
#>   <chr>             <chr>                     <chr>                             
#> 1 Clinical          74.7% (69-80.3%)          93.6% (91.9-95.1%)                
#> 2 ICU               57% (48.2-66%)            86.7% (83.5-89.7%)                
#> 3 Outpatient        57.5% (46-68.7%)          76.5% (70.6-82.2%)                
#> # ℹ abbreviated name: ¹​`Piperacillin/tazobactam + Gentamicin`
#> # ℹ 1 more variable: `Piperacillin/tazobactam + Tobramycin` <chr>
#> # Use `ggplot2::autoplot()` or base R `plot()` to create a plot of this antibiogram,
#> # and use `wisca_plot()` to assess the simulation outcomes.
#> # Or, use it directly in R Markdown or Quarto, see `antibiogram()`.
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"))
}
#> ℹ Using column mo as input for `col_mo`.
#> Warning: Number of tested isolates should exceed 30 for each regimen (and group). WISCA
#> coverage estimates might be inaccurate.
#> # A tibble:       8 × 5
#> # Type:           Weighted-Incidence Syndromic Combination Antibiogram (WISCA)
#> # Cred. interval: 95%
#> # Simulations:    1000 per stratum
#>   age_group gender `Piperacillin/tazobactam` Piperacillin/tazobactam + Gentami…¹
#>   <chr>     <chr>  <chr>                     <chr>                              
#> 1 0-24      F      57.7% (29.5-82.1%)        70.5% (46.1-89%)                   
#> 2 0-24      M      59.3% (33.1-84.2%)        76.2% (55.7-90.9%)                 
#> 3 25-49     F      67.4% (43.3-90.4%)        93.8% (87.8-97.9%)                 
#> 4 25-49     M      56.9% (27.1-86.5%)        90.9% (82.6-96.8%)                 
#> 5 50-74     F      68.1% (53.3-82.6%)        96.9% (94.7-98.5%)                 
#> 6 50-74     M      67.1% (56.3-77.3%)        96.8% (94.3-98.8%)                 
#> 7 75+       F      73.3% (62.9-83.7%)        97.7% (96.1-98.9%)                 
#> 8 75+       M      74% (64.1-82.9%)          97.9% (96-99%)                     
#> # ℹ abbreviated name: ¹​`Piperacillin/tazobactam + Gentamicin`
#> # ℹ 1 more variable: `Piperacillin/tazobactam + Tobramycin` <chr>
#> # Use `ggplot2::autoplot()` or base R `plot()` to create a plot of this antibiogram,
#> # and use `wisca_plot()` to assess the simulation outcomes.
#> # Or, use it directly in R Markdown or Quarto, see `antibiogram()`.


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

antibiogram(example_isolates,
  antimicrobials = c(aminoglycosides(), carbapenems())
)
#> ℹ For `aminoglycosides()` using columns GEN (gentamicin), TOB (tobramycin), AMK
#>   (amikacin), and KAN (kanamycin)
#> ℹ For `carbapenems()` using columns IPM (imipenem) and MEM (meropenem)
#> # A tibble:       10 × 7
#> # Type:           Traditional Antibiogram
#> # Conf. interval: 95%
#>    Pathogen       Amikacin    Gentamicin Imipenem Kanamycin Meropenem Tobramycin
#>    <chr>          <chr>       <chr>      <chr>    <chr>     <chr>     <chr>     
#>  1 CoNS           0% (0-8%,N… 86% (82-9… 52% (37… 0% (0-8%… 52% (37-… 22% (12-3…
#>  2 E. coli        100% (98-1… 98% (96-9… 100% (9… NA        100% (99… 97% (96-9…
#>  3 E. faecalis    0% (0-9%,N… 0% (0-9%,… 100% (9… 0% (0-9%… NA        0% (0-9%,…
#>  4 K. pneumoniae  NA          90% (79-9… 100% (9… NA        100% (93… 90% (79-9…
#>  5 P. aeruginosa  NA          100% (88-… NA       0% (0-12… NA        100% (88-…
#>  6 P. mirabilis   NA          94% (80-9… 94% (79… NA        NA        94% (80-9…
#>  7 S. aureus      NA          99% (97-1… NA       NA        NA        98% (92-1…
#>  8 S. epidermidis 0% (0-8%,N… 79% (71-8… NA       0% (0-8%… NA        51% (40-6…
#>  9 S. hominis     NA          92% (84-9… NA       NA        NA        85% (74-9…
#> 10 S. pneumoniae  0% (0-3%,N… 0% (0-3%,… NA       0% (0-3%… NA        0% (0-3%,…
#> # Use `ggplot2::autoplot()` or base R `plot()` to create a plot of this antibiogram,
#> # or use it directly in R Markdown or Quarto, see `antibiogram()`.

antibiogram(example_isolates,
  antimicrobials = aminoglycosides(),
  ab_transform = "atc",
  mo_transform = "gramstain"
)
#> ℹ For `aminoglycosides()` using columns GEN (gentamicin), TOB (tobramycin), AMK
#>   (amikacin), and KAN (kanamycin)
#> # A tibble:       2 × 5
#> # Type:           Traditional Antibiogram
#> # Conf. interval: 95%
#>   Pathogen      J01GB01            J01GB03             J01GB04         J01GB06  
#>   <chr>         <chr>              <chr>               <chr>           <chr>    
#> 1 Gram-negative 96% (94-97%,N=686) 96% (95-98%,N=684)  0% (0-10%,N=35) 98% (96-…
#> 2 Gram-positive 34% (31-38%,N=665) 63% (60-66%,N=1170) 0% (0-1%,N=436) 0% (0-1%…
#> # Use `ggplot2::autoplot()` or base R `plot()` to create a plot of this antibiogram,
#> # or use it directly in R Markdown or Quarto, see `antibiogram()`.


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

antibiogram(example_isolates,
  antimicrobials = c("TZP", "TZP+TOB", "TZP+GEN"),
  mo_transform = "gramstain"
)
#> # A tibble:       2 × 4
#> # Type:           Combination Antibiogram
#> # Conf. interval: 95%
#>   Pathogen  Piperacillin/tazobac…¹ Piperacillin/tazobac…² Piperacillin/tazobac…³
#>   <chr>     <chr>                  <chr>                  <chr>                 
#> 1 Gram-neg… 88% (85-91%,N=641)     99% (97-99%,N=691)     98% (97-99%,N=693)    
#> 2 Gram-pos… 86% (82-89%,N=345)     98% (96-98%,N=1044)    95% (93-97%,N=550)    
#> # ℹ abbreviated names: ¹​`Piperacillin/tazobactam`,
#> #   ²​`Piperacillin/tazobactam + Gentamicin`,
#> #   ³​`Piperacillin/tazobactam + Tobramycin`
#> # Use `ggplot2::autoplot()` or base R `plot()` to create a plot of this antibiogram,
#> # or use it directly in R Markdown or Quarto, see `antibiogram()`.

# you can use any antimicrobial selector with `+` too:
antibiogram(example_isolates,
  antimicrobials = ureidopenicillins() + c("", "GEN", "tobra"),
  mo_transform = "gramstain"
)
#> ℹ For `ureidopenicillins()` using column TZP (piperacillin/tazobactam)
#> # A tibble:       2 × 4
#> # Type:           Combination Antibiogram
#> # Conf. interval: 95%
#>   Pathogen  Piperacillin/tazobac…¹ Piperacillin/tazobac…² Piperacillin/tazobac…³
#>   <chr>     <chr>                  <chr>                  <chr>                 
#> 1 Gram-neg… 88% (85-91%,N=641)     99% (97-99%,N=691)     98% (97-99%,N=693)    
#> 2 Gram-pos… 86% (82-89%,N=345)     98% (96-98%,N=1044)    95% (93-97%,N=550)    
#> # ℹ abbreviated names: ¹​`Piperacillin/tazobactam`,
#> #   ²​`Piperacillin/tazobactam + Gentamicin`,
#> #   ³​`Piperacillin/tazobactam + Tobramycin`
#> # Use `ggplot2::autoplot()` or base R `plot()` to create a plot of this antibiogram,
#> # or use it directly in R Markdown or Quarto, see `antibiogram()`.

# 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 = " & "
)
#> # A tibble:       2 × 3
#> # Type:           Traditional Antibiogram
#> # Conf. interval: 95%
#>   Pathogen      Ciprofloxacin      `Ciprofloxacin & Gentamicin`
#>   <chr>         <chr>              <chr>                       
#> 1 Gram-negative 91% (88-93%,N=684) 99% (97-99%,N=694)          
#> 2 Gram-positive 77% (74-80%,N=724) 93% (91-94%,N=847)          
#> # Use `ggplot2::autoplot()` or base R `plot()` to create a plot of this antibiogram,
#> # or use it directly in R Markdown or Quarto, see `antibiogram()`.


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

antibiogram(example_isolates,
  antimicrobials = c(aminoglycosides(), carbapenems()),
  syndromic_group = "ward"
)
#> ℹ For `aminoglycosides()` using columns GEN (gentamicin), TOB (tobramycin), AMK
#>   (amikacin), and KAN (kanamycin)
#> ℹ For `carbapenems()` using columns IPM (imipenem) and MEM (meropenem)
#> # A tibble:       14 × 8
#> # Type:           Syndromic Antibiogram
#> # Conf. interval: 95%
#>    `Syndromic Group` Pathogen   Amikacin Gentamicin Imipenem Kanamycin Meropenem
#>    <chr>             <chr>      <chr>    <chr>      <chr>    <chr>     <chr>    
#>  1 Clinical          CoNS       NA       89% (84-9… 57% (39… NA        57% (39-…
#>  2 ICU               CoNS       NA       79% (68-8… NA       NA        NA       
#>  3 Outpatient        CoNS       NA       84% (66-9… NA       NA        NA       
#>  4 Clinical          E. coli    100% (9… 98% (96-9… 100% (9… NA        100% (99…
#>  5 ICU               E. coli    100% (9… 99% (95-1… 100% (9… NA        100% (97…
#>  6 Clinical          K. pneumo… NA       92% (81-9… 100% (9… NA        100% (92…
#>  7 Clinical          P. mirabi… NA       100% (88-… NA       NA        NA       
#>  8 Clinical          S. aureus  NA       99% (95-1… NA       NA        NA       
#>  9 ICU               S. aureus  NA       100% (95-… NA       NA        NA       
#> 10 Clinical          S. epider… NA       82% (72-9… NA       NA        NA       
#> 11 ICU               S. epider… NA       72% (60-8… NA       NA        NA       
#> 12 Clinical          S. hominis NA       96% (85-9… NA       NA        NA       
#> 13 Clinical          S. pneumo… 0% (0-5… 0% (0-5%,… NA       0% (0-5%… NA       
#> 14 ICU               S. pneumo… 0% (0-1… 0% (0-12%… NA       0% (0-12… NA       
#> # ℹ 1 more variable: Tobramycin <chr>
#> # Use `ggplot2::autoplot()` or base R `plot()` to create a plot of this antibiogram,
#> # or use it directly in R Markdown or Quarto, see `antibiogram()`.

# 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"), ]
#> ℹ Using column mo as input for `mo_genus()`
antibiogram(ex1,
  antimicrobials = aminoglycosides(),
  ab_transform = "name",
  syndromic_group = ifelse(ex1$ward == "ICU",
    "UCI", "No UCI"
  ),
  language = "es"
)
#> ℹ For `aminoglycosides()` using columns GEN (gentamicin), TOB (tobramycin), AMK
#>   (amikacin), and KAN (kanamycin)
#> # A tibble:       2 × 5
#> # Type:           Syndromic Antibiogram
#> # Conf. interval: 95%
#>   `Grupo sindrómico` Patógeno Amikacina            Gentamicina       Tobramicina
#>   <chr>              <chr>    <chr>                <chr>             <chr>      
#> 1 No UCI             E. coli  100% (97-100%,N=119) 98% (96-99%,N=32… 98% (96-99…
#> 2 UCI                E. coli  100% (93-100%,N=52)  99% (95-100%,N=1… 96% (92-99…
#> # Use `ggplot2::autoplot()` or base R `plot()` to create a plot of this antibiogram,
#> # or use it directly in R Markdown or Quarto, see `antibiogram()`.


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

ureido <- wisca(example_isolates,
  antimicrobials = ureidopenicillins(),
  syndromic_group = "ward"
)
#> ℹ For `ureidopenicillins()` using column TZP (piperacillin/tazobactam)
#> Warning: invalid microorganism code, NA generated

# 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))
}
#> 
#> 
#> |Syndromic Group |Piperacillin/tazobactam |
#> |:---------------|:-----------------------|
#> |Clinical        |74.7% (68.7-79.8%)      |
#> |ICU             |56.8% (48.9-65.7%)      |
#> |Outpatient      |57.4% (45.6-68.4%)      |


# 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"
)
#> Warning: invalid microorganism code, NA generated

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

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


plot(ab1)

plot(ab2)


# }
```
