From 98e62c9af2080d2744e778172491075fc5ccf48d Mon Sep 17 00:00:00 2001 From: "Dr. Matthijs Berends" <31037261+msberends@users.noreply.github.com> Date: Sat, 21 Jan 2023 23:47:20 +0100 Subject: [PATCH] Replace RSI with SIR --- .github/workflows/codecovr.yaml | 2 +- DESCRIPTION | 4 +- NAMESPACE | 35 +- NEWS.md | 37 +- R/aa_amr-package.R | 57 +++ R/aa_globals.R | 6 +- R/aa_helper_functions.R | 50 ++- R/ab.R | 6 +- R/ab_property.R | 4 +- R/ab_selectors.R | 196 ++++----- R/age.R | 2 +- R/amr.R | 76 ---- R/availability.R | 4 +- R/bug_drug_combinations.R | 12 +- R/count.R | 56 +-- R/custom_antimicrobials.R | 6 +- R/custom_eucast_rules.R | 12 +- R/custom_microorganisms.R | 10 +- R/data.R | 18 +- R/deprecated.R | 36 -- R/disk.R | 10 +- R/eucast_rules.R | 86 ++-- R/first_isolate.R | 26 +- R/ggplot_pca.R | 2 +- R/{ggplot_rsi.R => ggplot_sir.R} | 94 ++-- R/guess_ab_col.R | 26 +- R/italicise_taxonomy.R | 2 + R/join_microorganisms.R | 2 + R/key_antimicrobials.R | 24 +- R/mdro.R | 248 ++--------- R/mean_amr_distance.R | 14 +- R/mic.R | 10 +- R/mo.R | 12 + R/mo_matching_score.R | 2 + R/mo_property.R | 11 +- R/mo_source.R | 2 + R/pca.R | 2 +- R/plot.R | 186 ++++---- R/proportion.R | 80 ++-- R/random.R | 16 +- R/resistance_predict.R | 12 +- R/{rsi.R => sir.R} | 404 +++++++++--------- R/{rsi_calc.R => sir_calc.R} | 44 +- R/{rsi_df.R => sir_df.R} | 6 +- R/sysdata.rda | Bin 354136 -> 76776 bytes R/translate.R | 9 +- R/vctrs.R | 13 +- R/zz_deprecated.R | 210 +++++++++ R/zzz.R | 66 +-- README.md | 2 +- _pkgdown.yml | 8 +- data-raw/_pre_commit_hook.R | 41 +- data-raw/{rsi.md5 => clin_break.md5} | 0 ...anslation.dta => clinical_breakpoints.dta} | Bin 3542319 -> 3542319 bytes ...n.feather => clinical_breakpoints.feather} | Bin 756378 -> 756378 bytes ...n.parquet => clinical_breakpoints.parquet} | Bin 89289 -> 89289 bytes data-raw/clinical_breakpoints.rds | Bin 0 -> 43300 bytes ...anslation.sas => clinical_breakpoints.sas} | Bin 3764224 -> 3764224 bytes ...anslation.sav => clinical_breakpoints.sav} | Bin 2457026 -> 2457026 bytes ...anslation.txt => clinical_breakpoints.txt} | 0 ...slation.xlsx => clinical_breakpoints.xlsx} | Bin 815547 -> 815547 bytes data-raw/microorganisms.txt | 2 +- data-raw/read_EUCAST.R | 6 +- ...=> reproduction_of_clinical_breakpoints.R} | 10 +- .../reproduction_of_intrinsic_resistant.R | 4 +- data-raw/reproduction_of_microorganisms.R | 10 +- data-raw/rsi_translation.rds | Bin 43280 -> 0 bytes data/clinical_breakpoints.rda | Bin 0 -> 32620 bytes data/example_isolates.rda | Bin 24292 -> 24328 bytes data/rsi_translation.rda | Bin 32604 -> 0 bytes index.md | 6 +- inst/tinytest/test-count.R | 6 +- inst/tinytest/test-data.R | 12 +- inst/tinytest/test-eucast_rules.R | 22 +- inst/tinytest/test-first_isolate.R | 4 +- inst/tinytest/test-ggplot_rsi.R | 14 +- inst/tinytest/test-mdro.R | 14 +- inst/tinytest/test-mean_amr_distance.R | 10 +- inst/tinytest/test-pca.R | 2 +- inst/tinytest/test-proportion.R | 18 +- inst/tinytest/test-random.R | 2 +- inst/tinytest/test-resistance_predict.R | 22 +- inst/tinytest/test-rsi.R | 104 ++--- inst/tinytest/test-vctrs.R | 6 +- man/AMR-deprecated.Rd | 52 ++- man/AMR.Rd | 32 +- man/WHONET.Rd | 2 +- man/ab_property.Rd | 4 +- man/add_custom_antimicrobials.Rd | 4 +- man/add_custom_microorganisms.Rd | 2 +- man/age_groups.Rd | 2 +- man/antibiotic_class_selectors.Rd | 64 +-- man/as.ab.Rd | 6 +- man/as.av.Rd | 2 +- man/as.disk.Rd | 10 +- man/as.mic.Rd | 10 +- man/as.mo.Rd | 2 +- man/{as.rsi.Rd => as.sir.Rd} | 161 +++---- man/av_property.Rd | 2 +- man/availability.Rd | 2 +- ...translation.Rd => clinical_breakpoints.Rd} | 12 +- man/count.Rd | 39 +- man/custom_eucast_rules.Rd | 6 +- man/eucast_rules.Rd | 8 +- man/example_isolates.Rd | 2 +- man/example_isolates_unclean.Rd | 2 +- man/first_isolate.Rd | 4 +- man/ggplot_pca.Rd | 2 +- man/{ggplot_rsi.Rd => ggplot_sir.Rd} | 72 ++-- man/guess_ab_col.Rd | 4 +- man/key_antimicrobials.Rd | 6 +- man/mdro.Rd | 31 +- man/mean_amr_distance.Rd | 16 +- man/mo_matching_score.Rd | 2 +- man/mo_property.Rd | 2 +- man/pca.Rd | 2 +- man/plot.Rd | 36 +- man/proportion.Rd | 59 +-- man/random.Rd | 12 +- man/resistance_predict.Rd | 27 +- vignettes/AMR.Rmd | 46 +- vignettes/MDR.Rmd | 30 +- vignettes/PCA.Rmd | 2 +- vignettes/WHONET.Rmd | 12 +- vignettes/datasets.Rmd | 14 +- vignettes/resistance_predict.Rmd | 10 +- vignettes/welcome_to_AMR.Rmd | 6 +- 127 files changed, 1746 insertions(+), 1648 deletions(-) create mode 100755 R/aa_amr-package.R delete mode 100755 R/amr.R delete mode 100755 R/deprecated.R rename R/{ggplot_rsi.R => ggplot_sir.R} (90%) rename R/{rsi.R => sir.R} (74%) rename R/{rsi_calc.R => sir_calc.R} (93%) rename R/{rsi_df.R => sir_df.R} (96%) create mode 100755 R/zz_deprecated.R rename data-raw/{rsi.md5 => clin_break.md5} (100%) rename data-raw/{rsi_translation.dta => clinical_breakpoints.dta} (99%) rename data-raw/{rsi_translation.feather => clinical_breakpoints.feather} (99%) rename data-raw/{rsi_translation.parquet => clinical_breakpoints.parquet} (99%) create mode 100644 data-raw/clinical_breakpoints.rds rename data-raw/{rsi_translation.sas => clinical_breakpoints.sas} (99%) rename data-raw/{rsi_translation.sav => clinical_breakpoints.sav} (99%) rename data-raw/{rsi_translation.txt => clinical_breakpoints.txt} (100%) rename data-raw/{rsi_translation.xlsx => clinical_breakpoints.xlsx} (99%) rename data-raw/{reproduction_of_rsi_translation.R => reproduction_of_clinical_breakpoints.R} (96%) delete mode 100644 data-raw/rsi_translation.rds create mode 100644 data/clinical_breakpoints.rda delete mode 100644 data/rsi_translation.rda rename man/{as.rsi.Rd => as.sir.Rd} (61%) mode change 100755 => 100644 rename man/{rsi_translation.Rd => clinical_breakpoints.Rd} (79%) mode change 100755 => 100644 rename man/{ggplot_rsi.Rd => ggplot_sir.Rd} (81%) mode change 100755 => 100644 diff --git a/.github/workflows/codecovr.yaml b/.github/workflows/codecovr.yaml index 08ccea5c5..efbd917ad 100644 --- a/.github/workflows/codecovr.yaml +++ b/.github/workflows/codecovr.yaml @@ -61,6 +61,6 @@ jobs: R_LIBS_USER_GH_ACTIONS: ${{ env.R_LIBS_USER }} R_RUN_TINYTEST: true run: | - x <- covr::codecov(line_exclusions = list("R/atc_online.R", "R/mo_source.R", "R/translate.R", "R/resistance_predict.R", "R/aa_helper_functions.R", "R/aa_helper_pm_functions.R", "R/zzz.R")) + x <- covr::codecov(line_exclusions = list("R/atc_online.R", "R/mo_source.R", "R/translate.R", "R/resistance_predict.R", "R/zz_deprecated.R", "R/aa_helper_functions.R", "R/aa_helper_pm_functions.R", "R/zzz.R")) print(x) shell: Rscript {0} diff --git a/DESCRIPTION b/DESCRIPTION index db2f05409..e02add6c7 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: AMR -Version: 1.8.2.9095 -Date: 2023-01-20 +Version: 1.8.2.9096 +Date: 2023-01-21 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 77232b4fb..7e9bfd510 100755 --- a/NAMESPACE +++ b/NAMESPACE @@ -28,6 +28,7 @@ S3method("[<-",disk) S3method("[<-",mic) S3method("[<-",mo) S3method("[<-",rsi) +S3method("[<-",sir) S3method("[[",ab) S3method("[[",av) S3method("[[",disk) @@ -39,6 +40,7 @@ S3method("[[<-",disk) S3method("[[<-",mic) S3method("[[<-",mo) S3method("[[<-",rsi) +S3method("[[<-",sir) S3method("^",mic) S3method("|",ab_selector) S3method("|",mic) @@ -63,6 +65,10 @@ S3method(as.rsi,data.frame) S3method(as.rsi,default) S3method(as.rsi,disk) S3method(as.rsi,mic) +S3method(as.sir,data.frame) +S3method(as.sir,default) +S3method(as.sir,disk) +S3method(as.sir,mic) S3method(asin,mic) S3method(asinh,mic) S3method(atan,mic) @@ -70,6 +76,7 @@ S3method(atanh,mic) S3method(barplot,disk) S3method(barplot,mic) S3method(barplot,rsi) +S3method(barplot,sir) S3method(c,ab) S3method(c,ab_selector) S3method(c,av) @@ -79,6 +86,7 @@ S3method(c,disk) S3method(c,mic) S3method(c,mo) S3method(c,rsi) +S3method(c,sir) S3method(ceiling,mic) S3method(close,progress_bar) S3method(cos,mic) @@ -91,6 +99,7 @@ S3method(cumsum,mic) S3method(digamma,mic) S3method(droplevels,mic) S3method(droplevels,rsi) +S3method(droplevels,sir) S3method(exp,mic) S3method(expm1,mic) S3method(floor,mic) @@ -111,13 +120,14 @@ S3method(mean_amr_distance,data.frame) S3method(mean_amr_distance,default) S3method(mean_amr_distance,disk) S3method(mean_amr_distance,mic) -S3method(mean_amr_distance,rsi) +S3method(mean_amr_distance,sir) S3method(median,mic) S3method(min,mic) S3method(plot,disk) S3method(plot,mic) S3method(plot,resistance_predict) S3method(plot,rsi) +S3method(plot,sir) S3method(print,ab) S3method(print,av) S3method(print,bug_drug_combinations) @@ -130,6 +140,7 @@ S3method(print,mo_renamed) S3method(print,mo_uncertainties) S3method(print,pca) S3method(print,rsi) +S3method(print,sir) S3method(prod,mic) S3method(quantile,mic) S3method(range,mic) @@ -139,6 +150,7 @@ S3method(rep,disk) S3method(rep,mic) S3method(rep,mo) S3method(rep,rsi) +S3method(rep,sir) S3method(round,mic) S3method(sign,mic) S3method(signif,mic) @@ -155,6 +167,7 @@ S3method(summary,mic) S3method(summary,mo) S3method(summary,pca) S3method(summary,rsi) +S3method(summary,sir) S3method(tan,mic) S3method(tanh,mic) S3method(tanpi,mic) @@ -166,6 +179,7 @@ S3method(unique,disk) S3method(unique,mic) S3method(unique,mo) S3method(unique,rsi) +S3method(unique,sir) export("%like%") export("%like_case%") export("%unlike%") @@ -173,6 +187,7 @@ export("%unlike_case%") export(NA_disk_) export(NA_mic_) export(NA_rsi_) +export(NA_sir_) export(ab_atc) export(ab_atc_group1) export(ab_atc_group2) @@ -210,6 +225,7 @@ export(as.disk) export(as.mic) export(as.mo) export(as.rsi) +export(as.sir) export(atc_online_ddd) export(atc_online_ddd_units) export(atc_online_groups) @@ -255,18 +271,22 @@ export(eucast_dosage) export(eucast_exceptional_phenotypes) export(eucast_rules) export(facet_rsi) +export(facet_sir) export(filter_first_isolate) export(first_isolate) export(fluoroquinolones) export(full_join_microorganisms) export(g.test) export(geom_rsi) +export(geom_sir) export(get_AMR_locale) export(get_episode) export(get_mo_source) export(ggplot_pca) export(ggplot_rsi) export(ggplot_rsi_predict) +export(ggplot_sir) +export(ggplot_sir_predict) export(glycopeptides) export(guess_ab_col) export(inner_join_microorganisms) @@ -277,12 +297,15 @@ export(is.mic) export(is.mo) export(is.rsi) export(is.rsi.eligible) +export(is.sir) export(is_new_episode) +export(is_sir_eligible) export(italicise_taxonomy) export(italicize_taxonomy) export(key_antimicrobials) export(kurtosis) export(labels_rsi_count) +export(labels_sir_count) export(left_join_microorganisms) export(like) export(lincosamides) @@ -333,6 +356,7 @@ export(mo_url) export(mo_year) export(mrgn) export(n_rsi) +export(n_sir) export(not_intrinsic_resistant) export(oxazolidinones) export(pca) @@ -348,25 +372,30 @@ export(quinolones) export(random_disk) export(random_mic) export(random_rsi) +export(random_sir) export(reset_AMR_locale) export(resistance) export(resistance_predict) export(right_join_microorganisms) -export(rsi_confidence_interval) export(rsi_df) -export(rsi_interpretation_history) export(rsi_predict) export(scale_rsi_colours) +export(scale_sir_colours) export(scale_y_percent) export(semi_join_microorganisms) export(set_AMR_locale) export(set_ab_names) export(set_mo_source) +export(sir_confidence_interval) +export(sir_df) +export(sir_interpretation_history) +export(sir_predict) export(skewness) export(streptogramins) export(susceptibility) export(tetracyclines) export(theme_rsi) +export(theme_sir) export(translate_AMR) export(trimethoprims) export(ureidopenicillins) diff --git a/NEWS.md b/NEWS.md index f142415bd..b4e911e3e 100755 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# AMR 1.8.2.9095 +# AMR 1.8.2.9096 *(this beta version will eventually become v2.0! We're happy to reach a new major milestone soon!)* @@ -6,20 +6,29 @@ This is a new major release of the AMR package, with great new additions but als **[TL;DR](https://en.wikipedia.org/wiki/TL;DR)** +* All functions and arguments with 'rsi' were replaced with 'sir', such as the interpretation of MIC values (now `as.sir()` instead of `as.rsi()`) - all old functions still work for now * Microbiological taxonomy (`microorganisms` data set) updated to 2022 and now based on LPSN and GBIF * Much increased algorithms to translate user input to valid taxonomy, e.g. by using [recent scientific work](https://doi.org/10.1099/mic.0.001269) about per-species human pathogenicity * Clinical breakpoints added for EUCAST 2022 and CLSI 2022 * 20 new antibiotics added and updated all DDDs and ATC codes * Extended support for antiviral agents (`antivirals` data set), with many new functions * Now available in 16 languages -* Many new interesting functions, such as `rsi_confidence_interval()` and `mean_amr_distance()`, and `add_custom_microorganisms()` to add custom microorganisms to this package +* Many new interesting functions, such as `sir_confidence_interval()` and `mean_amr_distance()`, and `add_custom_microorganisms()` to add custom microorganisms to this package * Many small bug fixes ## New +### SIR vs. RSI + +For this milestone version, we replaced all mentions of RSI with SIR, to comply with what is actually being commonly used in the field of clinical microbiology when it comes to this tri-form regarding AMR. + +While existing functions such as `as.rsi()`, `rsi_df()` and `ggplot_rsi()` still work, their replacements `as.sir()`, `sir_df()`, `ggplot_sir()` are now the current functions for AMR data analysis. A warning will be thrown once a session to remind users about this. The data set `rsi_translation` is now called `clinical_breakpoints` to better reflect its content. + +The 'RSI functions' will be removed in a future version, but not before late 2023 / early 2024. + ### Interpretation of MIC and disk diffusion values -The clinical breakpoints and intrinsic resistance of EUCAST 2022 and CLSI 2022 have been added for `as.rsi()`. EUCAST 2022 (v12.0) is now the new default guideline for all MIC and disks diffusion interpretations, and for `eucast_rules()` to apply EUCAST Expert Rules. The default guideline (EUCAST) can now be changed with the new `AMR_guideline` option, such as: `options(AMR_guideline = "CLSI 2020")`. +The clinical breakpoints and intrinsic resistance of EUCAST 2022 and CLSI 2022 have been added for `as.sir()`. EUCAST 2022 (v12.0) is now the new default guideline for all MIC and disks diffusion interpretations, and for `eucast_rules()` to apply EUCAST Expert Rules. The default guideline (EUCAST) can now be changed with the new `AMR_guideline` option, such as: `options(AMR_guideline = "CLSI 2020")`. Interpretation guidelines older than 10 years were removed, the oldest now included guidelines of EUCAST and CLSI are from 2013. @@ -64,7 +73,7 @@ The `antibiotics` data set was greatly updated: * Updated DDDs and PubChem Compound IDs * Updated some antibiotic name spelling, now used by WHOCC (such as cephalexin -> cefalexin, and phenethicillin -> pheneticillin) * Antibiotic code "CEI" for ceftolozane/tazobactam has been replaced with "CZT" to comply with EARS-Net and WHONET 2022. The old code will still work in all cases when using `as.ab()` or any of the `ab_*()` functions. - * Support for antimicrobial interpretation of anaerobic bacteria, by adding a 'placeholder' code `B_ANAER` to the `microorganisms` data set and adding the breakpoints of anaerobics to the `rsi_interpretation` data set, which is used by `as.rsi()` for interpretion of MIC and disk diffusion values + * Support for antimicrobial interpretation of anaerobic bacteria, by adding a 'placeholder' code `B_ANAER` to the `microorganisms` data set and adding the breakpoints of anaerobics to the `clinical_breakpoints` data set, which is used by `as.sir()` for interpretion of MIC and disk diffusion values Also, we added support for using antibiotic selectors in scoped `dplyr` verbs (with or without using `vars()`), such as in: `... %>% summarise_at(aminoglycosides(), resistance)`, please see `resistance()` for examples. @@ -78,22 +87,22 @@ We now added extensive support for antiviral agents! For the first time, the `AM ### Other new functions -* Function `rsi_confidence_interval()` to add confidence intervals in AMR calculation. This is now also included in `rsi_df()` and `proportion_df()`. +* Function `sir_confidence_interval()` to add confidence intervals in AMR calculation. This is now also included in `sir_df()` and `proportion_df()`. * Function `mean_amr_distance()` to calculate the mean AMR distance. The mean AMR distance is a normalised numeric value to compare AMR test results and can help to identify similar isolates, without comparing antibiograms by hand. -* Function `rsi_interpretation_history()` to view the history of previous runs of `as.rsi()`. This returns a 'logbook' with the selected guideline, reference table and specific interpretation of each row in a data set on which `as.rsi()` was run. +* Function `sir_interpretation_history()` to view the history of previous runs of `as.sir()` (previously `as.rsi()`). This returns a 'logbook' with the selected guideline, reference table and specific interpretation of each row in a data set on which `as.sir()` was run. * Function `mo_current()` to get the currently valid taxonomic name of a microorganism * Function `add_custom_antimicrobials()` to add custom antimicrobial codes and names to the `AMR` package ## Changes -* Argument `combine_IR` has been removed from this package (affecting functions `count_df()`, `proportion_df()`, and `rsi_df()` and some plotting functions), since it was replaced with `combine_SI` three years ago +* Argument `combine_IR` has been removed from this package (affecting functions `count_df()`, `proportion_df()`, and `sir_df()` and some plotting functions), since it was replaced with `combine_SI` three years ago * Using `units` in `ab_ddd(..., units = "...")` had been deprecated for some time and is now not supported anymore. Use `ab_ddd_units()` instead. -* Support for `data.frame`-enhancing R packages, more specifically: `data.table::data.table`, `janitor::tabyl`, `tibble::tibble`, and `tsibble::tsibble`. AMR package functions that have a data set as output (such as `rsi_df()` and `bug_drug_combinations()`), will now return the same data type as the input. +* Support for `data.frame`-enhancing R packages, more specifically: `data.table::data.table`, `janitor::tabyl`, `tibble::tibble`, and `tsibble::tsibble`. AMR package functions that have a data set as output (such as `sir_df()` and `bug_drug_combinations()`), will now return the same data type as the input. * All data sets in this package are now a `tibble`, instead of base R `data.frame`s. Older R versions are still supported, even if they do not support `tibble`s. * Our data sets are now also continually exported to **Apache Feather and Apache Parquet formats**. You can find more info [in this article on our website](https://msberends.github.io/AMR/articles/datasets.html). -* For `as.rsi()`: +* For `as.sir()`: * Fixed certain EUCAST breakpoints for MIC values - * Allow `NA` values (e.g. `as.rsi(as.disk(NA), ...)`) + * Allow `NA` values (e.g. `as.sir(as.disk(NA), ...)`) * Fix for bug-drug combinations with multiple breakpoints for different body sites * Interpretation from MIC and disk zones is now more informative about availability of breakpoints and more robust * Removed the `as.integer()` method for MIC values, since MIC are not integer values and running `table()` on MIC values consequently failed for not being able to retrieve the level position (as that's how normally `as.integer()` on `factor`s work) @@ -103,17 +112,17 @@ We now added extensive support for antiviral agents! For the first time, the `AM * Fixes for reading in text files using `set_mo_source()`, which now also allows the source file to contain valid taxonomic names instead of only valid microorganism ID of this package * Fixed a bug for `mdro()` when using similar column names with the Magiorakos guideline * Using any `random_*()` function (such as `random_mic()`) is now possible by directly calling the package without loading it first: `AMR::random_mic(10)` -* Extended support for the `vctrs` package, used internally by the tidyverse. This allows to change values of class `mic`, `disk`, `rsi`, `mo` and `ab` in tibbles, and to use antibiotic selectors for selecting/filtering, e.g. `df[carbapenems() == "R", ]` +* Extended support for the `vctrs` package, used internally by the tidyverse. This allows to change values of class `mic`, `disk`, `sir`, `mo` and `ab` in tibbles, and to use antibiotic selectors for selecting/filtering, e.g. `df[carbapenems() == "R", ]` * Fix for using `info = FALSE` in `mdro()` -* For all interpretation guidelines using `as.rsi()` on amoxicillin, the rules for ampicillin will be used if amoxicillin rules are not available +* For all interpretation guidelines using `as.sir()` on amoxicillin, the rules for ampicillin will be used if amoxicillin rules are not available * Fix for using `ab_atc()` on non-existing ATC codes * Black and white message texts are now reversed in colour if using an RStudio dark theme * `mo_snomed()` now returns class `character`, not `numeric` anymore (to make long SNOMED codes readable) * Fix for using `as.ab()` on `NA` values * Updated support for all WHONET 2022 microorganism codes -* Antimicrobial interpretation 'SDD' (susceptible dose-dependent, coined by CLSI) will be interpreted as 'I' to comply with EUCAST's 'I' in `as.rsi()` +* Antimicrobial interpretation 'SDD' (susceptible dose-dependent, coined by CLSI) will be interpreted as 'I' to comply with EUCAST's 'I' in `as.sir()` * Fix for `mo_shortname()` in case of higher taxonomic ranks (order, class, phylum) -* Cleaning columns with `as.rsi()`, `as.mic()`, or `as.disk()` will now show the column name in the warning for invalid results +* Cleaning columns with `as.sir()`, `as.mic()`, or `as.disk()` will now show the column name in the warning for invalid results ## Other diff --git a/R/aa_amr-package.R b/R/aa_amr-package.R new file mode 100755 index 000000000..106c75d1c --- /dev/null +++ b/R/aa_amr-package.R @@ -0,0 +1,57 @@ +# ==================================================================== # +# TITLE # +# AMR: An R Package for Working with Antimicrobial Resistance Data # +# # +# SOURCE # +# https://github.com/msberends/AMR # +# # +# CITE AS # +# Berends MS, Luz CF, Friedrich AW, Sinha BNM, Albers CJ, Glasner C # +# (2022). AMR: An R Package for Working with Antimicrobial Resistance # +# Data. Journal of Statistical Software, 104(3), 1-31. # +# doi:10.18637/jss.v104.i03 # +# # +# Developed at the University of Groningen and the University Medical # +# Center Groningen in The Netherlands, in collaboration with many # +# colleagues from around the world, see our website. # +# # +# This R package is free software; you can freely use and distribute # +# it for both personal and commercial purposes under the terms of the # +# GNU General Public License version 2.0 (GNU GPL-2), as published by # +# the Free Software Foundation. # +# We created this package for both routine data analysis and academic # +# research and it was publicly released in the hope that it will be # +# useful, but it comes WITHOUT ANY WARRANTY OR LIABILITY. # +# # +# Visit our website for the full manual and a complete tutorial about # +# how to conduct AMR data analysis: https://msberends.github.io/AMR/ # +# ==================================================================== # + +#' The `AMR` Package +#' +#' @description +#' Welcome to the `AMR` package. +#' +#' The `AMR` package is a [free and open-source](https://msberends.github.io/AMR/#copyright) R package with [zero dependencies](https://en.wikipedia.org/wiki/Dependency_hell) to simplify the analysis and prediction of Antimicrobial Resistance (AMR) and to work with microbial and antimicrobial data and properties, by using evidence-based methods. **Our aim is to provide a standard** for clean and reproducible AMR data analysis, that can therefore empower epidemiological analyses to continuously enable surveillance and treatment evaluation in any setting. [Many different researchers](https://msberends.github.io/AMR/authors.html) from around the globe are continually helping us to make this a successful and durable project! +#' +#' This work was published in the Journal of Statistical Software (Volume 104(3); [DOI 10.18637/jss.v104.i03](https://doi.org/10.18637/jss.v104.i03)) and formed the basis of two PhD theses ([DOI 10.33612/diss.177417131](https://doi.org/10.33612/diss.177417131) and [DOI 10.33612/diss.192486375](https://doi.org/10.33612/diss.192486375)). +#' +#' After installing this package, R knows [**`r format_included_data_number(AMR::microorganisms)`**](https://msberends.github.io/AMR/reference/microorganisms.html) (updated December 2022) and all [**~600 antibiotic, antimycotic and antiviral drugs**](https://msberends.github.io/AMR/reference/antibiotics.html) by name and code (including ATC, EARS-Net, ASIARS-Net, PubChem, LOINC and SNOMED CT), and knows all about valid SIR and MIC values. The integral breakpoint guidelines from CLSI and EUCAST are included from the last 10 years. It supports and can read any data format, including WHONET data. This package works on Windows, macOS and Linux with all versions of R since R-3.0 (April 2013). **It was designed to work in any setting, including those with very limited resources**. It was created for both routine data analysis and academic research at the Faculty of Medical Sciences of the [University of Groningen](https://www.rug.nl), in collaboration with non-profit organisations [Certe Medical Diagnostics and Advice Foundation](https://www.certe.nl) and [University Medical Center Groningen](https://www.umcg.nl). +#' +#' The `AMR` package is available in English, Chinese, Danish, Dutch, French, German, Greek, Italian, Japanese, Polish, Portuguese, Russian, Spanish, Swedish, Turkish and Ukrainian. Antimicrobial drug (group) names and colloquial microorganism names are provided in these languages. +#' @section Reference Data Publicly Available: +#' All data sets in this `AMR` package (about microorganisms, antibiotics, SIR interpretation, EUCAST rules, etc.) are publicly and freely available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. We also provide tab-separated plain text files that are machine-readable and suitable for input in any software program, such as laboratory information systems. Please visit [our website for the download links](https://msberends.github.io/AMR/articles/datasets.html). The actual files are of course available on [our GitHub repository](https://github.com/msberends/AMR/tree/main/data-raw). +#' @source +#' To cite AMR in publications use: +#' +#' Berends MS, Luz CF, Friedrich AW, Sinha BNM, Albers CJ, Glasner C (2022). "AMR: An R Package for Working with Antimicrobial Resistance Data." _Journal of Statistical Software_, *104*(3), 1-31. \doi{10.18637/jss.v104.i03}. +#' +#' A BibTeX entry for LaTeX users is: +#' +#' \preformatted{ +#' `r format(citation("AMR"), style = "bib")` +#' } +#' @name AMR +#' @keywords internal +#' @rdname AMR +"_PACKAGE" diff --git a/R/aa_globals.R b/R/aa_globals.R index b3eb77bdb..74e6ffce1 100755 --- a/R/aa_globals.R +++ b/R/aa_globals.R @@ -27,7 +27,7 @@ # how to conduct AMR data analysis: https://msberends.github.io/AMR/ # # ==================================================================== # -# add new version numbers here, and add the rules themselves to "data-raw/eucast_rules.tsv" and rsi_translation +# add new version numbers here, and add the rules themselves to "data-raw/eucast_rules.tsv" and clinical_breakpoints # (sourcing "data-raw/_pre_commit_hook.R" will process the TSV file) EUCAST_VERSION_BREAKPOINTS <- list( "12.0" = list( @@ -148,8 +148,8 @@ globalVariables(c( "reference.rule_group", "reference.version", "rowid", - "rsi", - "rsi_translation", + "sir", + "clinical_breakpoints", "rule_group", "rule_name", "se_max", diff --git a/R/aa_helper_functions.R b/R/aa_helper_functions.R index ef4197c8d..bd0dc6a2b 100755 --- a/R/aa_helper_functions.R +++ b/R/aa_helper_functions.R @@ -225,6 +225,8 @@ search_type_in_df <- function(x, type, info = TRUE) { # -- mo if (type == "mo") { + add_MO_lookup_to_AMR_env() + if (any(vapply(FUN.VALUE = logical(1), x, is.mo))) { # take first 'mo' column found <- colnames(x)[vapply(FUN.VALUE = logical(1), x, is.mo)] @@ -515,7 +517,7 @@ stop_ <- function(..., call = TRUE) { if (isTRUE(call)) { call <- as.character(sys.call(-1)[1]) } else { - # so you can go back more than 1 call, as used in rsi_calc(), that now throws a reference to e.g. n_rsi() + # so you can go back more than 1 call, as used in sir_calc(), that now throws a reference to e.g. n_sir() call <- as.character(sys.call(call)[1]) } msg <- paste0("in ", call, "(): ", msg) @@ -626,7 +628,7 @@ create_eucast_ab_documentation <- function() { # separate drugs, such as `AMX` val <- as.ab(val) } else { - val <- as.rsi(NA) + val <- as.sir(NA) } ab <- c(ab, val) } @@ -666,8 +668,8 @@ vector_or <- function(v, quotes = TRUE, reverse = FALSE, sort = TRUE, initial_ca return(paste0(quotes, v, quotes)) } if (identical(v, c("I", "R", "S"))) { - # class 'rsi' should be sorted like this - v <- c("R", "S", "I") + # class 'sir' should be sorted like this + v <- c("S", "I", "R") } # all commas except for last item, so will become '"val1", "val2", "val3" or "val4"' paste0( @@ -710,7 +712,7 @@ format_class <- function(class, plural = FALSE) { if ("custom_eucast_rules" %in% class) { class <- "input created with `custom_eucast_rules()`" } - if (any(c("mo", "ab", "rsi") %in% class)) { + if (any(c("mo", "ab", "sir") %in% class)) { class <- paste0("of class <", class[1L], ">") } class[class == class.bak] <- paste0("of class <", class[class == class.bak], ">") @@ -1140,18 +1142,18 @@ font_grey_bg <- function(..., collapse = " ") { } } font_red_bg <- function(..., collapse = " ") { - # this is #ed553b (picked to be colourblind-safe with other RSI colours) + # this is #ed553b (picked to be colourblind-safe with other SIR colours) try_colour(font_black(..., collapse = collapse), before = "\033[48;5;203m", after = "\033[49m", collapse = collapse) } font_orange_bg <- function(..., collapse = " ") { - # this is #f6d55c (picked to be colourblind-safe with other RSI colours) + # this is #f6d55c (picked to be colourblind-safe with other SIR colours) try_colour(font_black(..., collapse = collapse), before = "\033[48;5;222m", after = "\033[49m", collapse = collapse) } font_yellow_bg <- function(..., collapse = " ") { try_colour(font_black(..., collapse = collapse), before = "\033[48;5;228m", after = "\033[49m", collapse = collapse) } font_green_bg <- function(..., collapse = " ") { - # this is #3caea3 (picked to be colourblind-safe with other RSI colours) + # this is #3caea3 (picked to be colourblind-safe with other SIR colours) try_colour(font_black(..., collapse = collapse), before = "\033[48;5;79m", after = "\033[49m", collapse = collapse) } font_purple_bg <- function(..., collapse = " ") { @@ -1379,6 +1381,38 @@ add_intrinsic_resistance_to_AMR_env <- function() { } } +add_MO_lookup_to_AMR_env <- function() { + # for all MO functions, saves a lot of time on package load and in package size + if (is.null(AMR_env$MO_lookup)) { + MO_lookup <- AMR::microorganisms + + MO_lookup$kingdom_index <- NA_real_ + MO_lookup[which(MO_lookup$kingdom == "Bacteria" | MO_lookup$mo == "UNKNOWN"), "kingdom_index"] <- 1 + MO_lookup[which(MO_lookup$kingdom == "Fungi"), "kingdom_index"] <- 2 + MO_lookup[which(MO_lookup$kingdom == "Protozoa"), "kingdom_index"] <- 3 + MO_lookup[which(MO_lookup$kingdom == "Archaea"), "kingdom_index"] <- 4 + # all the rest + MO_lookup[which(is.na(MO_lookup$kingdom_index)), "kingdom_index"] <- 5 + + # the fullname lowercase, important for the internal algorithms in as.mo() + MO_lookup$fullname_lower <- tolower(trimws(paste( + MO_lookup$genus, + MO_lookup$species, + MO_lookup$subspecies + ))) + ind <- MO_lookup$genus == "" | grepl("^[(]unknown ", MO_lookup$fullname, perl = TRUE) + MO_lookup[ind, "fullname_lower"] <- tolower(MO_lookup[ind, "fullname", drop = TRUE]) + MO_lookup$fullname_lower <- trimws(gsub("[^.a-z0-9/ \\-]+", "", MO_lookup$fullname_lower, perl = TRUE)) + # special for Salmonella - they have cities as subspecies but not the species (enterica) in the fullname: + MO_lookup$fullname_lower[which(MO_lookup$subspecies %like_case% "^[A-Z]")] <- gsub(" enterica ", " ", MO_lookup$fullname_lower[which(MO_lookup$subspecies %like_case% "^[A-Z]")], fixed = TRUE) + + MO_lookup$full_first <- substr(MO_lookup$fullname_lower, 1, 1) + MO_lookup$species_first <- tolower(substr(MO_lookup$species, 1, 1)) # tolower for groups (Streptococcus, Salmonella) + MO_lookup$subspecies_first <- tolower(substr(MO_lookup$subspecies, 1, 1)) # tolower for Salmonella serovars + AMR_env$MO_lookup <- MO_lookup + } +} + trimws2 <- function(..., whitespace = "[\u0009\u000A\u000B\u000C\u000D\u0020\u0085\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u200B\u200C\u200D\u2028\u2029\u202F\u205F\u2060\u3000\uFEFF]") { # this is even faster than trimws() itself which sets " \t\n\r". trimws(..., whitespace = whitespace) diff --git a/R/ab.R b/R/ab.R index deaba68ff..f80644f61 100755 --- a/R/ab.R +++ b/R/ab.R @@ -88,9 +88,9 @@ #' \donttest{ #' if (require("dplyr")) { #' -#' # you can quickly rename 'rsi' columns using set_ab_names() with dplyr: +#' # you can quickly rename 'sir' columns using set_ab_names() with dplyr: #' example_isolates %>% -#' set_ab_names(where(is.rsi), property = "atc") +#' set_ab_names(where(is.sir), property = "atc") #' } #' } as.ab <- function(x, flag_multiple_results = TRUE, info = interactive(), ...) { @@ -632,7 +632,7 @@ rep.ab <- function(x, ...) { generalise_antibiotic_name <- function(x) { x <- toupper(x) # remove suffices - x <- gsub("_(MIC|RSI|DIS[CK])$", "", x, perl = TRUE) + x <- gsub("_(MIC|RSI|SIR|DIS[CK])$", "", x, perl = TRUE) # remove disk concentrations, like LVX_NM -> LVX x <- gsub("_[A-Z]{2}[0-9_.]{0,3}$", "", x, perl = TRUE) # remove part between brackets if that's followed by another string diff --git a/R/ab_property.R b/R/ab_property.R index 6ed83dbed..1d1560283 100755 --- a/R/ab_property.R +++ b/R/ab_property.R @@ -116,7 +116,7 @@ #' head() #' #' example_isolates %>% -#' set_ab_names(where(is.rsi)) %>% +#' set_ab_names(where(is.sir)) %>% #' colnames() #' #' example_isolates %>% @@ -372,7 +372,7 @@ set_ab_names <- function(data, ..., property = "name", language = get_AMR_locale } else { df <- data } - vars <- get_column_abx(df, info = FALSE, only_rsi_columns = FALSE, sort = FALSE, fn = "set_ab_names") + vars <- get_column_abx(df, info = FALSE, only_sir_columns = FALSE, sort = FALSE, fn = "set_ab_names") if (length(vars) == 0) { message_("No columns with antibiotic results found for `set_ab_names()`, leaving names unchanged.") return(data) diff --git a/R/ab_selectors.R b/R/ab_selectors.R index 89d2d7538..ffcacd783 100755 --- a/R/ab_selectors.R +++ b/R/ab_selectors.R @@ -32,7 +32,7 @@ #' These functions allow for filtering rows and selecting columns based on antibiotic test results that are of a specific antibiotic class or group, without the need to define the columns or antibiotic abbreviations. In short, if you have a column name that resembles an antimicrobial drug, it will be picked up by any of these functions that matches its pharmaceutical class: "cefazolin", "CZO" and "J01DB04" will all be picked up by [cephalosporins()]. #' @param ab_class an antimicrobial class or a part of it, such as `"carba"` and `"carbapenems"`. The columns `group`, `atc_group1` and `atc_group2` of the [antibiotics] data set will be searched (case-insensitive) for this value. #' @param filter an [expression] to be evaluated in the [antibiotics] data set, such as `name %like% "trim"` -#' @param only_rsi_columns a [logical] to indicate whether only columns of class `rsi` must be selected (defaults to `FALSE`), see [as.rsi()] +#' @param only_sir_columns a [logical] to indicate whether only columns of class `sir` must be selected (defaults to `FALSE`), see [as.sir()] #' @param only_treatable a [logical] to indicate whether antimicrobial drugs should be excluded that are only for laboratory tests (defaults to `TRUE`), such as gentamicin-high (`GEH`) and imipenem/EDTA (`IPE`) #' @param ... ignored, only in place to allow future extensions #' @details @@ -188,23 +188,23 @@ #' } #' } ab_class <- function(ab_class, - only_rsi_columns = FALSE, + only_sir_columns = FALSE, only_treatable = TRUE, ...) { meet_criteria(ab_class, allow_class = "character", has_length = 1, allow_NULL = TRUE) - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) meet_criteria(only_treatable, allow_class = "logical", has_length = 1) - ab_select_exec(NULL, only_rsi_columns = only_rsi_columns, ab_class_args = ab_class, only_treatable = only_treatable) + ab_select_exec(NULL, only_sir_columns = only_sir_columns, ab_class_args = ab_class, only_treatable = only_treatable) } #' @rdname antibiotic_class_selectors #' @details The [ab_selector()] function can be used to internally filter the [antibiotics] data set on any results, see *Examples*. It allows for filtering on a (part of) a certain name, and/or a group name or even a minimum of DDDs for oral treatment. This function yields the highest flexibility, but is also the least user-friendly, since it requires a hard-coded filter to set. #' @export ab_selector <- function(filter, - only_rsi_columns = FALSE, + only_sir_columns = FALSE, only_treatable = TRUE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) meet_criteria(only_treatable, allow_class = "logical", has_length = 1) # get_current_data() has to run each time, for cases where e.g., filter() and select() are used in same call @@ -212,7 +212,7 @@ ab_selector <- function(filter, vars_df <- get_current_data(arg_name = NA, call = -2) # to improve speed, get_column_abx() will only run once when e.g. in a select or group call ab_in_data <- get_column_abx(vars_df, - info = FALSE, only_rsi_columns = only_rsi_columns, + info = FALSE, only_sir_columns = only_sir_columns, sort = FALSE, fn = "ab_selector" ) call <- substitute(filter) @@ -234,194 +234,194 @@ ab_selector <- function(filter, #' @rdname antibiotic_class_selectors #' @export -aminoglycosides <- function(only_rsi_columns = FALSE, only_treatable = TRUE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) +aminoglycosides <- function(only_sir_columns = FALSE, only_treatable = TRUE, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) meet_criteria(only_treatable, allow_class = "logical", has_length = 1) - ab_select_exec("aminoglycosides", only_rsi_columns = only_rsi_columns, only_treatable = only_treatable) + ab_select_exec("aminoglycosides", only_sir_columns = only_sir_columns, only_treatable = only_treatable) } #' @rdname antibiotic_class_selectors #' @export -aminopenicillins <- function(only_rsi_columns = FALSE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) - ab_select_exec("aminopenicillins", only_rsi_columns = only_rsi_columns) +aminopenicillins <- function(only_sir_columns = FALSE, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) + ab_select_exec("aminopenicillins", only_sir_columns = only_sir_columns) } #' @rdname antibiotic_class_selectors #' @export -antifungals <- function(only_rsi_columns = FALSE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) - ab_select_exec("antifungals", only_rsi_columns = only_rsi_columns) +antifungals <- function(only_sir_columns = FALSE, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) + ab_select_exec("antifungals", only_sir_columns = only_sir_columns) } #' @rdname antibiotic_class_selectors #' @export -antimycobacterials <- function(only_rsi_columns = FALSE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) - ab_select_exec("antimycobacterials", only_rsi_columns = only_rsi_columns) +antimycobacterials <- function(only_sir_columns = FALSE, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) + ab_select_exec("antimycobacterials", only_sir_columns = only_sir_columns) } #' @rdname antibiotic_class_selectors #' @export -betalactams <- function(only_rsi_columns = FALSE, only_treatable = TRUE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) +betalactams <- function(only_sir_columns = FALSE, only_treatable = TRUE, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) meet_criteria(only_treatable, allow_class = "logical", has_length = 1) - ab_select_exec("betalactams", only_rsi_columns = only_rsi_columns, only_treatable = only_treatable) + ab_select_exec("betalactams", only_sir_columns = only_sir_columns, only_treatable = only_treatable) } #' @rdname antibiotic_class_selectors #' @export -carbapenems <- function(only_rsi_columns = FALSE, only_treatable = TRUE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) +carbapenems <- function(only_sir_columns = FALSE, only_treatable = TRUE, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) meet_criteria(only_treatable, allow_class = "logical", has_length = 1) - ab_select_exec("carbapenems", only_rsi_columns = only_rsi_columns, only_treatable = only_treatable) + ab_select_exec("carbapenems", only_sir_columns = only_sir_columns, only_treatable = only_treatable) } #' @rdname antibiotic_class_selectors #' @export -cephalosporins <- function(only_rsi_columns = FALSE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) - ab_select_exec("cephalosporins", only_rsi_columns = only_rsi_columns) +cephalosporins <- function(only_sir_columns = FALSE, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) + ab_select_exec("cephalosporins", only_sir_columns = only_sir_columns) } #' @rdname antibiotic_class_selectors #' @export -cephalosporins_1st <- function(only_rsi_columns = FALSE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) - ab_select_exec("cephalosporins_1st", only_rsi_columns = only_rsi_columns) +cephalosporins_1st <- function(only_sir_columns = FALSE, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) + ab_select_exec("cephalosporins_1st", only_sir_columns = only_sir_columns) } #' @rdname antibiotic_class_selectors #' @export -cephalosporins_2nd <- function(only_rsi_columns = FALSE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) - ab_select_exec("cephalosporins_2nd", only_rsi_columns = only_rsi_columns) +cephalosporins_2nd <- function(only_sir_columns = FALSE, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) + ab_select_exec("cephalosporins_2nd", only_sir_columns = only_sir_columns) } #' @rdname antibiotic_class_selectors #' @export -cephalosporins_3rd <- function(only_rsi_columns = FALSE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) - ab_select_exec("cephalosporins_3rd", only_rsi_columns = only_rsi_columns) +cephalosporins_3rd <- function(only_sir_columns = FALSE, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) + ab_select_exec("cephalosporins_3rd", only_sir_columns = only_sir_columns) } #' @rdname antibiotic_class_selectors #' @export -cephalosporins_4th <- function(only_rsi_columns = FALSE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) - ab_select_exec("cephalosporins_4th", only_rsi_columns = only_rsi_columns) +cephalosporins_4th <- function(only_sir_columns = FALSE, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) + ab_select_exec("cephalosporins_4th", only_sir_columns = only_sir_columns) } #' @rdname antibiotic_class_selectors #' @export -cephalosporins_5th <- function(only_rsi_columns = FALSE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) - ab_select_exec("cephalosporins_5th", only_rsi_columns = only_rsi_columns) +cephalosporins_5th <- function(only_sir_columns = FALSE, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) + ab_select_exec("cephalosporins_5th", only_sir_columns = only_sir_columns) } #' @rdname antibiotic_class_selectors #' @export -fluoroquinolones <- function(only_rsi_columns = FALSE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) - ab_select_exec("fluoroquinolones", only_rsi_columns = only_rsi_columns) +fluoroquinolones <- function(only_sir_columns = FALSE, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) + ab_select_exec("fluoroquinolones", only_sir_columns = only_sir_columns) } #' @rdname antibiotic_class_selectors #' @export -glycopeptides <- function(only_rsi_columns = FALSE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) - ab_select_exec("glycopeptides", only_rsi_columns = only_rsi_columns) +glycopeptides <- function(only_sir_columns = FALSE, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) + ab_select_exec("glycopeptides", only_sir_columns = only_sir_columns) } #' @rdname antibiotic_class_selectors #' @export -lincosamides <- function(only_rsi_columns = FALSE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) - ab_select_exec("lincosamides", only_rsi_columns = only_rsi_columns) +lincosamides <- function(only_sir_columns = FALSE, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) + ab_select_exec("lincosamides", only_sir_columns = only_sir_columns) } #' @rdname antibiotic_class_selectors #' @export -lipoglycopeptides <- function(only_rsi_columns = FALSE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) - ab_select_exec("lipoglycopeptides", only_rsi_columns = only_rsi_columns) +lipoglycopeptides <- function(only_sir_columns = FALSE, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) + ab_select_exec("lipoglycopeptides", only_sir_columns = only_sir_columns) } #' @rdname antibiotic_class_selectors #' @export -macrolides <- function(only_rsi_columns = FALSE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) - ab_select_exec("macrolides", only_rsi_columns = only_rsi_columns) +macrolides <- function(only_sir_columns = FALSE, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) + ab_select_exec("macrolides", only_sir_columns = only_sir_columns) } #' @rdname antibiotic_class_selectors #' @export -oxazolidinones <- function(only_rsi_columns = FALSE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) - ab_select_exec("oxazolidinones", only_rsi_columns = only_rsi_columns) +oxazolidinones <- function(only_sir_columns = FALSE, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) + ab_select_exec("oxazolidinones", only_sir_columns = only_sir_columns) } #' @rdname antibiotic_class_selectors #' @export -penicillins <- function(only_rsi_columns = FALSE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) - ab_select_exec("penicillins", only_rsi_columns = only_rsi_columns) +penicillins <- function(only_sir_columns = FALSE, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) + ab_select_exec("penicillins", only_sir_columns = only_sir_columns) } #' @rdname antibiotic_class_selectors #' @export -polymyxins <- function(only_rsi_columns = FALSE, only_treatable = TRUE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) +polymyxins <- function(only_sir_columns = FALSE, only_treatable = TRUE, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) meet_criteria(only_treatable, allow_class = "logical", has_length = 1) - ab_select_exec("polymyxins", only_rsi_columns = only_rsi_columns, only_treatable = only_treatable) + ab_select_exec("polymyxins", only_sir_columns = only_sir_columns, only_treatable = only_treatable) } #' @rdname antibiotic_class_selectors #' @export -streptogramins <- function(only_rsi_columns = FALSE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) - ab_select_exec("streptogramins", only_rsi_columns = only_rsi_columns) +streptogramins <- function(only_sir_columns = FALSE, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) + ab_select_exec("streptogramins", only_sir_columns = only_sir_columns) } #' @rdname antibiotic_class_selectors #' @export -quinolones <- function(only_rsi_columns = FALSE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) - ab_select_exec("quinolones", only_rsi_columns = only_rsi_columns) +quinolones <- function(only_sir_columns = FALSE, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) + ab_select_exec("quinolones", only_sir_columns = only_sir_columns) } #' @rdname antibiotic_class_selectors #' @export -tetracyclines <- function(only_rsi_columns = FALSE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) - ab_select_exec("tetracyclines", only_rsi_columns = only_rsi_columns) +tetracyclines <- function(only_sir_columns = FALSE, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) + ab_select_exec("tetracyclines", only_sir_columns = only_sir_columns) } #' @rdname antibiotic_class_selectors #' @export -trimethoprims <- function(only_rsi_columns = FALSE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) - ab_select_exec("trimethoprims", only_rsi_columns = only_rsi_columns) +trimethoprims <- function(only_sir_columns = FALSE, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) + ab_select_exec("trimethoprims", only_sir_columns = only_sir_columns) } #' @rdname antibiotic_class_selectors #' @export -ureidopenicillins <- function(only_rsi_columns = FALSE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) - ab_select_exec("ureidopenicillins", only_rsi_columns = only_rsi_columns) +ureidopenicillins <- function(only_sir_columns = FALSE, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) + ab_select_exec("ureidopenicillins", only_sir_columns = only_sir_columns) } #' @rdname antibiotic_class_selectors #' @details The [administrable_per_os()] and [administrable_iv()] functions also rely on the [antibiotics] data set - antibiotic columns will be matched where a DDD (defined daily dose) for resp. oral and IV treatment is available in the [antibiotics] data set. #' @export -administrable_per_os <- function(only_rsi_columns = FALSE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) +administrable_per_os <- function(only_sir_columns = FALSE, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) # get_current_data() has to run each time, for cases where e.g., filter() and select() are used in same call # but it only takes a couple of milliseconds vars_df <- get_current_data(arg_name = NA, call = -2) # to improve speed, get_column_abx() will only run once when e.g. in a select or group call ab_in_data <- get_column_abx(vars_df, - info = FALSE, only_rsi_columns = only_rsi_columns, + info = FALSE, only_sir_columns = only_sir_columns, sort = FALSE, fn = "administrable_per_os" ) agents_all <- AMR_env$AB_lookup[which(!is.na(AMR_env$AB_lookup$oral_ddd)), "ab", drop = TRUE] @@ -452,14 +452,14 @@ administrable_per_os <- function(only_rsi_columns = FALSE, ...) { #' @rdname antibiotic_class_selectors #' @export -administrable_iv <- function(only_rsi_columns = FALSE, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) +administrable_iv <- function(only_sir_columns = FALSE, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) # get_current_data() has to run each time, for cases where e.g., filter() and select() are used in same call # but it only takes a couple of milliseconds vars_df <- get_current_data(arg_name = NA, call = -2) # to improve speed, get_column_abx() will only run once when e.g. in a select or group call ab_in_data <- get_column_abx(vars_df, - info = FALSE, only_rsi_columns = only_rsi_columns, + info = FALSE, only_sir_columns = only_sir_columns, sort = FALSE, fn = "administrable_iv" ) agents_all <- AMR_env$AB_lookup[which(!is.na(AMR_env$AB_lookup$iv_ddd)), "ab", drop = TRUE] @@ -480,14 +480,14 @@ administrable_iv <- function(only_rsi_columns = FALSE, ...) { #' @inheritParams eucast_rules #' @details The [not_intrinsic_resistant()] function can be used to only select antibiotic columns that pose no intrinsic resistance for the microorganisms in the data set. For example, if a data set contains only microorganism codes or names of *E. coli* and *K. pneumoniae* and contains a column "vancomycin", this column will be removed (or rather, unselected) using this function. It currently applies `r format_eucast_version_nr(names(EUCAST_VERSION_EXPERT_RULES[length(EUCAST_VERSION_EXPERT_RULES)]))` to determine intrinsic resistance, using the [eucast_rules()] function internally. Because of this determination, this function is quite slow in terms of performance. #' @export -not_intrinsic_resistant <- function(only_rsi_columns = FALSE, col_mo = NULL, version_expertrules = 3.3, ...) { - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) +not_intrinsic_resistant <- function(only_sir_columns = FALSE, col_mo = NULL, version_expertrules = 3.3, ...) { + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) # get_current_data() has to run each time, for cases where e.g., filter() and select() are used in same call # but it only takes a couple of milliseconds vars_df <- get_current_data(arg_name = NA, call = -2) # to improve speed, get_column_abx() will only run once when e.g. in a select or group call ab_in_data <- get_column_abx(vars_df, - info = FALSE, only_rsi_columns = only_rsi_columns, + info = FALSE, only_sir_columns = only_sir_columns, sort = FALSE, fn = "not_intrinsic_resistant" ) # intrinsic vars @@ -530,7 +530,7 @@ not_intrinsic_resistant <- function(only_rsi_columns = FALSE, col_mo = NULL, ver } ab_select_exec <- function(function_name, - only_rsi_columns = FALSE, + only_sir_columns = FALSE, only_treatable = FALSE, ab_class_args = NULL) { # get_current_data() has to run each time, for cases where e.g., filter() and select() are used in same call @@ -538,7 +538,7 @@ ab_select_exec <- function(function_name, vars_df <- get_current_data(arg_name = NA, call = -3) # to improve speed, get_column_abx() will only run once when e.g. in a select or group call ab_in_data <- get_column_abx(vars_df, - info = FALSE, only_rsi_columns = only_rsi_columns, + info = FALSE, only_sir_columns = only_sir_columns, sort = FALSE, fn = function_name ) @@ -639,10 +639,10 @@ c.ab_selector <- function(...) { all_any_ab_selector <- function(type, ..., na.rm = TRUE) { cols_ab <- c(...) - result <- cols_ab[toupper(cols_ab) %in% c("R", "S", "I")] + result <- cols_ab[toupper(cols_ab) %in% c("S", "I", "R")] if (length(result) == 0) { - message_("Filtering ", type, " of columns ", vector_and(font_bold(cols_ab, collapse = NULL), quotes = "'"), ' to contain value "R", "S" or "I"') - result <- c("R", "S", "I") + message_("Filtering ", type, " of columns ", vector_and(font_bold(cols_ab, collapse = NULL), quotes = "'"), ' to contain value "S", "I" or "R"') + result <- c("S", "I", "R") } cols_ab <- cols_ab[!cols_ab %in% result] df <- get_current_data(arg_name = NA, call = -3) @@ -751,8 +751,8 @@ any.ab_selector_any_all <- function(..., na.rm = FALSE) { } } # this is `!=`, so turn around the values - rsi <- c("R", "S", "I") - e2 <- rsi[rsi != e2] + sir <- c("S", "I", "R") + e2 <- sir[sir != e2] structure(all_any_ab_selector(type = type, e1, e2), class = c("ab_selector_any_all", "logical") ) diff --git a/R/age.R b/R/age.R index 50910317a..72843e270 100755 --- a/R/age.R +++ b/R/age.R @@ -172,7 +172,7 @@ age <- function(x, reference = Sys.Date(), exact = FALSE, na.rm = FALSE, ...) { #' filter(mo == as.mo("Escherichia coli")) %>% #' group_by(age_group = age_groups(age)) %>% #' select(age_group, CIP) %>% -#' ggplot_rsi( +#' ggplot_sir( #' x = "age_group", #' minimum = 0, #' x.title = "Age Group", diff --git a/R/amr.R b/R/amr.R deleted file mode 100755 index 5032770d3..000000000 --- a/R/amr.R +++ /dev/null @@ -1,76 +0,0 @@ -# ==================================================================== # -# TITLE # -# AMR: An R Package for Working with Antimicrobial Resistance Data # -# # -# SOURCE # -# https://github.com/msberends/AMR # -# # -# CITE AS # -# Berends MS, Luz CF, Friedrich AW, Sinha BNM, Albers CJ, Glasner C # -# (2022). AMR: An R Package for Working with Antimicrobial Resistance # -# Data. Journal of Statistical Software, 104(3), 1-31. # -# doi:10.18637/jss.v104.i03 # -# # -# Developed at the University of Groningen and the University Medical # -# Center Groningen in The Netherlands, in collaboration with many # -# colleagues from around the world, see our website. # -# # -# This R package is free software; you can freely use and distribute # -# it for both personal and commercial purposes under the terms of the # -# GNU General Public License version 2.0 (GNU GPL-2), as published by # -# the Free Software Foundation. # -# We created this package for both routine data analysis and academic # -# research and it was publicly released in the hope that it will be # -# useful, but it comes WITHOUT ANY WARRANTY OR LIABILITY. # -# # -# Visit our website for the full manual and a complete tutorial about # -# how to conduct AMR data analysis: https://msberends.github.io/AMR/ # -# ==================================================================== # - -#' The `AMR` Package -#' -#' @description -#' Welcome to the `AMR` package. -#' -#' `AMR` is a free, open-source and independent \R package to simplify the analysis and prediction of Antimicrobial Resistance (AMR) and to work with microbial and antimicrobial data and properties, by using evidence-based methods. Our aim is to provide a standard for clean and reproducible antimicrobial resistance data analysis, that can therefore empower epidemiological analyses to continuously enable surveillance and treatment evaluation in any setting. -#' -#' This work was published in the Journal of Statistical Software (Volume 104(3); \doi{10.18637/jss.v104.i03}) and formed the basis of two PhD theses (\doi{10.33612/diss.177417131} and \doi{10.33612/diss.192486375}). -#' -#' After installing this package, \R knows `r format_included_data_number(microorganisms)` distinct microbial species and all `r format_included_data_number(rbind(antibiotics[, "name", drop = FALSE], antivirals[, "name", drop = FALSE]))` antibiotic, antimycotic and antiviral drugs by name and code (including ATC, EARS-NET, LOINC and SNOMED CT), and knows all about valid R/SI and MIC values. It supports any data format, including WHONET/EARS-Net data. -#' -#' This package is fully independent of any other \R package and works on Windows, macOS and Linux with all versions of \R since R-3.0.0 (April 2013). It was designed to work in any setting, including those with very limited resources. It was created for both routine data analysis and academic research at the Faculty of Medical Sciences of the University of Groningen, in collaboration with non-profit organisations Certe Medical Diagnostics and Advice and University Medical Center Groningen. This \R package is actively maintained and free software; you can freely use and distribute it for both personal and commercial (but not patent) purposes under the terms of the GNU General Public License version 2.0 (GPL-2), as published by the Free Software Foundation. -#' -#' This package can be used for: -#' - Reference for the taxonomy of microorganisms, since the package contains all microbial (sub)species from the List of Prokaryotic names with Standing in Nomenclature (LPSN) and the Global Biodiversity Information Facility (GBIF) -#' - Interpreting raw MIC and disk diffusion values, based on any CLSI or EUCAST guideline from the last 10 years -#' - Retrieving antimicrobial drug names, doses and forms of administration from clinical health care records -#' - Determining first isolates to be used for AMR data analysis -#' - Calculating antimicrobial resistance -#' - Determining multi-drug resistance (MDR) / multi-drug resistant organisms (MDRO) -#' - Calculating (empirical) susceptibility of both mono therapy and combination therapies -#' - Predicting future antimicrobial resistance using regression models -#' - Getting properties for any microorganism (such as Gram stain, species, genus or family) -#' - Getting properties for any antibiotic (such as name, code of EARS-Net/ATC/LOINC/PubChem, defined daily dose or trade name) -#' - Plotting antimicrobial resistance -#' - Applying EUCAST expert rules -#' - Getting SNOMED codes of a microorganism, or getting properties of a microorganism based on a SNOMED code -#' - Getting LOINC codes of an antibiotic, or getting properties of an antibiotic based on a LOINC code -#' - Machine reading the EUCAST and CLSI guidelines from 2011-2020 to translate MIC values and disk diffusion diameters to R/SI -#' - Principal component analysis for AMR -#' -#' @section Reference Data Publicly Available: -#' All data sets in this `AMR` package (about microorganisms, antibiotics, R/SI interpretation, EUCAST rules, etc.) are publicly and freely available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. We also provide tab-separated plain text files that are machine-readable and suitable for input in any software program, such as laboratory information systems. Please visit [our website for the download links](https://msberends.github.io/AMR/articles/datasets.html). The actual files are of course available on [our GitHub repository](https://github.com/msberends/AMR/tree/main/data-raw). -#' @source -#' To cite AMR in publications use: -#' -#' Berends MS, Luz CF, Friedrich AW, Sinha BNM, Albers CJ, Glasner C (2022). "AMR: An R Package for Working with Antimicrobial Resistance Data." _Journal of Statistical Software_, *104*(3), 1-31. \doi{10.18637/jss.v104.i03}. -#' -#' A BibTeX entry for LaTeX users is: -#' -#' \preformatted{ -#' `r format(citation("AMR"), style = "bib")` -#' } -#' @name AMR -#' @keywords internal -#' @rdname AMR -"_PACKAGE" diff --git a/R/availability.R b/R/availability.R index 671df9f78..43b6cd384 100755 --- a/R/availability.R +++ b/R/availability.R @@ -41,7 +41,7 @@ #' if (require("dplyr")) { #' example_isolates %>% #' filter(mo == as.mo("Escherichia coli")) %>% -#' select_if(is.rsi) %>% +#' select_if(is.sir) %>% #' availability() #' } #' } @@ -55,7 +55,7 @@ availability <- function(tbl, width = NULL) { 1 - sum(is.na(x)) / length(x) }) n <- vapply(FUN.VALUE = double(1), tbl, function(x) length(x[!is.na(x)])) - R <- vapply(FUN.VALUE = double(1), tbl, function(x) ifelse(is.rsi(x), resistance(x, minimum = 0), NA_real_)) + R <- vapply(FUN.VALUE = double(1), tbl, function(x) ifelse(is.sir(x), resistance(x, minimum = 0), NA_real_)) R_print <- character(length(R)) R_print[!is.na(R)] <- percentage(R[!is.na(R)]) R_print[is.na(R)] <- "" diff --git a/R/bug_drug_combinations.R b/R/bug_drug_combinations.R index 01574bdcc..61bc1b1c0 100755 --- a/R/bug_drug_combinations.R +++ b/R/bug_drug_combinations.R @@ -37,7 +37,7 @@ #' @param FUN the function to call on the `mo` column to transform the microorganism codes, defaults to [mo_shortname()] #' @param translate_ab a [character] of length 1 containing column names of the [antibiotics] data set #' @param ... arguments passed on to `FUN` -#' @inheritParams rsi_df +#' @inheritParams sir_df #' @inheritParams base::formatC #' @details The function [format()] calculates the resistance per bug-drug combination. Use `combine_SI = TRUE` (default) to test R vs. S+I and `combine_SI = FALSE` to test R+I vs. S. #' @export @@ -67,7 +67,7 @@ bug_drug_combinations <- function(x, col_mo = NULL, FUN = mo_shortname, ...) { - meet_criteria(x, allow_class = "data.frame", contains_column_class = "rsi") + meet_criteria(x, allow_class = "data.frame", contains_column_class = "sir") meet_criteria(col_mo, allow_class = "character", is_in = colnames(x), has_length = 1, allow_NULL = TRUE) meet_criteria(FUN, allow_class = "function", has_length = 1) @@ -90,10 +90,10 @@ bug_drug_combinations <- function(x, if (is_null_or_grouped_tbl(x.bak)) { data_has_groups <- TRUE groups <- setdiff(names(attributes(x.bak)$groups), ".rows") - x <- x[, c(groups, col_mo, colnames(x)[vapply(FUN.VALUE = logical(1), x, is.rsi)]), drop = FALSE] + x <- x[, c(groups, col_mo, colnames(x)[vapply(FUN.VALUE = logical(1), x, is.sir)]), drop = FALSE] } else { data_has_groups <- FALSE - x <- x[, c(col_mo, names(which(vapply(FUN.VALUE = logical(1), x, is.rsi)))), drop = FALSE] + x <- x[, c(col_mo, names(which(vapply(FUN.VALUE = logical(1), x, is.sir)))), drop = FALSE] } run_it <- function(x) { @@ -113,8 +113,8 @@ bug_drug_combinations <- function(x, } for (i in seq_len(length(unique_mo))) { - # filter on MO group and only select R/SI columns - x_mo_filter <- x[which(x[, col_mo, drop = TRUE] == unique_mo[i]), names(which(vapply(FUN.VALUE = logical(1), x, is.rsi))), drop = FALSE] + # filter on MO group and only select SIR columns + x_mo_filter <- x[which(x[, col_mo, drop = TRUE] == unique_mo[i]), names(which(vapply(FUN.VALUE = logical(1), x, is.sir))), drop = FALSE] # turn and merge everything pivot <- lapply(x_mo_filter, function(x) { m <- as.matrix(table(x)) diff --git a/R/count.R b/R/count.R index 1b835809a..cce82d1d1 100755 --- a/R/count.R +++ b/R/count.R @@ -32,16 +32,16 @@ #' @description These functions can be used to count resistant/susceptible microbial isolates. All functions support quasiquotation with pipes, can be used in `summarise()` from the `dplyr` package and also support grouped variables, see *Examples*. #' #' [count_resistant()] should be used to count resistant isolates, [count_susceptible()] should be used to count susceptible isolates. -#' @param ... one or more vectors (or columns) with antibiotic interpretations. They will be transformed internally with [as.rsi()] if needed. +#' @param ... one or more vectors (or columns) with antibiotic interpretations. They will be transformed internally with [as.sir()] if needed. #' @inheritParams proportion -#' @inheritSection as.rsi Interpretation of R and S/I +#' @inheritSection as.sir Interpretation of SIR #' @details These functions are meant to count isolates. Use the [resistance()]/[susceptibility()] functions to calculate microbial resistance/susceptibility. #' #' The function [count_resistant()] is equal to the function [count_R()]. The function [count_susceptible()] is equal to the function [count_SI()]. #' -#' The function [n_rsi()] is an alias of [count_all()]. They can be used to count all available isolates, i.e. where all input antibiotics have an available result (S, I or R). Their use is equal to `n_distinct()`. Their function is equal to `count_susceptible(...) + count_resistant(...)`. +#' The function [n_sir()] is an alias of [count_all()]. They can be used to count all available isolates, i.e. where all input antibiotics have an available result (S, I or R). Their use is equal to `n_distinct()`. Their function is equal to `count_susceptible(...) + count_resistant(...)`. #' -#' The function [count_df()] takes any variable from `data` that has an [`rsi`] class (created with [as.rsi()]) and counts the number of S's, I's and R's. It also supports grouped variables. The function [rsi_df()] works exactly like [count_df()], but adds the percentage of S, I and R. +#' The function [count_df()] takes any variable from `data` that has an [`sir`] class (created with [as.sir()]) and counts the number of S's, I's and R's. It also supports grouped variables. The function [sir_df()] works exactly like [count_df()], but adds the percentage of S, I and R. #' @inheritSection proportion Combination Therapy #' @seealso [`proportion_*`][proportion] to calculate microbial resistance and susceptibility. #' @return An [integer] @@ -66,14 +66,14 @@ #' #' # Count all available isolates #' count_all(example_isolates$AMX) -#' n_rsi(example_isolates$AMX) +#' n_sir(example_isolates$AMX) #' -#' # n_rsi() is an alias of count_all(). +#' # n_sir() is an alias of count_all(). #' # Since it counts all available isolates, you can #' # calculate back to count e.g. susceptible isolates. #' # These results are the same: #' count_susceptible(example_isolates$AMX) -#' susceptibility(example_isolates$AMX) * n_rsi(example_isolates$AMX) +#' susceptibility(example_isolates$AMX) * n_sir(example_isolates$AMX) #' #' # dplyr ------------------------------------------------------------- #' \donttest{ @@ -85,7 +85,7 @@ #' I = count_I(CIP), #' S = count_S(CIP), #' n1 = count_all(CIP), # the actual total; sum of all three -#' n2 = n_rsi(CIP), # same - analogous to n_distinct +#' n2 = n_sir(CIP), # same - analogous to n_distinct #' total = n() #' ) # NOT the number of tested isolates! #' @@ -93,7 +93,7 @@ #' # (i.e., in this data set columns GEN, TOB, AMK, KAN) #' example_isolates %>% #' group_by(ward) %>% -#' summarise(across(aminoglycosides(), n_rsi)) +#' summarise(across(aminoglycosides(), n_sir)) #' #' # Count co-resistance between amoxicillin/clav acid and gentamicin, #' # so we can see that combination therapy does a lot more than mono therapy. @@ -121,12 +121,12 @@ #' } count_resistant <- function(..., only_all_tested = FALSE) { tryCatch( - rsi_calc(..., + sir_calc(..., ab_result = "R", only_all_tested = only_all_tested, only_count = TRUE ), - error = function(e) stop_(gsub("in rsi_calc(): ", "", e$message, fixed = TRUE), call = -5) + error = function(e) stop_(gsub("in sir_calc(): ", "", e$message, fixed = TRUE), call = -5) ) } @@ -134,12 +134,12 @@ count_resistant <- function(..., only_all_tested = FALSE) { #' @export count_susceptible <- function(..., only_all_tested = FALSE) { tryCatch( - rsi_calc(..., + sir_calc(..., ab_result = c("S", "I"), only_all_tested = only_all_tested, only_count = TRUE ), - error = function(e) stop_(gsub("in rsi_calc(): ", "", e$message, fixed = TRUE), call = -5) + error = function(e) stop_(gsub("in sir_calc(): ", "", e$message, fixed = TRUE), call = -5) ) } @@ -147,12 +147,12 @@ count_susceptible <- function(..., only_all_tested = FALSE) { #' @export count_R <- function(..., only_all_tested = FALSE) { tryCatch( - rsi_calc(..., + sir_calc(..., ab_result = "R", only_all_tested = only_all_tested, only_count = TRUE ), - error = function(e) stop_(gsub("in rsi_calc(): ", "", e$message, fixed = TRUE), call = -5) + error = function(e) stop_(gsub("in sir_calc(): ", "", e$message, fixed = TRUE), call = -5) ) } @@ -163,12 +163,12 @@ count_IR <- function(..., only_all_tested = FALSE) { message_("Using `count_IR()` is discouraged; use `count_resistant()` instead to not consider \"I\" being resistant. This note will be shown once for this session.", as_note = FALSE) } tryCatch( - rsi_calc(..., + sir_calc(..., ab_result = c("I", "R"), only_all_tested = only_all_tested, only_count = TRUE ), - error = function(e) stop_(gsub("in rsi_calc(): ", "", e$message, fixed = TRUE), call = -5) + error = function(e) stop_(gsub("in sir_calc(): ", "", e$message, fixed = TRUE), call = -5) ) } @@ -176,12 +176,12 @@ count_IR <- function(..., only_all_tested = FALSE) { #' @export count_I <- function(..., only_all_tested = FALSE) { tryCatch( - rsi_calc(..., + sir_calc(..., ab_result = "I", only_all_tested = only_all_tested, only_count = TRUE ), - error = function(e) stop_(gsub("in rsi_calc(): ", "", e$message, fixed = TRUE), call = -5) + error = function(e) stop_(gsub("in sir_calc(): ", "", e$message, fixed = TRUE), call = -5) ) } @@ -189,12 +189,12 @@ count_I <- function(..., only_all_tested = FALSE) { #' @export count_SI <- function(..., only_all_tested = FALSE) { tryCatch( - rsi_calc(..., + sir_calc(..., ab_result = c("S", "I"), only_all_tested = only_all_tested, only_count = TRUE ), - error = function(e) stop_(gsub("in rsi_calc(): ", "", e$message, fixed = TRUE), call = -5) + error = function(e) stop_(gsub("in sir_calc(): ", "", e$message, fixed = TRUE), call = -5) ) } @@ -205,12 +205,12 @@ count_S <- function(..., only_all_tested = FALSE) { message_("Using `count_S()` is discouraged; use `count_susceptible()` instead to also consider \"I\" being susceptible. This note will be shown once for this session.", as_note = FALSE) } tryCatch( - rsi_calc(..., + sir_calc(..., ab_result = "S", only_all_tested = only_all_tested, only_count = TRUE ), - error = function(e) stop_(gsub("in rsi_calc(): ", "", e$message, fixed = TRUE), call = -5) + error = function(e) stop_(gsub("in sir_calc(): ", "", e$message, fixed = TRUE), call = -5) ) } @@ -218,18 +218,18 @@ count_S <- function(..., only_all_tested = FALSE) { #' @export count_all <- function(..., only_all_tested = FALSE) { tryCatch( - rsi_calc(..., + sir_calc(..., ab_result = c("S", "I", "R"), only_all_tested = only_all_tested, only_count = TRUE ), - error = function(e) stop_(gsub("in rsi_calc(): ", "", e$message, fixed = TRUE), call = -5) + error = function(e) stop_(gsub("in sir_calc(): ", "", e$message, fixed = TRUE), call = -5) ) } #' @rdname count #' @export -n_rsi <- count_all +n_sir <- count_all #' @rdname count #' @export @@ -238,7 +238,7 @@ count_df <- function(data, language = get_AMR_locale(), combine_SI = TRUE) { tryCatch( - rsi_calc_df( + sir_calc_df( type = "count", data = data, translate_ab = translate_ab, @@ -246,6 +246,6 @@ count_df <- function(data, combine_SI = combine_SI, confidence_level = 0.95 # doesn't matter, will be removed ), - error = function(e) stop_(gsub("in rsi_calc_df(): ", "", e$message, fixed = TRUE), call = -5) + error = function(e) stop_(gsub("in sir_calc_df(): ", "", e$message, fixed = TRUE), call = -5) ) } diff --git a/R/custom_antimicrobials.R b/R/custom_antimicrobials.R index 211cae4ce..78a4f8afa 100755 --- a/R/custom_antimicrobials.R +++ b/R/custom_antimicrobials.R @@ -112,8 +112,8 @@ #' # even antibiotic selectors work #' x <- data.frame( #' random_column = "some value", -#' coflu = as.rsi("S"), -#' ampicillin = as.rsi("R") +#' coflu = as.sir("S"), +#' ampicillin = as.sir("R") #' ) #' x #' x[, betalactams()] @@ -165,7 +165,7 @@ add_custom_antimicrobials <- function(x) { #' @export clear_custom_antimicrobials <- function() { n <- nrow(AMR_env$AB_lookup) - AMR_env$AB_lookup <- create_AB_lookup() + AMR_env$AB_lookup <- cbind(AMR::antibiotics, AB_LOOKUP) n2 <- nrow(AMR_env$AB_lookup) AMR_env$custom_ab_codes <- character(0) AMR_env$ab_previously_coerced <- AMR_env$ab_previously_coerced[which(AMR_env$ab_previously_coerced$ab %in% AMR_env$AB_lookup$ab), , drop = FALSE] diff --git a/R/custom_eucast_rules.R b/R/custom_eucast_rules.R index 8f3e8267c..f77a76d0d 100755 --- a/R/custom_eucast_rules.R +++ b/R/custom_eucast_rules.R @@ -61,9 +61,9 @@ #' #' ```r #' df <- data.frame(mo = c("Escherichia coli", "Klebsiella pneumoniae"), -#' TZP = as.rsi("R"), -#' ampi = as.rsi("S"), -#' cipro = as.rsi("S")) +#' TZP = as.sir("R"), +#' ampi = as.sir("S"), +#' cipro = as.sir("S")) #' df #' #> mo TZP ampi cipro #' #> 1 Escherichia coli R S S @@ -181,10 +181,10 @@ custom_eucast_rules <- function(...) { result_value <- as.character(result)[[3]] result_value[result_value == "NA"] <- NA stop_ifnot( - result_value %in% c("R", "S", "I", NA), - "the resulting value of rule ", i, " must be either \"R\", \"S\", \"I\" or NA" + result_value %in% c("S", "I", "R", NA), + "the resulting value of rule ", i, " must be either \"S\", \"I\", \"R\" or NA" ) - result_value <- as.rsi(result_value) + result_value <- as.sir(result_value) out[[i]]$result_group <- result_group out[[i]]$result_value <- result_value diff --git a/R/custom_microorganisms.R b/R/custom_microorganisms.R index 281014d02..466d392e5 100755 --- a/R/custom_microorganisms.R +++ b/R/custom_microorganisms.R @@ -37,7 +37,7 @@ #' #' There are two ways to automate this process: #' -#' **Method 1:** Using the [option `AMR_custom_mo`][AMR-options], which is the preferred method. To use this method: +#' **Method 1:** Using the option [`AMR_custom_mo`][AMR-options], which is the preferred method. To use this method: #' #' 1. Create a data set in the structure of the [microorganisms] data set (containing at the very least column "genus") and save it with [saveRDS()] to a location of choice, e.g. `"~/my_custom_mo.rds"`, or any remote location. #' @@ -124,6 +124,8 @@ add_custom_microorganisms <- function(x) { meet_criteria(x, allow_class = "data.frame") stop_ifnot("genus" %in% tolower(colnames(x)), paste0("`x` must contain column 'genus'.")) + add_MO_lookup_to_AMR_env() + # remove any extra class/type, such as grouped tbl, or data.table: x <- as.data.frame(x, stringsAsFactors = FALSE) colnames(x) <- tolower(colnames(x)) @@ -269,7 +271,11 @@ add_custom_microorganisms <- function(x) { #' @export clear_custom_microorganisms <- function() { n <- nrow(AMR_env$MO_lookup) - AMR_env$MO_lookup <- create_MO_lookup() + + # reset + AMR_env$MO_lookup <- NULL + add_MO_lookup_to_AMR_env() + n2 <- nrow(AMR_env$MO_lookup) AMR_env$custom_mo_codes <- character(0) AMR_env$mo_previously_coerced <- AMR_env$mo_previously_coerced[which(AMR_env$mo_previously_coerced$mo %in% AMR_env$MO_lookup$mo), , drop = FALSE] diff --git a/R/data.R b/R/data.R index aa293a188..ab81c2419 100755 --- a/R/data.R +++ b/R/data.R @@ -173,7 +173,7 @@ #' - `gender`\cr Gender of the patient, either `r vector_or(example_isolates$gender)` #' - `ward`\cr Ward type where the patient was admitted, either `r vector_or(example_isolates$ward)` #' - `mo`\cr ID of microorganism created with [as.mo()], see also the [microorganisms] data set -#' - `PEN:RIF`\cr `r sum(vapply(FUN.VALUE = logical(1), example_isolates, is.rsi))` different antibiotics with class [`rsi`] (see [as.rsi()]); these column names occur in the [antibiotics] data set and can be translated with [set_ab_names()] or [ab_name()] +#' - `PEN:RIF`\cr `r sum(vapply(FUN.VALUE = logical(1), example_isolates, is.sir))` different antibiotics with class [`sir`] (see [as.sir()]); these column names occur in the [antibiotics] data set and can be translated with [set_ab_names()] or [ab_name()] #' @details #' Like all data sets in this package, this data set is publicly available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. Please visit [our website for the download links](https://msberends.github.io/AMR/articles/datasets.html). The actual files are of course available on [our GitHub repository](https://github.com/msberends/AMR/tree/main/data-raw). #' @examples @@ -188,7 +188,7 @@ #' - `date`\cr date of receipt at the laboratory #' - `hospital`\cr ID of the hospital, from A to C #' - `bacteria`\cr info about microorganism that can be transformed with [as.mo()], see also [microorganisms] -#' - `AMX:GEN`\cr 4 different antibiotics that have to be transformed with [as.rsi()] +#' - `AMX:GEN`\cr 4 different antibiotics that have to be transformed with [as.sir()] #' @details #' Like all data sets in this package, this data set is publicly available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. Please visit [our website for the download links](https://msberends.github.io/AMR/articles/datasets.html). The actual files are of course available on [our GitHub repository](https://github.com/msberends/AMR/tree/main/data-raw). #' @examples @@ -224,19 +224,19 @@ #' - `Inducible clindamycin resistance`\cr Clindamycin can be induced? #' - `Comment`\cr Other comments #' - `Date of data entry`\cr [Date] this data was entered in WHONET -#' - `AMP_ND10:CIP_EE`\cr `r sum(vapply(FUN.VALUE = logical(1), WHONET, is.rsi))` different antibiotics. You can lookup the abbreviations in the [antibiotics] data set, or use e.g. [`ab_name("AMP")`][ab_name()] to get the official name immediately. Before analysis, you should transform this to a valid antibiotic class, using [as.rsi()]. +#' - `AMP_ND10:CIP_EE`\cr `r sum(vapply(FUN.VALUE = logical(1), WHONET, is.sir))` different antibiotics. You can lookup the abbreviations in the [antibiotics] data set, or use e.g. [`ab_name("AMP")`][ab_name()] to get the official name immediately. Before analysis, you should transform this to a valid antibiotic class, using [as.sir()]. #' @details #' Like all data sets in this package, this data set is publicly available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. Please visit [our website for the download links](https://msberends.github.io/AMR/articles/datasets.html). The actual files are of course available on [our GitHub repository](https://github.com/msberends/AMR/tree/main/data-raw). #' @examples #' WHONET "WHONET" -#' Data Set for R/SI Interpretation +#' Data Set with Clinical Breakpoints for SIR Interpretation #' -#' Data set containing reference data to interpret MIC and disk diffusion to R/SI values, according to international guidelines. Currently implemented guidelines are EUCAST (`r min(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "EUCAST")$guideline)))`-`r max(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "EUCAST")$guideline)))`) and CLSI (`r min(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "CLSI")$guideline)))`-`r max(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "CLSI")$guideline)))`). Use [as.rsi()] to transform MICs or disks measurements to R/SI values. -#' @format A [tibble][tibble::tibble] with `r format(nrow(rsi_translation), big.mark = ",")` observations and `r ncol(rsi_translation)` variables: +#' Data set containing clinical breakpoints to interpret MIC and disk diffusion to SIR values, according to international guidelines. Currently implemented guidelines are EUCAST (`r min(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "EUCAST")$guideline)))`-`r max(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "EUCAST")$guideline)))`) and CLSI (`r min(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "CLSI")$guideline)))`-`r max(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "CLSI")$guideline)))`). Use [as.sir()] to transform MICs or disks measurements to SIR values. +#' @format A [tibble][tibble::tibble] with `r format(nrow(clinical_breakpoints), big.mark = ",")` observations and `r ncol(clinical_breakpoints)` variables: #' - `guideline`\cr Name of the guideline -#' - `method`\cr Either `r vector_or(rsi_translation$method)` +#' - `method`\cr Either `r vector_or(clinical_breakpoints$method)` #' - `site`\cr Body site, e.g. "Oral" or "Respiratory" #' - `mo`\cr Microbial ID, see [as.mo()] #' - `rank_index`\cr Taxonomic rank index of `mo` from 1 (subspecies/infraspecies) to 5 (unknown microorganism) @@ -252,8 +252,8 @@ #' They **allow for machine reading EUCAST and CLSI guidelines**, which is almost impossible with the MS Excel and PDF files distributed by EUCAST and CLSI. #' @seealso [intrinsic_resistant] #' @examples -#' rsi_translation -"rsi_translation" +#' clinical_breakpoints +"clinical_breakpoints" #' Data Set with Bacterial Intrinsic Resistance #' diff --git a/R/deprecated.R b/R/deprecated.R deleted file mode 100755 index 6a3ddc60e..000000000 --- a/R/deprecated.R +++ /dev/null @@ -1,36 +0,0 @@ -# ==================================================================== # -# TITLE # -# AMR: An R Package for Working with Antimicrobial Resistance Data # -# # -# SOURCE # -# https://github.com/msberends/AMR # -# # -# CITE AS # -# Berends MS, Luz CF, Friedrich AW, Sinha BNM, Albers CJ, Glasner C # -# (2022). AMR: An R Package for Working with Antimicrobial Resistance # -# Data. Journal of Statistical Software, 104(3), 1-31. # -# doi:10.18637/jss.v104.i03 # -# # -# Developed at the University of Groningen and the University Medical # -# Center Groningen in The Netherlands, in collaboration with many # -# colleagues from around the world, see our website. # -# # -# This R package is free software; you can freely use and distribute # -# it for both personal and commercial purposes under the terms of the # -# GNU General Public License version 2.0 (GNU GPL-2), as published by # -# the Free Software Foundation. # -# We created this package for both routine data analysis and academic # -# research and it was publicly released in the hope that it will be # -# useful, but it comes WITHOUT ANY WARRANTY OR LIABILITY. # -# # -# Visit our website for the full manual and a complete tutorial about # -# how to conduct AMR data analysis: https://msberends.github.io/AMR/ # -# ==================================================================== # - -#' Deprecated Functions -#' -#' These functions are so-called '[Deprecated]'. **They will be removed in a future release.** Using the functions will give a warning with the name of the function it has been replaced by (if there is one). -#' @keywords internal -#' @name AMR-deprecated -# @export -NULL diff --git a/R/disk.R b/R/disk.R index b5a7572bc..5be9ca65d 100755 --- a/R/disk.R +++ b/R/disk.R @@ -33,13 +33,13 @@ #' @rdname as.disk #' @param x vector #' @param na.rm a [logical] indicating whether missing values should be removed -#' @details Interpret disk values as RSI values with [as.rsi()]. It supports guidelines from EUCAST and CLSI. +#' @details Interpret disk values as SIR values with [as.sir()]. It supports guidelines from EUCAST and CLSI. #' #' Disk diffusion growth zone sizes must be between 6 and 50 millimetres. Values higher than 50 but lower than 100 will be maximised to 50. All others input values outside the 6-50 range will return `NA`. #' @return An [integer] with additional class [`disk`] #' @aliases disk #' @export -#' @seealso [as.rsi()] +#' @seealso [as.sir()] #' @examples #' # transform existing disk zones to the `disk` class (using base R) #' df <- data.frame( @@ -59,8 +59,8 @@ #' } #' } #' -#' # interpret disk values, see ?as.rsi -#' as.rsi( +#' # interpret disk values, see ?as.sir +#' as.sir( #' x = as.disk(18), #' mo = "Strep pneu", # `mo` will be coerced with as.mo() #' ab = "ampicillin", # and `ab` with as.ab() @@ -68,7 +68,7 @@ #' ) #' #' # interpret whole data set, pretend to be all from urinary tract infections: -#' as.rsi(df, uti = TRUE) +#' as.sir(df, uti = TRUE) as.disk <- function(x, na.rm = FALSE) { meet_criteria(x, allow_class = c("disk", "character", "numeric", "integer"), allow_NA = TRUE) meet_criteria(na.rm, allow_class = "logical", has_length = 1) diff --git a/R/eucast_rules.R b/R/eucast_rules.R index 70f26fe1b..67171081a 100755 --- a/R/eucast_rules.R +++ b/R/eucast_rules.R @@ -69,11 +69,11 @@ format_eucast_version_nr <- function(version, markdown = TRUE) { #' @param ... column name of an antibiotic, see section *Antibiotics* below #' @param ab any (vector of) text that can be coerced to a valid antibiotic drug code with [as.ab()] #' @param administration route of administration, either `r vector_or(dosage$administration)` -#' @param only_rsi_columns a [logical] to indicate whether only antibiotic columns must be detected that were transformed to class `rsi` (see [as.rsi()]) on beforehand (defaults to `FALSE`) +#' @param only_sir_columns a [logical] to indicate whether only antibiotic columns must be detected that were transformed to class `sir` (see [as.sir()]) on beforehand (defaults to `FALSE`) #' @param custom_rules custom rules to apply, created with [custom_eucast_rules()] #' @inheritParams first_isolate #' @details -#' **Note:** This function does not translate MIC values to RSI values. Use [as.rsi()] for that. \cr +#' **Note:** This function does not translate MIC values to SIR values. Use [as.sir()] for that. \cr #' **Note:** When ampicillin (AMP, J01CA01) is not available but amoxicillin (AMX, J01CA04) is, the latter will be used for all rules where there is a dependency on ampicillin. These drugs are interchangeable when it comes to expression of antimicrobial resistance. \cr #' #' The file containing all EUCAST rules is located here: . **Note:** Old taxonomic names are replaced with the current taxonomy where applicable. For example, *Ochrobactrum anthropi* was renamed to *Brucella anthropi* in 2020; the original EUCAST rules v3.1 and v3.2 did not yet contain this new taxonomic name. The `AMR` package contains the full microbial taxonomy updated until `r documentation_date(max(TAXONOMY_VERSION$GBIF$accessed_date, TAXONOMY_VERSION$LPSN$accessed_date))`, see [microorganisms]. @@ -168,7 +168,7 @@ eucast_rules <- function(x, version_breakpoints = 12.0, version_expertrules = 3.3, ampc_cephalosporin_resistance = NA, - only_rsi_columns = FALSE, + only_sir_columns = FALSE, custom_rules = NULL, ...) { meet_criteria(x, allow_class = "data.frame") @@ -178,10 +178,12 @@ eucast_rules <- function(x, meet_criteria(verbose, allow_class = "logical", has_length = 1) meet_criteria(version_breakpoints, allow_class = c("numeric", "integer"), has_length = 1, is_in = as.double(names(EUCAST_VERSION_BREAKPOINTS))) meet_criteria(version_expertrules, allow_class = c("numeric", "integer"), has_length = 1, is_in = as.double(names(EUCAST_VERSION_EXPERT_RULES))) - meet_criteria(ampc_cephalosporin_resistance, allow_class = c("logical", "character", "rsi"), has_length = 1, allow_NA = TRUE, allow_NULL = TRUE) - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) + meet_criteria(ampc_cephalosporin_resistance, allow_class = c("logical", "character", "sir"), has_length = 1, allow_NA = TRUE, allow_NULL = TRUE) + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) meet_criteria(custom_rules, allow_class = "custom_eucast_rules", allow_NULL = TRUE) + add_MO_lookup_to_AMR_env() + if ("custom" %in% rules && is.null(custom_rules)) { warning_("in `eucast_rules()`: no custom rules were set with the `custom_rules` argument", immediate = TRUE @@ -240,7 +242,7 @@ eucast_rules <- function(x, } warned <- FALSE - warn_lacking_rsi_class <- character(0) + warn_lacking_sir_class <- character(0) txt_ok <- function(n_added, n_changed, warned = FALSE) { if (warned == FALSE) { if (n_added + n_changed == 0) { @@ -309,7 +311,7 @@ eucast_rules <- function(x, hard_dependencies = NULL, verbose = verbose, info = info, - only_rsi_columns = only_rsi_columns, + only_sir_columns = only_sir_columns, fn = "eucast_rules", ... ) @@ -376,11 +378,11 @@ eucast_rules <- function(x, } } } - as.rsi_no_warning <- function(x) { - if (is.rsi(x)) { + as.sir_no_warning <- function(x) { + if (is.sir(x)) { return(x) } - suppressWarnings(as.rsi(x)) + suppressWarnings(as.sir(x)) } # Preparing the data ------------------------------------------------------ @@ -389,8 +391,8 @@ eucast_rules <- function(x, rowid = character(0), col = character(0), mo_fullname = character(0), - old = as.rsi(character(0)), - new = as.rsi(character(0)), + old = as.sir(character(0)), + new = as.sir(character(0)), rule = character(0), rule_group = character(0), rule_name = character(0), @@ -493,14 +495,14 @@ eucast_rules <- function(x, extra_indent = 6 )) } - run_changes <- edit_rsi( + run_changes <- edit_sir( x = x, to = "R", rule = c( rule_current, "Other rules", "", paste0("Non-EUCAST: AMR package v", utils::packageDescription("AMR")$Version) ), - rows = which(as.rsi_no_warning(x[, col_enzyme, drop = TRUE]) == "R"), + rows = which(as.sir_no_warning(x[, col_enzyme, drop = TRUE]) == "R"), cols = col_base, last_verbose_info = verbose_info, original_data = x.bak, @@ -512,7 +514,7 @@ eucast_rules <- function(x, n_changed <- n_changed + run_changes$changed verbose_info <- run_changes$verbose_info x <- run_changes$output - warn_lacking_rsi_class <- c(warn_lacking_rsi_class, run_changes$rsi_warn) + warn_lacking_sir_class <- c(warn_lacking_sir_class, run_changes$sir_warn) # Print number of new changes if (isTRUE(info)) { # print only on last one of rules in this group @@ -534,14 +536,14 @@ eucast_rules <- function(x, extra_indent = 6 )) } - run_changes <- edit_rsi( + run_changes <- edit_sir( x = x, to = "S", rule = c( rule_current, "Other rules", "", paste0("Non-EUCAST: AMR package v", utils::packageDescription("AMR")$Version) ), - rows = which(as.rsi_no_warning(x[, col_base, drop = TRUE]) == "S"), + rows = which(as.sir_no_warning(x[, col_base, drop = TRUE]) == "S"), cols = col_enzyme, last_verbose_info = verbose_info, original_data = x.bak, @@ -553,7 +555,7 @@ eucast_rules <- function(x, n_changed <- n_changed + run_changes$changed verbose_info <- run_changes$verbose_info x <- run_changes$output - warn_lacking_rsi_class <- c(warn_lacking_rsi_class, run_changes$rsi_warn) + warn_lacking_sir_class <- c(warn_lacking_sir_class, run_changes$sir_warn) # Print number of new changes if (isTRUE(info)) { # print only on last one of rules in this group @@ -788,21 +790,21 @@ eucast_rules <- function(x, rows <- integer(0) } else if (length(source_antibiotics) == 1) { rows <- tryCatch(which(x[, if_mo_property, drop = TRUE] %like% mo_value & - as.rsi_no_warning(x[, source_antibiotics[1L]]) == source_value[1L]), + as.sir_no_warning(x[, source_antibiotics[1L]]) == source_value[1L]), error = function(e) integer(0) ) } else if (length(source_antibiotics) == 2) { rows <- tryCatch(which(x[, if_mo_property, drop = TRUE] %like% mo_value & - as.rsi_no_warning(x[, source_antibiotics[1L]]) == source_value[1L] & - as.rsi_no_warning(x[, source_antibiotics[2L]]) == source_value[2L]), + as.sir_no_warning(x[, source_antibiotics[1L]]) == source_value[1L] & + as.sir_no_warning(x[, source_antibiotics[2L]]) == source_value[2L]), error = function(e) integer(0) ) # nolint start # } else if (length(source_antibiotics) == 3) { # rows <- tryCatch(which(x[, if_mo_property, drop = TRUE] %like% mo_value - # & as.rsi_no_warning(x[, source_antibiotics[1L]]) == source_value[1L] - # & as.rsi_no_warning(x[, source_antibiotics[2L]]) == source_value[2L] - # & as.rsi_no_warning(x[, source_antibiotics[3L]]) == source_value[3L]), + # & as.sir_no_warning(x[, source_antibiotics[1L]]) == source_value[1L] + # & as.sir_no_warning(x[, source_antibiotics[2L]]) == source_value[2L] + # & as.sir_no_warning(x[, source_antibiotics[3L]]) == source_value[3L]), # error = function(e) integer(0)) # nolint end } else { @@ -814,7 +816,7 @@ eucast_rules <- function(x, # Apply rule on data ------------------------------------------------------ # this will return the unique number of changes - run_changes <- edit_rsi( + run_changes <- edit_sir( x = x, to = target_value, rule = c( @@ -836,7 +838,7 @@ eucast_rules <- function(x, n_changed <- n_changed + run_changes$changed verbose_info <- run_changes$verbose_info x <- run_changes$output - warn_lacking_rsi_class <- c(warn_lacking_rsi_class, run_changes$rsi_warn) + warn_lacking_sir_class <- c(warn_lacking_sir_class, run_changes$sir_warn) # Print number of new changes --------------------------------------------- if (isTRUE(info) && rule_next != rule_current) { # print only on last one of rules in this group @@ -878,7 +880,7 @@ eucast_rules <- function(x, )) warned <- FALSE } - run_changes <- edit_rsi( + run_changes <- edit_sir( x = x, to = target_value, rule = c( @@ -902,7 +904,7 @@ eucast_rules <- function(x, n_changed <- n_changed + run_changes$changed verbose_info <- run_changes$verbose_info x <- run_changes$output - warn_lacking_rsi_class <- c(warn_lacking_rsi_class, run_changes$rsi_warn) + warn_lacking_sir_class <- c(warn_lacking_sir_class, run_changes$sir_warn) # Print number of new changes --------------------------------------------- if (isTRUE(info) && rule_next != rule_current) { # print only on last one of rules in this group @@ -1017,19 +1019,19 @@ eucast_rules <- function(x, } } - if (length(warn_lacking_rsi_class) > 0) { - warn_lacking_rsi_class <- unique(warn_lacking_rsi_class) + if (length(warn_lacking_sir_class) > 0) { + warn_lacking_sir_class <- unique(warn_lacking_sir_class) # take order from original data set - warn_lacking_rsi_class <- warn_lacking_rsi_class[order(colnames(x.bak))] - warn_lacking_rsi_class <- warn_lacking_rsi_class[!is.na(warn_lacking_rsi_class)] + warn_lacking_sir_class <- warn_lacking_sir_class[order(colnames(x.bak))] + warn_lacking_sir_class <- warn_lacking_sir_class[!is.na(warn_lacking_sir_class)] warning_( - "in `eucast_rules()`: not all columns with antimicrobial results are of class 'rsi'. Transform them on beforehand, with e.g.:\n", - " - ", x_deparsed, " %>% as.rsi(", ifelse(length(warn_lacking_rsi_class) == 1, - warn_lacking_rsi_class, - paste0(warn_lacking_rsi_class[1], ":", warn_lacking_rsi_class[length(warn_lacking_rsi_class)]) + "in `eucast_rules()`: not all columns with antimicrobial results are of class 'sir'. Transform them on beforehand, with e.g.:\n", + " - ", x_deparsed, " %>% as.sir(", ifelse(length(warn_lacking_sir_class) == 1, + warn_lacking_sir_class, + paste0(warn_lacking_sir_class[1], ":", warn_lacking_sir_class[length(warn_lacking_sir_class)]) ), ")\n", - " - ", x_deparsed, " %>% mutate_if(is.rsi.eligible, as.rsi)\n", - " - ", x_deparsed, " %>% mutate(across(where(is.rsi.eligible), as.rsi))" + " - ", x_deparsed, " %>% mutate_if(is_sir_eligible, as.sir)\n", + " - ", x_deparsed, " %>% mutate(across(where(is_sir_eligible), as.sir))" ) } @@ -1051,7 +1053,7 @@ eucast_rules <- function(x, } # helper function for editing the table ---- -edit_rsi <- function(x, +edit_sir <- function(x, to, rule, rows, @@ -1069,7 +1071,7 @@ edit_rsi <- function(x, changed = 0, output = x, verbose_info = last_verbose_info, - rsi_warn = character(0) + sir_warn = character(0) ) txt_error <- function() { @@ -1084,8 +1086,8 @@ edit_rsi <- function(x, if (length(rows) > 0 && length(cols) > 0) { new_edits <- x - if (any(!vapply(FUN.VALUE = logical(1), x[, cols, drop = FALSE], is.rsi), na.rm = TRUE)) { - track_changes$rsi_warn <- cols[!vapply(FUN.VALUE = logical(1), x[, cols, drop = FALSE], is.rsi)] + if (any(!vapply(FUN.VALUE = logical(1), x[, cols, drop = FALSE], is.sir), na.rm = TRUE)) { + track_changes$sir_warn <- cols[!vapply(FUN.VALUE = logical(1), x[, cols, drop = FALSE], is.sir)] } tryCatch( # insert into original table diff --git a/R/first_isolate.R b/R/first_isolate.R index 882afae12..06eaf8dff 100755 --- a/R/first_isolate.R +++ b/R/first_isolate.R @@ -48,7 +48,7 @@ #' @param points_threshold minimum number of points to require before differences in the antibiogram will lead to inclusion of an isolate when `type = "points"`, see *Details* #' @param info a [logical] to indicate info should be printed, defaults to `TRUE` only in interactive mode #' @param include_unknown a [logical] to indicate whether 'unknown' microorganisms should be included too, i.e. microbial code `"UNKNOWN"`, which defaults to `FALSE`. For WHONET users, this means that all records with organism code `"con"` (*contamination*) will be excluded at default. Isolates with a microbial ID of `NA` will always be excluded as first isolate. -#' @param include_untested_rsi a [logical] to indicate whether also rows without antibiotic results are still eligible for becoming a first isolate. Use `include_untested_rsi = FALSE` to always return `FALSE` for such rows. This checks the data set for columns of class `rsi` and consequently requires transforming columns with antibiotic results using [as.rsi()] first. +#' @param include_untested_sir a [logical] to indicate whether also rows without antibiotic results are still eligible for becoming a first isolate. Use `include_untested_sir = FALSE` to always return `FALSE` for such rows. This checks the data set for columns of class `sir` and consequently requires transforming columns with antibiotic results using [as.sir()] first. #' @param ... arguments passed on to [first_isolate()] when using [filter_first_isolate()], otherwise arguments passed on to [key_antimicrobials()] (such as `universal`, `gram_negative`, `gram_positive`) #' @details #' To conduct epidemiological analyses on antimicrobial resistance data, only so-called first isolates should be included to prevent overestimation and underestimation of antimicrobial resistance. Different methods can be used to do so, see below. @@ -176,7 +176,7 @@ first_isolate <- function(x = NULL, points_threshold = 2, info = interactive(), include_unknown = FALSE, - include_untested_rsi = TRUE, + include_untested_sir = TRUE, ...) { if (is_null_or_grouped_tbl(x)) { # when `x` is left blank, auto determine it (get_current_data() also contains dplyr::cur_data_all()) @@ -228,19 +228,19 @@ first_isolate <- function(x = NULL, meet_criteria(points_threshold, allow_class = c("numeric", "integer"), has_length = 1, is_positive = TRUE, is_finite = TRUE) meet_criteria(info, allow_class = "logical", has_length = 1) meet_criteria(include_unknown, allow_class = "logical", has_length = 1) - meet_criteria(include_untested_rsi, allow_class = "logical", has_length = 1) + meet_criteria(include_untested_sir, allow_class = "logical", has_length = 1) # remove data.table, grouping from tibbles, etc. x <- as.data.frame(x, stringsAsFactors = FALSE) - any_col_contains_rsi <- any(vapply( + any_col_contains_sir <- any(vapply( FUN.VALUE = logical(1), X = x, # check only first 10,000 rows - FUN = function(x) any(as.character(x[1:10000]) %in% c("R", "S", "I"), na.rm = TRUE), + FUN = function(x) any(as.character(x[1:10000]) %in% c("S", "I", "R"), na.rm = TRUE), USE.NAMES = FALSE )) - if (method == "phenotype-based" && !any_col_contains_rsi) { + if (method == "phenotype-based" && !any_col_contains_sir) { method <- "episode-based" } if (isTRUE(info) && message_not_thrown_before("first_isolate", "method")) { @@ -285,13 +285,13 @@ first_isolate <- function(x = NULL, type <- "keyantimicrobials" } if (type == "points") { - x$keyantimicrobials <- all_antimicrobials(x, only_rsi_columns = FALSE) + x$keyantimicrobials <- all_antimicrobials(x, only_sir_columns = FALSE) col_keyantimicrobials <- "keyantimicrobials" } else if (type == "keyantimicrobials" && is.null(col_keyantimicrobials)) { col_keyantimicrobials <- search_type_in_df(x = x, type = "keyantimicrobials", info = info) if (is.null(col_keyantimicrobials)) { # still not found as a column, create it ourselves - x$keyantimicrobials <- key_antimicrobials(x, only_rsi_columns = FALSE, col_mo = col_mo, ...) + x$keyantimicrobials <- key_antimicrobials(x, only_sir_columns = FALSE, col_mo = col_mo, ...) col_keyantimicrobials <- "keyantimicrobials" } } @@ -581,13 +581,13 @@ first_isolate <- function(x = NULL, x[which(is.na(x$newvar_mo)), "newvar_first_isolate"] <- FALSE # handle isolates without antibiogram - if (include_untested_rsi == FALSE && any(is.rsi(x))) { - rsi_all_NA <- which(unname(vapply( + if (include_untested_sir == FALSE && any(is.sir(x))) { + sir_all_NA <- which(unname(vapply( FUN.VALUE = logical(1), - as.data.frame(t(x[, is.rsi(x), drop = FALSE])), - function(rsi_values) all(is.na(rsi_values)) + as.data.frame(t(x[, is.sir(x), drop = FALSE])), + function(sir_values) all(is.na(sir_values)) ))) - x[rsi_all_NA, "newvar_first_isolate"] <- FALSE + x[sir_all_NA, "newvar_first_isolate"] <- FALSE } # arrange back according to original sorting again diff --git a/R/ggplot_pca.R b/R/ggplot_pca.R index a0c1f5a7d..3c541003d 100755 --- a/R/ggplot_pca.R +++ b/R/ggplot_pca.R @@ -76,7 +76,7 @@ #' genus = mo_genus(mo) #' ) %>% # and genus as we do here; #' filter(n() >= 30) %>% # filter on only 30 results per group -#' summarise_if(is.rsi, resistance) # then get resistance of all drugs +#' summarise_if(is.sir, resistance) # then get resistance of all drugs #' #' # now conduct PCA for certain antimicrobial drugs #' pca_result <- resistance_data %>% diff --git a/R/ggplot_rsi.R b/R/ggplot_sir.R similarity index 90% rename from R/ggplot_rsi.R rename to R/ggplot_sir.R index 14d435e52..dd9dade43 100755 --- a/R/ggplot_rsi.R +++ b/R/ggplot_sir.R @@ -30,7 +30,7 @@ #' AMR Plots with `ggplot2` #' #' Use these functions to create bar plots for AMR data analysis. All functions rely on [ggplot2][ggplot2::ggplot()] functions. -#' @param data a [data.frame] with column(s) of class [`rsi`] (see [as.rsi()]) +#' @param data a [data.frame] with column(s) of class [`sir`] (see [as.sir()]) #' @param position position adjustment of bars, either `"fill"`, `"stack"` or `"dodge"` #' @param x variable to show on x axis, either `"antibiotic"` (default) or `"interpretation"` or a grouping variable #' @param fill variable to categorise using the plots legend, either `"antibiotic"` (default) or `"interpretation"` or a grouping variable @@ -41,7 +41,7 @@ #' @param nrow (when using `facet`) number of rows #' @param colours a named vactor with colour to be used for filling. The default colours are colour-blind friendly. #' @param aesthetics aesthetics to apply the colours to, defaults to "fill" but can also be (a combination of) "alpha", "colour", "fill", "linetype", "shape" or "size" -#' @param datalabels show datalabels using [labels_rsi_count()] +#' @param datalabels show datalabels using [labels_sir_count()] #' @param datalabels.size size of the datalabels #' @param datalabels.colour colour of the datalabels #' @param title text to show as title of the plot @@ -49,24 +49,24 @@ #' @param caption text to show as caption of the plot #' @param x.title text to show as x axis description #' @param y.title text to show as y axis description -#' @param ... other arguments passed on to [geom_rsi()] or, in case of [scale_rsi_colours()], named values to set colours. The default colours are colour-blind friendly, while maintaining the convention that e.g. 'susceptible' should be green and 'resistant' should be red. See *Examples*. +#' @param ... other arguments passed on to [geom_sir()] or, in case of [scale_sir_colours()], named values to set colours. The default colours are colour-blind friendly, while maintaining the convention that e.g. 'susceptible' should be green and 'resistant' should be red. See *Examples*. #' @details At default, the names of antibiotics will be shown on the plots using [ab_name()]. This can be set with the `translate_ab` argument. See [count_df()]. #' #' ### The Functions -#' [geom_rsi()] will take any variable from the data that has an [`rsi`] class (created with [as.rsi()]) using [rsi_df()] and will plot bars with the percentage R, I and S. The default behaviour is to have the bars stacked and to have the different antibiotics on the x axis. +#' [geom_sir()] will take any variable from the data that has an [`sir`] class (created with [as.sir()]) using [sir_df()] and will plot bars with the percentage S, I, and R. The default behaviour is to have the bars stacked and to have the different antibiotics on the x axis. #' -#' [facet_rsi()] creates 2d plots (at default based on S/I/R) using [ggplot2::facet_wrap()]. +#' [facet_sir()] creates 2d plots (at default based on S/I/R) using [ggplot2::facet_wrap()]. #' #' [scale_y_percent()] transforms the y axis to a 0 to 100% range using [ggplot2::scale_y_continuous()]. #' -#' [scale_rsi_colours()] sets colours to the bars (green for S, yellow for I, and red for R). with multilingual support. The default colours are colour-blind friendly, while maintaining the convention that e.g. 'susceptible' should be green and 'resistant' should be red. +#' [scale_sir_colours()] sets colours to the bars (green for S, yellow for I, and red for R). with multilingual support. The default colours are colour-blind friendly, while maintaining the convention that e.g. 'susceptible' should be green and 'resistant' should be red. #' -#' [theme_rsi()] is a [ggplot2 theme][[ggplot2::theme()] with minimal distraction. +#' [theme_sir()] is a [ggplot2 theme][[ggplot2::theme()] with minimal distraction. #' -#' [labels_rsi_count()] print datalabels on the bars with percentage and amount of isolates using [ggplot2::geom_text()]. +#' [labels_sir_count()] print datalabels on the bars with percentage and amount of isolates using [ggplot2::geom_text()]. #' -#' [ggplot_rsi()] is a wrapper around all above functions that uses data as first input. This makes it possible to use this function after a pipe (`%>%`). See *Examples*. -#' @rdname ggplot_rsi +#' [ggplot_sir()] is a wrapper around all above functions that uses data as first input. This makes it possible to use this function after a pipe (`%>%`). See *Examples*. +#' @rdname ggplot_sir #' @export #' @examples #' \donttest{ @@ -74,39 +74,39 @@ #' #' # get antimicrobial results for drugs against a UTI: #' ggplot(example_isolates %>% select(AMX, NIT, FOS, TMP, CIP)) + -#' geom_rsi() +#' geom_sir() #' } #' if (require("ggplot2") && require("dplyr")) { #' #' # prettify the plot using some additional functions: #' df <- example_isolates %>% select(AMX, NIT, FOS, TMP, CIP) #' ggplot(df) + -#' geom_rsi() + +#' geom_sir() + #' scale_y_percent() + -#' scale_rsi_colours() + -#' labels_rsi_count() + -#' theme_rsi() +#' scale_sir_colours() + +#' labels_sir_count() + +#' theme_sir() #' } #' if (require("ggplot2") && require("dplyr")) { #' #' # or better yet, simplify this using the wrapper function - a single command: #' example_isolates %>% #' select(AMX, NIT, FOS, TMP, CIP) %>% -#' ggplot_rsi() +#' ggplot_sir() #' } #' if (require("ggplot2") && require("dplyr")) { #' #' # get only proportions and no counts: #' example_isolates %>% #' select(AMX, NIT, FOS, TMP, CIP) %>% -#' ggplot_rsi(datalabels = FALSE) +#' ggplot_sir(datalabels = FALSE) #' } #' if (require("ggplot2") && require("dplyr")) { #' #' # add other ggplot2 arguments as you like: #' example_isolates %>% #' select(AMX, NIT, FOS, TMP, CIP) %>% -#' ggplot_rsi( +#' ggplot_sir( #' width = 0.5, #' colour = "black", #' size = 1, @@ -119,7 +119,7 @@ #' # you can alter the colours with colour names: #' example_isolates %>% #' select(AMX) %>% -#' ggplot_rsi(colours = c(SI = "yellow")) +#' ggplot_sir(colours = c(SI = "yellow")) #' } #' if (require("ggplot2") && require("dplyr")) { #' @@ -132,7 +132,7 @@ #' ) %>% #' ggplot() + #' geom_col(aes(x = x, y = y, fill = z)) + -#' scale_rsi_colours(Value4 = "S", Value5 = "I", Value6 = "R") +#' scale_sir_colours(Value4 = "S", Value5 = "I", Value6 = "R") #' } #' if (require("ggplot2") && require("dplyr")) { #' @@ -146,14 +146,14 @@ #' # age_groups() is also a function in this AMR package: #' group_by(age_group = age_groups(age)) %>% #' select(age_group, CIP) %>% -#' ggplot_rsi(x = "age_group") +#' ggplot_sir(x = "age_group") #' } #' if (require("ggplot2") && require("dplyr")) { #' #' # a shorter version which also adjusts data label colours: #' example_isolates %>% #' select(AMX, NIT, FOS, TMP, CIP) %>% -#' ggplot_rsi(colours = FALSE) +#' ggplot_sir(colours = FALSE) #' } #' if (require("ggplot2") && require("dplyr")) { #' @@ -163,7 +163,7 @@ #' # select only UTI-specific drugs #' select(ward, AMX, NIT, FOS, TMP, CIP) %>% #' group_by(ward) %>% -#' ggplot_rsi( +#' ggplot_sir( #' x = "ward", #' facet = "antibiotic", #' nrow = 1, @@ -173,7 +173,7 @@ #' ) #' } #' } -ggplot_rsi <- function(data, +ggplot_sir <- function(data, position = NULL, x = "antibiotic", fill = "interpretation", @@ -203,7 +203,7 @@ ggplot_rsi <- function(data, y.title = "Proportion", ...) { stop_ifnot_installed("ggplot2") - meet_criteria(data, allow_class = "data.frame", contains_column_class = "rsi") + meet_criteria(data, allow_class = "data.frame", contains_column_class = "sir") meet_criteria(position, allow_class = "character", has_length = 1, is_in = c("fill", "stack", "dodge"), allow_NULL = TRUE) meet_criteria(x, allow_class = "character", has_length = 1) meet_criteria(fill, allow_class = "character", has_length = 1) @@ -249,15 +249,15 @@ ggplot_rsi <- function(data, } p <- ggplot2::ggplot(data = data) + - geom_rsi( + geom_sir( position = position, x = x, fill = fill, translate_ab = translate_ab, minimum = minimum, language = language, combine_SI = combine_SI, ... ) + - theme_rsi() + theme_sir() if (fill == "interpretation") { - p <- p + scale_rsi_colours(colours = colours) + p <- p + scale_sir_colours(colours = colours) } if (identical(position, "fill")) { @@ -266,7 +266,7 @@ ggplot_rsi <- function(data, } if (datalabels == TRUE) { - p <- p + labels_rsi_count( + p <- p + labels_sir_count( position = position, x = x, translate_ab = translate_ab, @@ -279,7 +279,7 @@ ggplot_rsi <- function(data, } if (!is.null(facet)) { - p <- p + facet_rsi(facet = facet, nrow = nrow) + p <- p + facet_sir(facet = facet, nrow = nrow) } p <- p + ggplot2::labs( @@ -293,9 +293,9 @@ ggplot_rsi <- function(data, p } -#' @rdname ggplot_rsi +#' @rdname ggplot_sir #' @export -geom_rsi <- function(position = NULL, +geom_sir <- function(position = NULL, x = c("antibiotic", "interpretation"), fill = "interpretation", translate_ab = "name", @@ -334,13 +334,13 @@ geom_rsi <- function(position = NULL, if (tolower(x) %in% tolower(c("ab", "abx", "antibiotics"))) { x <- "antibiotic" - } else if (tolower(x) %in% tolower(c("SIR", "RSI", "interpretations", "result"))) { + } else if (tolower(x) %in% tolower(c("SIR", "sir", "interpretations", "result"))) { x <- "interpretation" } ggplot2::geom_col( data = function(x) { - rsi_df( + sir_df( data = x, translate_ab = translate_ab, language = language, @@ -354,9 +354,9 @@ geom_rsi <- function(position = NULL, ) } -#' @rdname ggplot_rsi +#' @rdname ggplot_sir #' @export -facet_rsi <- function(facet = c("interpretation", "antibiotic"), nrow = NULL) { +facet_sir <- function(facet = c("interpretation", "antibiotic"), nrow = NULL) { facet <- facet[1] stop_ifnot_installed("ggplot2") meet_criteria(facet, allow_class = "character", has_length = 1) @@ -371,7 +371,7 @@ facet_rsi <- function(facet = c("interpretation", "antibiotic"), nrow = NULL) { facet <- substr(facet, 2, nchar(facet) - 1) } - if (tolower(facet) %in% tolower(c("SIR", "RSI", "interpretations", "result"))) { + if (tolower(facet) %in% tolower(c("SIR", "sir", "interpretations", "result"))) { facet <- "interpretation" } else if (tolower(facet) %in% tolower(c("ab", "abx", "antibiotics"))) { facet <- "antibiotic" @@ -380,7 +380,7 @@ facet_rsi <- function(facet = c("interpretation", "antibiotic"), nrow = NULL) { ggplot2::facet_wrap(facets = facet, scales = "free_x", nrow = nrow) } -#' @rdname ggplot_rsi +#' @rdname ggplot_sir #' @export scale_y_percent <- function(breaks = seq(0, 1, 0.1), limits = NULL) { stop_ifnot_installed("ggplot2") @@ -397,13 +397,13 @@ scale_y_percent <- function(breaks = seq(0, 1, 0.1), limits = NULL) { ) } -#' @rdname ggplot_rsi +#' @rdname ggplot_sir #' @export -scale_rsi_colours <- function(..., +scale_sir_colours <- function(..., aesthetics = "fill") { stop_ifnot_installed("ggplot2") meet_criteria(aesthetics, allow_class = "character", is_in = c("alpha", "colour", "color", "fill", "linetype", "shape", "size")) - # behaviour until AMR pkg v1.5.0 and also when coming from ggplot_rsi() + # behaviour until AMR pkg v1.5.0 and also when coming from ggplot_sir() if ("colours" %in% names(list(...))) { original_cols <- c( S = "#3CAEA3", @@ -457,7 +457,7 @@ scale_rsi_colours <- function(..., original_cols <- c(susceptible, incr_exposure, resistant) dots <- c(...) - # replace S, I, R as colours: scale_rsi_colours(mydatavalue = "S") + # replace S, I, R as colours: scale_sir_colours(mydatavalue = "S") dots[dots == "S"] <- "#3CAEA3" dots[dots == "I"] <- "#F6D55C" dots[dots == "R"] <- "#ED553B" @@ -467,9 +467,9 @@ scale_rsi_colours <- function(..., ggplot2::scale_discrete_manual(aesthetics = aesthetics, values = cols, limits = force) } -#' @rdname ggplot_rsi +#' @rdname ggplot_sir #' @export -theme_rsi <- function() { +theme_sir <- function() { stop_ifnot_installed("ggplot2") ggplot2::theme_minimal(base_size = 10) + ggplot2::theme( @@ -482,9 +482,9 @@ theme_rsi <- function() { ) } -#' @rdname ggplot_rsi +#' @rdname ggplot_sir #' @export -labels_rsi_count <- function(position = NULL, +labels_sir_count <- function(position = NULL, x = "antibiotic", translate_ab = "name", minimum = 30, @@ -521,7 +521,7 @@ labels_rsi_count <- function(position = NULL, colour = datalabels.colour, lineheight = 0.75, data = function(x) { - transformed <- rsi_df( + transformed <- sir_df( data = x, translate_ab = translate_ab, combine_SI = combine_SI, diff --git a/R/guess_ab_col.R b/R/guess_ab_col.R index dc6dccbac..e14341d58 100755 --- a/R/guess_ab_col.R +++ b/R/guess_ab_col.R @@ -33,7 +33,7 @@ #' @param x a [data.frame] #' @param search_string a text to search `x` for, will be checked with [as.ab()] if this value is not a column in `x` #' @param verbose a [logical] to indicate whether additional info should be printed -#' @param only_rsi_columns a [logical] to indicate whether only antibiotic columns must be detected that were transformed to class `rsi` (see [as.rsi()]) on beforehand (defaults to `FALSE`) +#' @param only_sir_columns a [logical] to indicate whether only antibiotic columns must be detected that were transformed to class `sir` (see [as.sir()]) on beforehand (defaults to `FALSE`) #' @details You can look for an antibiotic (trade) name or abbreviation and it will search `x` and the [antibiotics] data set for any column containing a name or code of that antibiotic. #' @return A column name of `x`, or `NULL` when no result is found. #' @export @@ -57,11 +57,11 @@ #' guess_ab_col(df, "ampicillin") #' guess_ab_col(df, "J01CR02") #' guess_ab_col(df, as.ab("augmentin")) -guess_ab_col <- function(x = NULL, search_string = NULL, verbose = FALSE, only_rsi_columns = FALSE) { +guess_ab_col <- function(x = NULL, search_string = NULL, verbose = FALSE, only_sir_columns = FALSE) { meet_criteria(x, allow_class = "data.frame", allow_NULL = TRUE) meet_criteria(search_string, allow_class = "character", has_length = 1, allow_NULL = TRUE) meet_criteria(verbose, allow_class = "logical", has_length = 1) - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) if (is.null(x) && is.null(search_string)) { return(as.name("guess_ab_col")) @@ -70,7 +70,7 @@ guess_ab_col <- function(x = NULL, search_string = NULL, verbose = FALSE, only_r } all_found <- get_column_abx(x, - info = verbose, only_rsi_columns = only_rsi_columns, + info = verbose, only_sir_columns = only_sir_columns, verbose = verbose, fn = "guess_ab_col" ) search_string.ab <- suppressWarnings(as.ab(search_string)) @@ -102,7 +102,7 @@ get_column_abx <- function(x, hard_dependencies = NULL, verbose = FALSE, info = TRUE, - only_rsi_columns = FALSE, + only_sir_columns = FALSE, sort = TRUE, reuse_previous_result = TRUE, fn = NULL) { @@ -125,8 +125,8 @@ get_column_abx <- function(x, new_cols <- colnames(x)[!colnames(x) %in% AMR_env$get_column_abx.checked_cols] if (length(new_cols) > 0) { # these columns did not exist in the last call, so add them - new_cols_rsi <- get_column_abx(x[, new_cols, drop = FALSE], reuse_previous_result = FALSE, info = FALSE, sort = FALSE) - current <- c(current, new_cols_rsi) + new_cols_sir <- get_column_abx(x[, new_cols, drop = FALSE], reuse_previous_result = FALSE, info = FALSE, sort = FALSE) + current <- c(current, new_cols_sir) # order according to columns in current call current <- current[match(colnames(x)[colnames(x) %in% current], current)] } @@ -144,7 +144,7 @@ get_column_abx <- function(x, meet_criteria(hard_dependencies, allow_class = "character", allow_NULL = TRUE) meet_criteria(verbose, allow_class = "logical", has_length = 1) meet_criteria(info, allow_class = "logical", has_length = 1) - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) meet_criteria(sort, allow_class = "logical", has_length = 1) if (isTRUE(info)) { @@ -153,8 +153,8 @@ get_column_abx <- function(x, x <- as.data.frame(x, stringsAsFactors = FALSE) x.bak <- x - if (only_rsi_columns == TRUE) { - x <- x[, which(is.rsi(x)), drop = FALSE] + if (only_sir_columns == TRUE) { + x <- x[, which(is.sir(x)), drop = FALSE] } if (NROW(x) > 10000) { @@ -171,7 +171,7 @@ get_column_abx <- function(x, } # only check columns that are a valid AB code, ATC code, name, abbreviation or synonym, - # or already have the 'rsi' class (as.rsi) + # or already have the 'sir' class (as.sir) # and that they have no more than 50% invalid values vectr_antibiotics <- unlist(AMR_env$AB_lookup$generalised_all) vectr_antibiotics <- vectr_antibiotics[!is.na(vectr_antibiotics) & nchar(vectr_antibiotics) >= 3] @@ -180,8 +180,8 @@ get_column_abx <- function(x, colnames(x), function(col, df = x) { if (generalise_antibiotic_name(col) %in% vectr_antibiotics || - is.rsi(x[, col, drop = TRUE]) || - is.rsi.eligible(x[, col, drop = TRUE], threshold = 0.5) + is.sir(x[, col, drop = TRUE]) || + is_sir_eligible(x[, col, drop = TRUE], threshold = 0.5) ) { return(col) } else { diff --git a/R/italicise_taxonomy.R b/R/italicise_taxonomy.R index 652bc0330..7e9758bef 100755 --- a/R/italicise_taxonomy.R +++ b/R/italicise_taxonomy.R @@ -51,6 +51,8 @@ italicise_taxonomy <- function(string, type = c("markdown", "ansi")) { meet_criteria(string, allow_class = "character") meet_criteria(type, allow_class = "character", has_length = 1, is_in = c("markdown", "ansi")) + add_MO_lookup_to_AMR_env() + if (type == "markdown") { before <- "*" after <- "*" diff --git a/R/join_microorganisms.R b/R/join_microorganisms.R index da93fa502..b29d6542a 100755 --- a/R/join_microorganisms.R +++ b/R/join_microorganisms.R @@ -127,6 +127,8 @@ anti_join_microorganisms <- function(x, by = NULL, ...) { } join_microorganisms <- function(type, x, by, suffix, ...) { + add_MO_lookup_to_AMR_env() + if (!is.data.frame(x)) { if (pkg_is_available("tibble", also_load = FALSE)) { x <- import_fn("tibble", "tibble")(mo = x) diff --git a/R/key_antimicrobials.R b/R/key_antimicrobials.R index 27236092a..875c5e654 100755 --- a/R/key_antimicrobials.R +++ b/R/key_antimicrobials.R @@ -37,7 +37,7 @@ #' @param gram_negative names of antibiotic drugs for **Gram-positives**, case-insensitive. Set to `NULL` to ignore. See *Details* for the default antibiotic drugs #' @param gram_positive names of antibiotic drugs for **Gram-negatives**, case-insensitive. Set to `NULL` to ignore. See *Details* for the default antibiotic drugs #' @param antifungal names of antifungal drugs for **fungi**, case-insensitive. Set to `NULL` to ignore. See *Details* for the default antifungal drugs -#' @param only_rsi_columns a [logical] to indicate whether only columns must be included that were transformed to class `rsi` (see [as.rsi()]) on beforehand (defaults to `FALSE`) +#' @param only_sir_columns a [logical] to indicate whether only columns must be included that were transformed to class `sir` (see [as.sir()]) on beforehand (defaults to `FALSE`) #' @param ... ignored, only in place to allow future extensions #' @details #' The [key_antimicrobials()] and [all_antimicrobials()] functions are context-aware. This means that the `x` argument can be left blank if used inside a [data.frame] call, see *Examples*. @@ -135,7 +135,7 @@ key_antimicrobials <- function(x = NULL, "anidulafungin", "caspofungin", "fluconazole", "miconazole", "nystatin", "voriconazole" ), - only_rsi_columns = FALSE, + only_sir_columns = FALSE, ...) { if (is_null_or_grouped_tbl(x)) { # when `x` is left blank, auto determine it (get_current_data() also contains dplyr::cur_data_all()) @@ -148,11 +148,11 @@ key_antimicrobials <- function(x = NULL, meet_criteria(gram_negative, allow_class = "character", allow_NULL = TRUE) meet_criteria(gram_positive, allow_class = "character", allow_NULL = TRUE) meet_criteria(antifungal, allow_class = "character", allow_NULL = TRUE) - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) # force regular data.frame, not a tibble or data.table x <- as.data.frame(x, stringsAsFactors = FALSE) - cols <- get_column_abx(x, info = FALSE, only_rsi_columns = only_rsi_columns, fn = "key_antimicrobials") + cols <- get_column_abx(x, info = FALSE, only_sir_columns = only_sir_columns, fn = "key_antimicrobials") # try to find columns based on type # -- mo @@ -247,7 +247,7 @@ key_antimicrobials <- function(x = NULL, #' @rdname key_antimicrobials #' @export all_antimicrobials <- function(x = NULL, - only_rsi_columns = FALSE, + only_sir_columns = FALSE, ...) { if (is_null_or_grouped_tbl(x)) { # when `x` is left blank, auto determine it (get_current_data() also contains dplyr::cur_data_all()) @@ -255,12 +255,12 @@ all_antimicrobials <- function(x = NULL, x <- tryCatch(get_current_data(arg_name = "x", call = -2), error = function(e) x) } meet_criteria(x, allow_class = "data.frame") # also checks dimensions to be >0 - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) # force regular data.frame, not a tibble or data.table x <- as.data.frame(x, stringsAsFactors = FALSE) cols <- get_column_abx(x, - only_rsi_columns = only_rsi_columns, info = FALSE, + only_sir_columns = only_sir_columns, info = FALSE, sort = FALSE, fn = "all_antimicrobials" ) @@ -282,7 +282,7 @@ generate_antimcrobials_string <- function(df) { as.list(df), function(x) { x <- toupper(as.character(x)) - x[!x %in% c("R", "S", "I")] <- "." + x[!x %in% c("S", "I", "R")] <- "." paste(x) } ) @@ -308,7 +308,7 @@ antimicrobials_equal <- function(y, meet_criteria(points_threshold, allow_class = c("numeric", "integer"), has_length = 1, is_positive = TRUE, is_finite = TRUE) stop_ifnot(length(y) == length(z), "length of `y` and `z` must be equal") - key2rsi <- function(val) { + key2sir <- function(val) { val <- strsplit(val, "", fixed = TRUE)[[1L]] val.int <- rep(NA_real_, length(val)) val.int[val == "S"] <- 1 @@ -318,7 +318,7 @@ antimicrobials_equal <- function(y, } # only run on uniques uniq <- unique(c(y, z)) - uniq_list <- lapply(uniq, key2rsi) + uniq_list <- lapply(uniq, key2sir) names(uniq_list) <- uniq y <- uniq_list[match(y, names(uniq_list))] @@ -339,12 +339,12 @@ antimicrobials_equal <- function(y, # - no change is 0 points # - I <-> S|R is 0.5 point # - S|R <-> R|S is 1 point - # use the levels of as.rsi (S = 1, I = 2, R = 3) + # use the levels of as.sir (S = 1, I = 2, R = 3) # and divide by 2 (S = 0.5, I = 1, R = 1.5) (sum(abs(a - b), na.rm = TRUE) / 2) < points_threshold } else { if (ignore_I == TRUE) { - ind <- which(a == 2 | b == 2) # since as.double(as.rsi("I")) == 2 + ind <- which(a == 2 | b == 2) # since as.double(as.sir("I")) == 2 a[ind] <- NA_real_ b[ind] <- NA_real_ } diff --git a/R/mdro.R b/R/mdro.R index ee17a05c3..8c2f4bd29 100755 --- a/R/mdro.R +++ b/R/mdro.R @@ -127,7 +127,7 @@ #' ``` #' #' The rules set (the `custom` object in this case) could be exported to a shared file location using [saveRDS()] if you collaborate with multiple users. The custom rules set could then be imported using [readRDS()]. -#' @inheritSection as.rsi Interpretation of R and S/I +#' @inheritSection as.sir Interpretation of SIR #' @return #' - CMI 2012 paper - function [mdr_cmi2012()] or [mdro()]:\cr #' Ordered [factor] with levels `Negative` < `Multi-drug-resistant (MDR)` < `Extensively drug-resistant (XDR)` < `Pandrug-resistant (PDR)` @@ -175,7 +175,7 @@ mdro <- function(x = NULL, pct_required_classes = 0.5, combine_SI = TRUE, verbose = FALSE, - only_rsi_columns = FALSE, + only_sir_columns = FALSE, ...) { if (is_null_or_grouped_tbl(x)) { # when `x` is left blank, auto determine it (get_current_data() also contains dplyr::cur_data_all()) @@ -192,10 +192,10 @@ mdro <- function(x = NULL, meet_criteria(pct_required_classes, allow_class = "numeric", has_length = 1) meet_criteria(combine_SI, allow_class = "logical", has_length = 1) meet_criteria(verbose, allow_class = "logical", has_length = 1) - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) - if (!any(is.rsi.eligible(x))) { - stop_("There were no possible R/SI columns found in the data set. Transform columns with `as.rsi()` for valid antimicrobial interpretations.") + if (!any(is_sir_eligible(x))) { + stop_("There were no possible SIR columns found in the data set. Transform columns with `as.sir()` for valid antimicrobial interpretations.") } info.bak <- info @@ -325,7 +325,7 @@ mdro <- function(x = NULL, "No column found as input for `col_mo`, ", font_bold(paste0("assuming all rows contain ", font_italic("Mycobacterium tuberculosis"), ".")) ) - x$mo <- as.mo("Mycobacterium tuberculosis") # consider overkill at all times: AMR_env$MO_lookup[which(AMR_env$MO_lookup$fullname == "Mycobacterium tuberculosis"), "mo", drop = TRUE] + x$mo <- as.mo("Mycobacterium tuberculosis", keep_synonyms = TRUE) col_mo <- "mo" } stop_if(is.null(col_mo), "`col_mo` must be set") @@ -382,226 +382,60 @@ mdro <- function(x = NULL, cols_ab <- get_column_abx( x = x, soft_dependencies = c( - # [table] 1 (S aureus): - "GEN", - "RIF", - "CPT", - "OXA", - "CIP", - "MFX", - "SXT", - "FUS", - "VAN", - "TEC", - "TLV", - "TGC", - "CLI", - "DAP", - "ERY", - "LNZ", - "CHL", - "FOS", - "QDA", - "TCY", - "DOX", - "MNO", + # [table] 1 (S aureus) + "GEN", "RIF", "CPT", "OXA", "CIP", "MFX", "SXT", "FUS", "VAN", "TEC", "TLV", "TGC", "CLI", "DAP", "ERY", "LNZ", "CHL", "FOS", "QDA", "TCY", "DOX", "MNO", # [table] 2 (Enterococcus) - "GEH", - "STH", - "IPM", - "MEM", - "DOR", - "CIP", - "LVX", - "MFX", - "VAN", - "TEC", - "TGC", - "DAP", - "LNZ", - "AMP", - "QDA", - "DOX", - "MNO", + "GEH", "STH", "IPM", "MEM", "DOR", "CIP", "LVX", "MFX", "VAN", "TEC", "TGC", "DAP", "LNZ", "AMP", "QDA", "DOX", "MNO", # [table] 3 (Enterobacteriaceae) - "GEN", - "TOB", - "AMK", - "NET", - "CPT", - "TCC", - "TZP", - "ETP", - "IPM", - "MEM", - "DOR", - "CZO", - "CXM", - "CTX", - "CAZ", - "FEP", - "FOX", - "CTT", - "CIP", - "SXT", - "TGC", - "ATM", - "AMP", - "AMC", - "SAM", - "CHL", - "FOS", - "COL", - "TCY", - "DOX", - "MNO", + "GEN", "TOB", "AMK", "NET", "CPT", "TCC", "TZP", "ETP", "IPM", "MEM", "DOR", "CZO", "CXM", "CTX", "CAZ", "FEP", "FOX", "CTT", "CIP", "SXT", "TGC", "ATM", "AMP", "AMC", "SAM", "CHL", "FOS", "COL", "TCY", "DOX", "MNO", # [table] 4 (Pseudomonas) - "GEN", - "TOB", - "AMK", - "NET", - "IPM", - "MEM", - "DOR", - "CAZ", - "FEP", - "CIP", - "LVX", - "TCC", - "TZP", - "ATM", - "FOS", - "COL", - "PLB", + "GEN", "TOB", "AMK", "NET", "IPM", "MEM", "DOR", "CAZ", "FEP", "CIP", "LVX", "TCC", "TZP", "ATM", "FOS", "COL", "PLB", # [table] 5 (Acinetobacter) - "GEN", - "TOB", - "AMK", - "NET", - "IPM", - "MEM", - "DOR", - "CIP", - "LVX", - "TZP", - "TCC", - "CTX", - "CRO", - "CAZ", - "FEP", - "SXT", - "SAM", - "COL", - "PLB", - "TCY", - "DOX", - "MNO" + "GEN", "TOB", "AMK", "NET", "IPM", "MEM", "DOR", "CIP", "LVX", "TZP", "TCC", "CTX", "CRO", "CAZ", "FEP", "SXT", "SAM", "COL", "PLB", "TCY", "DOX", "MNO" ), verbose = verbose, info = info, - only_rsi_columns = only_rsi_columns, + only_sir_columns = only_sir_columns, fn = "mdro", ... ) } else if (guideline$code == "eucast3.2") { cols_ab <- get_column_abx( x = x, - soft_dependencies = c( - "AMP", - "AMX", - "CIP", - "DAL", - "DAP", - "ERV", - "FDX", - "GEN", - "LNZ", - "MEM", - "MTR", - "OMC", - "ORI", - "PEN", - "QDA", - "RIF", - "TEC", - "TGC", - "TLV", - "TOB", - "TZD", - "VAN" - ), + soft_dependencies = c("AMP", "AMX", "CIP", "DAL", "DAP", "ERV", "FDX", "GEN", "LNZ", "MEM", "MTR", "OMC", "ORI", "PEN", "QDA", "RIF", "TEC", "TGC", "TLV", "TOB", "TZD", "VAN"), verbose = verbose, info = info, - only_rsi_columns = only_rsi_columns, + only_sir_columns = only_sir_columns, fn = "mdro", ... ) } else if (guideline$code == "eucast3.3") { cols_ab <- get_column_abx( x = x, - soft_dependencies = c( - "AMP", - "AMX", - "CIP", - "DAL", - "DAP", - "ERV", - "FDX", - "GEN", - "LNZ", - "MEM", - "MTR", - "OMC", - "ORI", - "PEN", - "QDA", - "RIF", - "TEC", - "TGC", - "TLV", - "TOB", - "TZD", - "VAN" - ), + soft_dependencies = c("AMP", "AMX", "CIP", "DAL", "DAP", "ERV", "FDX", "GEN", "LNZ", "MEM", "MTR", "OMC", "ORI", "PEN", "QDA", "RIF", "TEC", "TGC", "TLV", "TOB", "TZD", "VAN"), verbose = verbose, info = info, - only_rsi_columns = only_rsi_columns, + only_sir_columns = only_sir_columns, fn = "mdro", ... ) } else if (guideline$code == "tb") { cols_ab <- get_column_abx( x = x, - soft_dependencies = c( - "CAP", - "ETH", - "GAT", - "INH", - "PZA", - "RIF", - "RIB", - "RFP" - ), + soft_dependencies = c("CAP", "ETH", "GAT", "INH", "PZA", "RIF", "RIB", "RFP"), verbose = verbose, info = info, - only_rsi_columns = only_rsi_columns, + only_sir_columns = only_sir_columns, fn = "mdro", ... ) } else if (guideline$code == "mrgn") { cols_ab <- get_column_abx( x = x, - soft_dependencies = c( - "PIP", - "CTX", - "CAZ", - "IPM", - "MEM", - "CIP" - ), + soft_dependencies = c("PIP", "CTX", "CAZ", "IPM", "MEM", "CIP"), verbose = verbose, info = info, - only_rsi_columns = only_rsi_columns, + only_sir_columns = only_sir_columns, fn = "mdro", ... ) @@ -610,7 +444,7 @@ mdro <- function(x = NULL, x = x, verbose = verbose, info = info, - only_rsi_columns = only_rsi_columns, + only_sir_columns = only_sir_columns, fn = "mdro", ... ) @@ -823,7 +657,7 @@ mdro <- function(x = NULL, if (length(rows) > 0 && length(cols) > 0) { x[, cols] <- as.data.frame(lapply( x[, cols, drop = FALSE], - function(col) as.rsi(col) + function(col) as.sir(col) ), stringsAsFactors = FALSE ) @@ -883,7 +717,7 @@ mdro <- function(x = NULL, x[, lst_vector] <- as.data.frame(lapply( x[, lst_vector, drop = FALSE], - function(col) as.rsi(col) + function(col) as.sir(col) ), stringsAsFactors = FALSE ) @@ -1675,7 +1509,7 @@ mdro <- function(x = NULL, ab <- x[, ab, drop = TRUE] } } - ab <- as.character(as.rsi(ab)) + ab <- as.character(as.sir(ab)) ab[is.na(ab)] <- "" ab } @@ -1998,7 +1832,7 @@ run_custom_mdro_guideline <- function(df, guideline, info) { out <- factor(out, levels = attributes(guideline)$values, ordered = TRUE) } - columns_nonsusceptible <- as.data.frame(t(df[, is.rsi(df), drop = FALSE] == "R")) + columns_nonsusceptible <- as.data.frame(t(df[, is.sir(df), drop = FALSE] == "R")) columns_nonsusceptible <- vapply( FUN.VALUE = character(1), columns_nonsusceptible, @@ -2017,60 +1851,60 @@ run_custom_mdro_guideline <- function(df, guideline, info) { #' @rdname mdro #' @export -brmo <- function(x = NULL, only_rsi_columns = FALSE, ...) { +brmo <- function(x = NULL, only_sir_columns = FALSE, ...) { meet_criteria(x, allow_class = "data.frame", allow_NULL = TRUE) - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) stop_if( "guideline" %in% names(list(...)), "argument `guideline` must not be set since this is a guideline-specific function" ) - mdro(x = x, only_rsi_columns = only_rsi_columns, guideline = "BRMO", ...) + mdro(x = x, only_sir_columns = only_sir_columns, guideline = "BRMO", ...) } #' @rdname mdro #' @export -mrgn <- function(x = NULL, only_rsi_columns = FALSE, ...) { +mrgn <- function(x = NULL, only_sir_columns = FALSE, ...) { meet_criteria(x, allow_class = "data.frame", allow_NULL = TRUE) - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) stop_if( "guideline" %in% names(list(...)), "argument `guideline` must not be set since this is a guideline-specific function" ) - mdro(x = x, only_rsi_columns = only_rsi_columns, guideline = "MRGN", ...) + mdro(x = x, only_sir_columns = only_sir_columns, guideline = "MRGN", ...) } #' @rdname mdro #' @export -mdr_tb <- function(x = NULL, only_rsi_columns = FALSE, ...) { +mdr_tb <- function(x = NULL, only_sir_columns = FALSE, ...) { meet_criteria(x, allow_class = "data.frame", allow_NULL = TRUE) - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) stop_if( "guideline" %in% names(list(...)), "argument `guideline` must not be set since this is a guideline-specific function" ) - mdro(x = x, only_rsi_columns = only_rsi_columns, guideline = "TB", ...) + mdro(x = x, only_sir_columns = only_sir_columns, guideline = "TB", ...) } #' @rdname mdro #' @export -mdr_cmi2012 <- function(x = NULL, only_rsi_columns = FALSE, ...) { +mdr_cmi2012 <- function(x = NULL, only_sir_columns = FALSE, ...) { meet_criteria(x, allow_class = "data.frame", allow_NULL = TRUE) - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) stop_if( "guideline" %in% names(list(...)), "argument `guideline` must not be set since this is a guideline-specific function" ) - mdro(x = x, only_rsi_columns = only_rsi_columns, guideline = "CMI2012", ...) + mdro(x = x, only_sir_columns = only_sir_columns, guideline = "CMI2012", ...) } #' @rdname mdro #' @export -eucast_exceptional_phenotypes <- function(x = NULL, only_rsi_columns = FALSE, ...) { +eucast_exceptional_phenotypes <- function(x = NULL, only_sir_columns = FALSE, ...) { meet_criteria(x, allow_class = "data.frame", allow_NULL = TRUE) - meet_criteria(only_rsi_columns, allow_class = "logical", has_length = 1) + meet_criteria(only_sir_columns, allow_class = "logical", has_length = 1) stop_if( "guideline" %in% names(list(...)), "argument `guideline` must not be set since this is a guideline-specific function" ) - mdro(x = x, only_rsi_columns = only_rsi_columns, guideline = "EUCAST", ...) + mdro(x = x, only_sir_columns = only_sir_columns, guideline = "EUCAST", ...) } diff --git a/R/mean_amr_distance.R b/R/mean_amr_distance.R index 591c6bfc8..218e36da3 100755 --- a/R/mean_amr_distance.R +++ b/R/mean_amr_distance.R @@ -30,14 +30,14 @@ #' Calculate the Mean AMR Distance #' #' Calculates a normalised mean for antimicrobial resistance between multiple observations, to help to identify similar isolates without comparing antibiograms by hand. -#' @param x a vector of class [rsi][as.rsi()], [mic][as.mic()] or [disk][as.disk()], or a [data.frame] containing columns of any of these classes +#' @param x a vector of class [sir][as.sir()], [mic][as.mic()] or [disk][as.disk()], or a [data.frame] containing columns of any of these classes #' @param ... variables to select (supports [tidyselect language][tidyselect::language] such as `column1:column4` and `where(is.mic)`, and can thus also be [antibiotic selectors][ab_selector()] #' @param combine_SI a [logical] to indicate whether all values of S and I must be merged into one, so the input only consists of S+I vs. R (susceptible vs. resistant), defaults to `TRUE` #' @details The mean AMR distance is effectively [the Z-score](https://en.wikipedia.org/wiki/Standard_score); a normalised numeric value to compare AMR test results which can help to identify similar isolates, without comparing antibiograms by hand. #' #' MIC values (see [as.mic()]) are transformed with [log2()] first; their distance is thus calculated as `(log2(x) - mean(log2(x))) / sd(log2(x))`. #' -#' R/SI values (see [as.rsi()]) are transformed using `"S"` = 1, `"I"` = 2, and `"R"` = 3. If `combine_SI` is `TRUE` (default), the `"I"` will be considered to be 1. +#' SIR values (see [as.sir()]) are transformed using `"S"` = 1, `"I"` = 2, and `"R"` = 3. If `combine_SI` is `TRUE` (default), the `"I"` will be considered to be 1. #' #' For data sets, the mean AMR distance will be calculated per column, after which the mean per row will be returned, see *Examples*. #' @@ -46,9 +46,9 @@ #' Isolates with distances less than 0.01 difference from each other should be considered similar. Differences lower than 0.025 should be considered suspicious. #' @export #' @examples -#' rsi <- random_rsi(10) -#' rsi -#' mean_amr_distance(rsi) +#' sir <- random_sir(10) +#' sir +#' mean_amr_distance(sir) #' #' mic <- random_mic(10) #' mic @@ -62,7 +62,7 @@ #' #' y <- data.frame( #' id = LETTERS[1:10], -#' amox = random_rsi(10, ab = "amox", mo = "Escherichia coli"), +#' amox = random_sir(10, ab = "amox", mo = "Escherichia coli"), #' cipr = random_disk(10, ab = "cipr", mo = "Escherichia coli"), #' gent = random_mic(10, ab = "gent", mo = "Escherichia coli"), #' tobr = random_mic(10, ab = "tobr", mo = "Escherichia coli") @@ -115,7 +115,7 @@ mean_amr_distance.disk <- function(x, ...) { #' @rdname mean_amr_distance #' @export -mean_amr_distance.rsi <- function(x, ..., combine_SI = TRUE) { +mean_amr_distance.sir <- function(x, ..., combine_SI = TRUE) { meet_criteria(combine_SI, allow_class = "logical", has_length = 1, .call_depth = -1) if (isTRUE(combine_SI)) { x[x == "I"] <- "S" diff --git a/R/mic.R b/R/mic.R index d4218b644..1b98473db 100755 --- a/R/mic.R +++ b/R/mic.R @@ -77,7 +77,7 @@ valid_mic_levels <- c( #' @param x a [character] or [numeric] vector #' @param na.rm a [logical] indicating whether missing values should be removed #' @param ... arguments passed on to methods -#' @details To interpret MIC values as RSI values, use [as.rsi()] on MIC values. It supports guidelines from EUCAST (`r min(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "EUCAST")$guideline)))`-`r max(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "EUCAST")$guideline)))`) and CLSI (`r min(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "CLSI")$guideline)))`-`r max(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "CLSI")$guideline)))`). +#' @details To interpret MIC values as SIR values, use [as.sir()] on MIC values. It supports guidelines from EUCAST (`r min(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "EUCAST")$guideline)))`-`r max(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "EUCAST")$guideline)))`) and CLSI (`r min(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "CLSI")$guideline)))`-`r max(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "CLSI")$guideline)))`). #' #' This class for MIC values is a quite a special data type: formally it is an ordered [factor] with valid MIC values as [factor] levels (to make sure only valid MIC values are retained), but for any mathematical operation it acts as decimal numbers: #' @@ -123,13 +123,13 @@ valid_mic_levels <- c( #' @return Ordered [factor] with additional class [`mic`], that in mathematical operations acts as decimal numbers. Bare in mind that the outcome of any mathematical operation on MICs will return a [numeric] value. #' @aliases mic #' @export -#' @seealso [as.rsi()] +#' @seealso [as.sir()] #' @examples #' mic_data <- as.mic(c(">=32", "1.0", "1", "1.00", 8, "<=0.128", "8", "16", "16")) #' mic_data #' is.mic(mic_data) #' -#' # this can also coerce combined MIC/RSI values: +#' # this can also coerce combined MIC/SIR values: #' as.mic("<=0.002; S") #' #' # mathematical processing treats MICs as numeric values @@ -138,13 +138,13 @@ valid_mic_levels <- c( #' all(mic_data < 512) #' #' # interpret MIC values -#' as.rsi( +#' as.sir( #' x = as.mic(2), #' mo = as.mo("Streptococcus pneumoniae"), #' ab = "AMX", #' guideline = "EUCAST" #' ) -#' as.rsi( +#' as.sir( #' x = as.mic(c(0.01, 2, 4, 8)), #' mo = as.mo("Streptococcus pneumoniae"), #' ab = "AMX", diff --git a/R/mo.R b/R/mo.R index f4cbb64af..9d66f99d9 100755 --- a/R/mo.R +++ b/R/mo.R @@ -164,6 +164,8 @@ as.mo <- function(x, language <- validate_language(language) meet_criteria(info, allow_class = "logical", has_length = 1) + add_MO_lookup_to_AMR_env() + if (tryCatch(all(x %in% c(AMR_env$MO_lookup$mo, NA)) && isFALSE(Becker) && isFALSE(Lancefield), error = function(e) FALSE)) { @@ -492,6 +494,7 @@ mo_uncertainties <- function() { #' @rdname as.mo #' @export mo_renamed <- function() { + add_MO_lookup_to_AMR_env() x <- AMR_env$mo_renamed x$new <- synonym_mo_to_accepted_mo(x$old) @@ -547,6 +550,7 @@ mo_cleaning_regex <- function() { # will be exported using s3_register() in R/zzz.R pillar_shaft.mo <- function(x, ...) { + add_MO_lookup_to_AMR_env() out <- format(x) # grey out the kingdom (part until first "_") out[!is.na(x)] <- gsub("^([A-Z]+_)(.*)", paste0(font_subtle("\\1"), "\\2"), out[!is.na(x)], perl = TRUE) @@ -664,6 +668,7 @@ get_skimmers.mo <- function(column) { #' @export #' @noRd print.mo <- function(x, print.shortnames = FALSE, ...) { + add_MO_lookup_to_AMR_env() cat("Class 'mo'\n") x_names <- names(x) if (is.null(x_names) & print.shortnames == TRUE) { @@ -704,6 +709,7 @@ summary.mo <- function(object, ...) { #' @export #' @noRd as.data.frame.mo <- function(x, ...) { + add_MO_lookup_to_AMR_env() if (!all(x %in% c(AMR_env$MO_lookup$mo, NA))) { warning_( "The data contains old MO codes (from a previous AMR package version). ", @@ -741,6 +747,7 @@ as.data.frame.mo <- function(x, ...) { y <- NextMethod() attributes(y) <- attributes(i) # must only contain valid MOs + add_MO_lookup_to_AMR_env() return_after_integrity_check(y, "microorganism code", as.character(AMR_env$MO_lookup$mo)) } #' @method [[<- mo @@ -750,6 +757,7 @@ as.data.frame.mo <- function(x, ...) { y <- NextMethod() attributes(y) <- attributes(i) # must only contain valid MOs + add_MO_lookup_to_AMR_env() return_after_integrity_check(y, "microorganism code", as.character(AMR_env$MO_lookup$mo)) } #' @method c mo @@ -759,6 +767,7 @@ c.mo <- function(...) { x <- list(...)[[1L]] y <- NextMethod() attributes(y) <- attributes(x) + add_MO_lookup_to_AMR_env() return_after_integrity_check(y, "microorganism code", as.character(AMR_env$MO_lookup$mo)) } @@ -788,6 +797,8 @@ print.mo_uncertainties <- function(x, ...) { cat(word_wrap("No uncertainties to show. Only uncertainties of the last call of `as.mo()` or any `mo_*()` function are stored.\n\n", add_fn = font_blue)) return(invisible(NULL)) } + + add_MO_lookup_to_AMR_env() cat(word_wrap("Matching scores are based on the resemblance between the input and the full taxonomic name, and the pathogenicity in humans. See `?mo_matching_score`.\n\n", add_fn = font_blue)) if (has_colour()) { @@ -1049,6 +1060,7 @@ replace_old_mo_codes <- function(x, property) { # B_ESCH_COL (AMR v0.5.0) -> B_ESCHR_COLI ind <- x %like_case% "^[A-Z]_[A-Z_]+$" & !x %in% AMR_env$MO_lookup$mo if (any(ind, na.rm = TRUE)) { + add_MO_lookup_to_AMR_env() # get the ones that match affected <- x[ind] affected_unique <- unique(affected) diff --git a/R/mo_matching_score.R b/R/mo_matching_score.R index 42e694d1c..6b730552c 100755 --- a/R/mo_matching_score.R +++ b/R/mo_matching_score.R @@ -84,6 +84,8 @@ mo_matching_score <- function(x, n) { meet_criteria(x, allow_class = c("character", "data.frame", "list")) meet_criteria(n, allow_class = "character") + add_MO_lookup_to_AMR_env() + x <- parse_and_convert(x) # no dots and other non-whitespace characters x <- gsub("[^a-zA-Z0-9 \\(\\)]+", "", x) diff --git a/R/mo_property.R b/R/mo_property.R index 3d5572d68..268587426 100755 --- a/R/mo_property.R +++ b/R/mo_property.R @@ -417,6 +417,8 @@ mo_pathogenicity <- function(x, language = get_AMR_locale(), keep_synonyms = get language <- validate_language(language) meet_criteria(keep_synonyms, allow_class = "logical", has_length = 1) + add_MO_lookup_to_AMR_env() + x.mo <- as.mo(x, language = language, keep_synonyms = keep_synonyms, ...) metadata <- get_mo_uncertainties() @@ -725,6 +727,8 @@ mo_synonyms <- function(x, language = get_AMR_locale(), keep_synonyms = getOptio meet_criteria(x, allow_NA = TRUE) language <- validate_language(language) meet_criteria(keep_synonyms, allow_class = "logical", has_length = 1) + + add_MO_lookup_to_AMR_env() x.mo <- as.mo(x, language = language, keep_synonyms = keep_synonyms, ...) metadata <- get_mo_uncertainties() @@ -811,6 +815,8 @@ mo_url <- function(x, open = FALSE, language = get_AMR_locale(), keep_synonyms = meet_criteria(open, allow_class = "logical", has_length = 1) language <- validate_language(language) meet_criteria(keep_synonyms, allow_class = "logical", has_length = 1) + + add_MO_lookup_to_AMR_env() x.mo <- as.mo(x = x, language = language, keep_synonyms = keep_synonyms, ... = ...) metadata <- get_mo_uncertainties() @@ -847,7 +853,7 @@ mo_property <- function(x, property = "fullname", language = get_AMR_locale(), k x <- find_mo_col(fn = "mo_property") } meet_criteria(x, allow_NA = TRUE) - meet_criteria(property, allow_class = "character", has_length = 1, is_in = colnames(AMR_env$MO_lookup)) + meet_criteria(property, allow_class = "character", has_length = 1, is_in = colnames(AMR::microorganisms)) language <- validate_language(language) meet_criteria(keep_synonyms, allow_class = "logical", has_length = 1) @@ -855,7 +861,8 @@ mo_property <- function(x, property = "fullname", language = get_AMR_locale(), k } mo_validate <- function(x, property, language, keep_synonyms = keep_synonyms, ...) { - + add_MO_lookup_to_AMR_env() + # try to catch an error when inputting an invalid argument # so the 'call.' can be set to FALSE tryCatch(x[1L] %in% unlist(AMR_env$MO_lookup[1, property, drop = TRUE]), diff --git a/R/mo_source.R b/R/mo_source.R index c25f9012e..f55fe4946 100755 --- a/R/mo_source.R +++ b/R/mo_source.R @@ -261,6 +261,8 @@ get_mo_source <- function(destination = getOption("AMR_mo_source", "~/mo_source. } check_validity_mo_source <- function(x, refer_to_name = "`reference_df`", stop_on_error = TRUE) { + add_MO_lookup_to_AMR_env() + if (paste(deparse(substitute(x)), collapse = "") == "get_mo_source()") { return(TRUE) } diff --git a/R/pca.R b/R/pca.R index d4501c5b4..e8b42368a 100755 --- a/R/pca.R +++ b/R/pca.R @@ -52,7 +52,7 @@ #' genus = mo_genus(mo) #' ) %>% # and genus as we do here; #' filter(n() >= 30) %>% # filter on only 30 results per group -#' summarise_if(is.rsi, resistance) # then get resistance of all drugs +#' summarise_if(is.sir, resistance) # then get resistance of all drugs #' #' # now conduct PCA for certain antimicrobial drugs #' pca_result <- resistance_data %>% diff --git a/R/plot.R b/R/plot.R index 1a4d24022..45f66387f 100755 --- a/R/plot.R +++ b/R/plot.R @@ -27,23 +27,23 @@ # how to conduct AMR data analysis: https://msberends.github.io/AMR/ # # ==================================================================== # -#' Plotting for Classes `rsi`, `mic` and `disk` +#' Plotting for Classes `sir`, `mic` and `disk` #' -#' Functions to plot classes `rsi`, `mic` and `disk`, with support for base \R and `ggplot2`. +#' Functions to plot classes `sir`, `mic` and `disk`, with support for base \R and `ggplot2`. -#' @param x,object values created with [as.mic()], [as.disk()] or [as.rsi()] (or their `random_*` variants, such as [random_mic()]) +#' @param x,object values created with [as.mic()], [as.disk()] or [as.sir()] (or their `random_*` variants, such as [random_mic()]) #' @param mo any (vector of) text that can be coerced to a valid microorganism code with [as.mo()] #' @param ab any (vector of) text that can be coerced to a valid antimicrobial drug code with [as.ab()] #' @param guideline interpretation guideline to use, defaults to the latest included EUCAST guideline, see *Details* #' @param main,title title of the plot #' @param xlab,ylab axis title -#' @param colours_RSI colours to use for filling in the bars, must be a vector of three values (in the order R, S and I). The default colours are colour-blind friendly. +#' @param colours_SIR colours to use for filling in the bars, must be a vector of three values (in the order S, I and R). The default colours are colour-blind friendly. #' @param language language to be used to translate 'Susceptible', 'Increased exposure'/'Intermediate' and 'Resistant', defaults to system language (see [get_AMR_locale()]) and can be overwritten by setting the option `AMR_locale`, e.g. `options(AMR_locale = "de")`, see [translate]. Use `language = NULL` or `language = ""` to prevent translation. #' @param expand a [logical] to indicate whether the range on the x axis should be expanded between the lowest and highest value. For MIC values, intermediate values will be factors of 2 starting from the highest MIC value. For disk diameters, the whole diameter range will be filled. #' @details #' The interpretation of "I" will be named "Increased exposure" for all EUCAST guidelines since 2019, and will be named "Intermediate" in all other cases. #' -#' For interpreting MIC values as well as disk diffusion diameters, supported guidelines to be used as input for the `guideline` argument are: `r vector_and(AMR::rsi_translation$guideline, quotes = TRUE, reverse = TRUE)`. +#' For interpreting MIC values as well as disk diffusion diameters, supported guidelines to be used as input for the `guideline` argument are: `r vector_and(AMR::clinical_breakpoints$guideline, quotes = TRUE, reverse = TRUE)`. #' #' Simply using `"CLSI"` or `"EUCAST"` as input will automatically select the latest version of that guideline. #' @name plot @@ -55,11 +55,11 @@ #' @examples #' some_mic_values <- random_mic(size = 100) #' some_disk_values <- random_disk(size = 100, mo = "Escherichia coli", ab = "cipro") -#' some_rsi_values <- random_rsi(50, prob_RSI = c(0.30, 0.55, 0.05)) +#' some_sir_values <- random_sir(50, prob_SIR = c(0.55, 0.05, 0.30)) #' #' plot(some_mic_values) #' plot(some_disk_values) -#' plot(some_rsi_values) +#' plot(some_sir_values) #' #' # when providing the microorganism and antibiotic, colours will show interpretations: #' plot(some_mic_values, mo = "S. aureus", ab = "ampicillin") @@ -74,7 +74,7 @@ #' autoplot(some_disk_values, mo = "Escherichia coli", ab = "cipro") #' } #' if (require("ggplot2")) { -#' autoplot(some_rsi_values) +#' autoplot(some_sir_values) #' } #' } NULL @@ -90,7 +90,7 @@ plot.mic <- function(x, main = deparse(substitute(x)), ylab = "Frequency", xlab = "Minimum Inhibitory Concentration (mg/L)", - colours_RSI = c("#ED553B", "#3CAEA3", "#F6D55C"), + colours_SIR = c("#3CAEA3", "#F6D55C", "#ED553B"), language = get_AMR_locale(), expand = TRUE, ...) { @@ -100,7 +100,7 @@ plot.mic <- function(x, meet_criteria(main, allow_class = "character", has_length = 1, allow_NULL = TRUE) meet_criteria(ylab, allow_class = "character", has_length = 1) meet_criteria(xlab, allow_class = "character", has_length = 1) - meet_criteria(colours_RSI, allow_class = "character", has_length = c(1, 3)) + meet_criteria(colours_SIR, allow_class = "character", has_length = c(1, 3)) language <- validate_language(language) meet_criteria(expand, allow_class = "logical", has_length = 1) @@ -112,8 +112,8 @@ plot.mic <- function(x, xlab <- translate_into_language(xlab, language = language) } - if (length(colours_RSI) == 1) { - colours_RSI <- rep(colours_RSI, 3) + if (length(colours_SIR) == 1) { + colours_SIR <- rep(colours_SIR, 3) } main <- gsub(" +", " ", paste0(main, collapse = " ")) @@ -124,7 +124,7 @@ plot.mic <- function(x, mo = mo, ab = ab, guideline = guideline, - colours_RSI = colours_RSI, + colours_SIR = colours_SIR, fn = as.mic, language = language, ... @@ -132,7 +132,7 @@ plot.mic <- function(x, barplot(x, col = cols_sub$cols, main = main, - ylim = c(0, max(x) * ifelse(any(colours_RSI %in% cols_sub$cols), 1.1, 1)), + ylim = c(0, max(x) * ifelse(any(colours_SIR %in% cols_sub$cols), 1.1, 1)), ylab = ylab, xlab = xlab, axes = FALSE @@ -142,20 +142,20 @@ plot.mic <- function(x, mtext(side = 3, line = 0.5, adj = 0.5, cex = 0.75, cols_sub$sub) } - if (any(colours_RSI %in% cols_sub$cols)) { + if (any(colours_SIR %in% cols_sub$cols)) { legend_txt <- character(0) legend_col <- character(0) - if (any(cols_sub$cols == colours_RSI[2] & cols_sub$count > 0)) { + if (any(cols_sub$cols == colours_SIR[1] & cols_sub$count > 0)) { legend_txt <- "Susceptible" - legend_col <- colours_RSI[2] + legend_col <- colours_SIR[1] } - if (any(cols_sub$cols == colours_RSI[3] & cols_sub$count > 0)) { + if (any(cols_sub$cols == colours_SIR[2] & cols_sub$count > 0)) { legend_txt <- c(legend_txt, plot_name_of_I(cols_sub$guideline)) - legend_col <- c(legend_col, colours_RSI[3]) + legend_col <- c(legend_col, colours_SIR[2]) } - if (any(cols_sub$cols == colours_RSI[1] & cols_sub$count > 0)) { + if (any(cols_sub$cols == colours_SIR[3] & cols_sub$count > 0)) { legend_txt <- c(legend_txt, "Resistant") - legend_col <- c(legend_col, colours_RSI[1]) + legend_col <- c(legend_col, colours_SIR[3]) } legend("top", @@ -181,7 +181,7 @@ barplot.mic <- function(height, main = deparse(substitute(height)), ylab = "Frequency", xlab = "Minimum Inhibitory Concentration (mg/L)", - colours_RSI = c("#ED553B", "#3CAEA3", "#F6D55C"), + colours_SIR = c("#3CAEA3", "#F6D55C", "#ED553B"), language = get_AMR_locale(), expand = TRUE, ...) { @@ -191,7 +191,7 @@ barplot.mic <- function(height, meet_criteria(mo, allow_class = c("mo", "character"), allow_NULL = TRUE) meet_criteria(ab, allow_class = c("ab", "character"), allow_NULL = TRUE) meet_criteria(guideline, allow_class = "character", has_length = 1) - meet_criteria(colours_RSI, allow_class = "character", has_length = c(1, 3)) + meet_criteria(colours_SIR, allow_class = "character", has_length = c(1, 3)) language <- validate_language(language) meet_criteria(expand, allow_class = "logical", has_length = 1) @@ -213,7 +213,7 @@ barplot.mic <- function(height, mo = mo, ab = ab, guideline = guideline, - colours_RSI = colours_RSI, + colours_SIR = colours_SIR, ... ) } @@ -228,7 +228,7 @@ autoplot.mic <- function(object, title = deparse(substitute(object)), ylab = "Frequency", xlab = "Minimum Inhibitory Concentration (mg/L)", - colours_RSI = c("#ED553B", "#3CAEA3", "#F6D55C"), + colours_SIR = c("#3CAEA3", "#F6D55C", "#ED553B"), language = get_AMR_locale(), expand = TRUE, ...) { @@ -239,7 +239,7 @@ autoplot.mic <- function(object, meet_criteria(title, allow_class = "character", allow_NULL = TRUE) meet_criteria(ylab, allow_class = "character", has_length = 1) meet_criteria(xlab, allow_class = "character", has_length = 1) - meet_criteria(colours_RSI, allow_class = "character", has_length = c(1, 3)) + meet_criteria(colours_SIR, allow_class = "character", has_length = c(1, 3)) language <- validate_language(language) meet_criteria(expand, allow_class = "logical", has_length = 1) @@ -264,7 +264,7 @@ autoplot.mic <- function(object, mo = mo, ab = ab, guideline = guideline, - colours_RSI = colours_RSI, + colours_SIR = colours_SIR, fn = as.mic, language = language, ... @@ -272,9 +272,9 @@ autoplot.mic <- function(object, df <- as.data.frame(x, stringsAsFactors = TRUE) colnames(df) <- c("mic", "count") df$cols <- cols_sub$cols - df$cols[df$cols == colours_RSI[1]] <- "Resistant" - df$cols[df$cols == colours_RSI[2]] <- "Susceptible" - df$cols[df$cols == colours_RSI[3]] <- plot_name_of_I(cols_sub$guideline) + df$cols[df$cols == colours_SIR[1]] <- "Susceptible" + df$cols[df$cols == colours_SIR[2]] <- plot_name_of_I(cols_sub$guideline) + df$cols[df$cols == colours_SIR[3]] <- "Resistant" df$cols <- factor(translate_into_language(df$cols, language = language), levels = translate_into_language(c("Susceptible", plot_name_of_I(cols_sub$guideline), "Resistant"), language = language @@ -283,12 +283,12 @@ autoplot.mic <- function(object, ) p <- ggplot2::ggplot(df) - if (any(colours_RSI %in% cols_sub$cols)) { + if (any(colours_SIR %in% cols_sub$cols)) { vals <- c( - "Resistant" = colours_RSI[1], - "Susceptible" = colours_RSI[2], - "Susceptible, incr. exp." = colours_RSI[3], - "Intermediate" = colours_RSI[3] + "Susceptible" = colours_SIR[1], + "Susceptible, incr. exp." = colours_SIR[2], + "Intermediate" = colours_SIR[2], + "Resistant" = colours_SIR[3] ) names(vals) <- translate_into_language(names(vals), language = language) p <- p + @@ -329,7 +329,7 @@ plot.disk <- function(x, mo = NULL, ab = NULL, guideline = "EUCAST", - colours_RSI = c("#ED553B", "#3CAEA3", "#F6D55C"), + colours_SIR = c("#3CAEA3", "#F6D55C", "#ED553B"), language = get_AMR_locale(), expand = TRUE, ...) { @@ -339,7 +339,7 @@ plot.disk <- function(x, meet_criteria(mo, allow_class = c("mo", "character"), allow_NULL = TRUE) meet_criteria(ab, allow_class = c("ab", "character"), allow_NULL = TRUE) meet_criteria(guideline, allow_class = "character", has_length = 1) - meet_criteria(colours_RSI, allow_class = "character", has_length = c(1, 3)) + meet_criteria(colours_SIR, allow_class = "character", has_length = c(1, 3)) language <- validate_language(language) meet_criteria(expand, allow_class = "logical", has_length = 1) @@ -351,8 +351,8 @@ plot.disk <- function(x, xlab <- translate_into_language(xlab, language = language) } - if (length(colours_RSI) == 1) { - colours_RSI <- rep(colours_RSI, 3) + if (length(colours_SIR) == 1) { + colours_SIR <- rep(colours_SIR, 3) } main <- gsub(" +", " ", paste0(main, collapse = " ")) @@ -363,7 +363,7 @@ plot.disk <- function(x, mo = mo, ab = ab, guideline = guideline, - colours_RSI = colours_RSI, + colours_SIR = colours_SIR, fn = as.disk, language = language, ... @@ -372,7 +372,7 @@ plot.disk <- function(x, barplot(x, col = cols_sub$cols, main = main, - ylim = c(0, max(x) * ifelse(any(colours_RSI %in% cols_sub$cols), 1.1, 1)), + ylim = c(0, max(x) * ifelse(any(colours_SIR %in% cols_sub$cols), 1.1, 1)), ylab = ylab, xlab = xlab, axes = FALSE @@ -382,20 +382,20 @@ plot.disk <- function(x, mtext(side = 3, line = 0.5, adj = 0.5, cex = 0.75, cols_sub$sub) } - if (any(colours_RSI %in% cols_sub$cols)) { + if (any(colours_SIR %in% cols_sub$cols)) { legend_txt <- character(0) legend_col <- character(0) - if (any(cols_sub$cols == colours_RSI[1] & cols_sub$count > 0)) { + if (any(cols_sub$cols == colours_SIR[3] & cols_sub$count > 0)) { legend_txt <- "Resistant" - legend_col <- colours_RSI[1] + legend_col <- colours_SIR[3] } - if (any(cols_sub$cols == colours_RSI[3] & cols_sub$count > 0)) { + if (any(cols_sub$cols == colours_SIR[2] & cols_sub$count > 0)) { legend_txt <- c(legend_txt, plot_name_of_I(cols_sub$guideline)) - legend_col <- c(legend_col, colours_RSI[3]) + legend_col <- c(legend_col, colours_SIR[2]) } - if (any(cols_sub$cols == colours_RSI[2] & cols_sub$count > 0)) { + if (any(cols_sub$cols == colours_SIR[1] & cols_sub$count > 0)) { legend_txt <- c(legend_txt, "Susceptible") - legend_col <- c(legend_col, colours_RSI[2]) + legend_col <- c(legend_col, colours_SIR[1]) } legend("top", x.intersp = 0.5, @@ -420,7 +420,7 @@ barplot.disk <- function(height, mo = NULL, ab = NULL, guideline = "EUCAST", - colours_RSI = c("#ED553B", "#3CAEA3", "#F6D55C"), + colours_SIR = c("#3CAEA3", "#F6D55C", "#ED553B"), language = get_AMR_locale(), expand = TRUE, ...) { @@ -430,7 +430,7 @@ barplot.disk <- function(height, meet_criteria(mo, allow_class = c("mo", "character"), allow_NULL = TRUE) meet_criteria(ab, allow_class = c("ab", "character"), allow_NULL = TRUE) meet_criteria(guideline, allow_class = "character", has_length = 1) - meet_criteria(colours_RSI, allow_class = "character", has_length = c(1, 3)) + meet_criteria(colours_SIR, allow_class = "character", has_length = c(1, 3)) language <- validate_language(language) meet_criteria(expand, allow_class = "logical", has_length = 1) @@ -452,7 +452,7 @@ barplot.disk <- function(height, mo = mo, ab = ab, guideline = guideline, - colours_RSI = colours_RSI, + colours_SIR = colours_SIR, ... ) } @@ -467,7 +467,7 @@ autoplot.disk <- function(object, ylab = "Frequency", xlab = "Disk diffusion diameter (mm)", guideline = "EUCAST", - colours_RSI = c("#ED553B", "#3CAEA3", "#F6D55C"), + colours_SIR = c("#3CAEA3", "#F6D55C", "#ED553B"), language = get_AMR_locale(), expand = TRUE, ...) { @@ -478,7 +478,7 @@ autoplot.disk <- function(object, meet_criteria(mo, allow_class = c("mo", "character"), allow_NULL = TRUE) meet_criteria(ab, allow_class = c("ab", "character"), allow_NULL = TRUE) meet_criteria(guideline, allow_class = "character", has_length = 1) - meet_criteria(colours_RSI, allow_class = "character", has_length = c(1, 3)) + meet_criteria(colours_SIR, allow_class = "character", has_length = c(1, 3)) language <- validate_language(language) meet_criteria(expand, allow_class = "logical", has_length = 1) @@ -503,7 +503,7 @@ autoplot.disk <- function(object, mo = mo, ab = ab, guideline = guideline, - colours_RSI = colours_RSI, + colours_SIR = colours_SIR, fn = as.disk, language = language, ... @@ -512,9 +512,9 @@ autoplot.disk <- function(object, colnames(df) <- c("disk", "count") df$cols <- cols_sub$cols - df$cols[df$cols == colours_RSI[1]] <- "Resistant" - df$cols[df$cols == colours_RSI[2]] <- "Susceptible" - df$cols[df$cols == colours_RSI[3]] <- plot_name_of_I(cols_sub$guideline) + df$cols[df$cols == colours_SIR[1]] <- "Susceptible" + df$cols[df$cols == colours_SIR[2]] <- plot_name_of_I(cols_sub$guideline) + df$cols[df$cols == colours_SIR[3]] <- "Resistant" df$cols <- factor(translate_into_language(df$cols, language = language), levels = translate_into_language(c("Susceptible", plot_name_of_I(cols_sub$guideline), "Resistant"), language = language @@ -523,12 +523,12 @@ autoplot.disk <- function(object, ) p <- ggplot2::ggplot(df) - if (any(colours_RSI %in% cols_sub$cols)) { + if (any(colours_SIR %in% cols_sub$cols)) { vals <- c( - "Resistant" = colours_RSI[1], - "Susceptible" = colours_RSI[2], - "Susceptible, incr. exp." = colours_RSI[3], - "Intermediate" = colours_RSI[3] + "Susceptible" = colours_SIR[1], + "Susceptible, incr. exp." = colours_SIR[2], + "Intermediate" = colours_SIR[2], + "Resistant" = colours_SIR[3] ) names(vals) <- translate_into_language(names(vals), language = language) p <- p + @@ -558,11 +558,11 @@ fortify.disk <- function(object, ...) { ) } -#' @method plot rsi +#' @method plot sir #' @export #' @importFrom graphics plot text axis #' @rdname plot -plot.rsi <- function(x, +plot.sir <- function(x, ylab = "Percentage", xlab = "Antimicrobial Interpretation", main = deparse(substitute(x)), @@ -627,22 +627,22 @@ plot.rsi <- function(x, } -#' @method barplot rsi +#' @method barplot sir #' @importFrom graphics barplot axis #' @export #' @noRd -barplot.rsi <- function(height, +barplot.sir <- function(height, main = deparse(substitute(height)), xlab = "Antimicrobial Interpretation", ylab = "Frequency", - colours_RSI = c("#ED553B", "#3CAEA3", "#F6D55C"), + colours_SIR = c("#3CAEA3", "#F6D55C", "#ED553B"), language = get_AMR_locale(), expand = TRUE, ...) { meet_criteria(xlab, allow_class = "character", has_length = 1) meet_criteria(main, allow_class = "character", has_length = 1, allow_NULL = TRUE) meet_criteria(ylab, allow_class = "character", has_length = 1) - meet_criteria(colours_RSI, allow_class = "character", has_length = c(1, 3)) + meet_criteria(colours_SIR, allow_class = "character", has_length = c(1, 3)) language <- validate_language(language) meet_criteria(expand, allow_class = "logical", has_length = 1) @@ -654,17 +654,15 @@ barplot.rsi <- function(height, xlab <- translate_into_language(xlab, language = language) } - if (length(colours_RSI) == 1) { - colours_RSI <- rep(colours_RSI, 3) - } else { - colours_RSI <- c(colours_RSI[2], colours_RSI[3], colours_RSI[1]) + if (length(colours_SIR) == 1) { + colours_SIR <- rep(colours_SIR, 3) } main <- gsub(" +", " ", paste0(main, collapse = " ")) x <- table(height) x <- x[c(1, 2, 3)] barplot(x, - col = colours_RSI, + col = colours_SIR, xlab = xlab, main = main, ylab = ylab, @@ -673,21 +671,21 @@ barplot.rsi <- function(height, axis(2, seq(0, max(x))) } -#' @method autoplot rsi +#' @method autoplot sir #' @rdname plot # will be exported using s3_register() in R/zzz.R -autoplot.rsi <- function(object, +autoplot.sir <- function(object, title = deparse(substitute(object)), xlab = "Antimicrobial Interpretation", ylab = "Frequency", - colours_RSI = c("#ED553B", "#3CAEA3", "#F6D55C"), + colours_SIR = c("#3CAEA3", "#F6D55C", "#ED553B"), language = get_AMR_locale(), ...) { stop_ifnot_installed("ggplot2") meet_criteria(title, allow_class = "character", allow_NULL = TRUE) meet_criteria(ylab, allow_class = "character", has_length = 1) meet_criteria(xlab, allow_class = "character", has_length = 1) - meet_criteria(colours_RSI, allow_class = "character", has_length = c(1, 3)) + meet_criteria(colours_SIR, allow_class = "character", has_length = c(1, 3)) # translate if not specifically set if (missing(ylab)) { @@ -704,20 +702,20 @@ autoplot.rsi <- function(object, title <- gsub(" +", " ", paste0(title, collapse = " ")) } - if (length(colours_RSI) == 1) { - colours_RSI <- rep(colours_RSI, 3) + if (length(colours_SIR) == 1) { + colours_SIR <- rep(colours_SIR, 3) } df <- as.data.frame(table(object), stringsAsFactors = TRUE) - colnames(df) <- c("rsi", "count") + colnames(df) <- c("sir", "count") ggplot2::ggplot(df) + - ggplot2::geom_col(ggplot2::aes(x = rsi, y = count, fill = rsi)) + + ggplot2::geom_col(ggplot2::aes(x = sir, y = count, fill = sir)) + # limits = force is needed because of a ggplot2 >= 3.3.4 bug (#4511) ggplot2::scale_fill_manual( values = c( - "R" = colours_RSI[1], - "S" = colours_RSI[2], - "I" = colours_RSI[3] + "S" = colours_SIR[1], + "I" = colours_SIR[2], + "R" = colours_SIR[3] ), limits = force ) + @@ -725,10 +723,10 @@ autoplot.rsi <- function(object, ggplot2::theme(legend.position = "none") } -#' @method fortify rsi +#' @method fortify sir #' @rdname plot # will be exported using s3_register() in R/zzz.R -fortify.rsi <- function(object, ...) { +fortify.sir <- function(object, ...) { stats::setNames( as.data.frame(table(object)), c("x", "y") @@ -782,18 +780,18 @@ plot_name_of_I <- function(guideline) { } } -plot_colours_subtitle_guideline <- function(x, mo, ab, guideline, colours_RSI, fn, language, ...) { - guideline <- get_guideline(guideline, AMR::rsi_translation) +plot_colours_subtitle_guideline <- function(x, mo, ab, guideline, colours_SIR, fn, language, ...) { + guideline <- get_guideline(guideline, AMR::clinical_breakpoints) if (!is.null(mo) && !is.null(ab)) { # interpret and give colour based on MIC values mo <- as.mo(mo) ab <- as.ab(ab) - rsi <- suppressWarnings(suppressMessages(as.rsi(fn(names(x)), mo = mo, ab = ab, guideline = guideline, ...))) - cols <- character(length = length(rsi)) - cols[is.na(rsi)] <- "#BEBEBE" - cols[rsi == "R"] <- colours_RSI[1] - cols[rsi == "S"] <- colours_RSI[2] - cols[rsi == "I"] <- colours_RSI[3] + sir <- suppressWarnings(suppressMessages(as.sir(fn(names(x)), mo = mo, ab = ab, guideline = guideline, ...))) + cols <- character(length = length(sir)) + cols[is.na(sir)] <- "#BEBEBE" + cols[sir == "S"] <- colours_SIR[1] + cols[sir == "I"] <- colours_SIR[2] + cols[sir == "R"] <- colours_SIR[3] moname <- mo_name(mo, language = language) abname <- ab_name(ab, language = language) if (all(cols == "#BEBEBE")) { diff --git a/R/proportion.R b/R/proportion.R index 0af65a3ce..310bb37e4 100755 --- a/R/proportion.R +++ b/R/proportion.R @@ -32,28 +32,28 @@ #' @description These functions can be used to calculate the (co-)resistance or susceptibility of microbial isolates (i.e. percentage of S, SI, I, IR or R). All functions support quasiquotation with pipes, can be used in `summarise()` from the `dplyr` package and also support grouped variables, see *Examples*. #' #' [resistance()] should be used to calculate resistance, [susceptibility()] should be used to calculate susceptibility.\cr -#' @param ... one or more vectors (or columns) with antibiotic interpretations. They will be transformed internally with [as.rsi()] if needed. Use multiple columns to calculate (the lack of) co-resistance: the probability where one of two drugs have a resistant or susceptible result. See *Examples*. +#' @param ... one or more vectors (or columns) with antibiotic interpretations. They will be transformed internally with [as.sir()] if needed. Use multiple columns to calculate (the lack of) co-resistance: the probability where one of two drugs have a resistant or susceptible result. See *Examples*. #' @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 as_percent a [logical] to indicate whether the output must be returned as a hundred fold with % sign (a character). A value of `0.123456` will then be returned as `"12.3%"`. #' @param only_all_tested (for combination therapies, i.e. using more than one variable for `...`): a [logical] to indicate that isolates must be tested for all antibiotics, see section *Combination Therapy* below -#' @param data a [data.frame] containing columns with class [`rsi`] (see [as.rsi()]) +#' @param data a [data.frame] containing columns with class [`sir`] (see [as.sir()]) #' @param translate_ab a column name of the [antibiotics] data set to translate the antibiotic abbreviations to, using [ab_property()] #' @inheritParams ab_property #' @param combine_SI a [logical] to indicate whether all values of S and I must be merged into one, so the output only consists of S+I vs. R (susceptible vs. resistant), defaults to `TRUE` -#' @param ab_result antibiotic results to test against, must be one of more values of "R", "S", "I" +#' @param ab_result antibiotic results to test against, must be one or more values of "S", "I", or "R" #' @param confidence_level the confidence level for the returned confidence interval. For the calculation, the number of S or SI isolates, and R isolates are compared with the total number of available isolates with R, S, or I by using [binom.test()], i.e., the Clopper-Pearson method. #' @param side the side of the confidence interval to return. Defaults to `"both"` for a length 2 vector, but can also be (abbreviated as) `"min"`/`"left"`/`"lower"`/`"less"` or `"max"`/`"right"`/`"higher"`/`"greater"`. -#' @inheritSection as.rsi Interpretation of R and S/I +#' @inheritSection as.sir Interpretation of SIR #' @details #' The function [resistance()] is equal to the function [proportion_R()]. The function [susceptibility()] is equal to the function [proportion_SI()]. #' -#' Use [rsi_confidence_interval()] to calculate the confidence interval, which relies on [binom.test()], i.e., the Clopper-Pearson method. This function returns a vector of length 2 at default for antimicrobial *resistance*. Change the `side` argument to "left"/"min" or "right"/"max" to return a single value, and change the `ab_result` argument to e.g. `c("S", "I")` to test for antimicrobial *susceptibility*, see Examples. +#' Use [sir_confidence_interval()] to calculate the confidence interval, which relies on [binom.test()], i.e., the Clopper-Pearson method. This function returns a vector of length 2 at default for antimicrobial *resistance*. Change the `side` argument to "left"/"min" or "right"/"max" to return a single value, and change the `ab_result` argument to e.g. `c("S", "I")` to test for antimicrobial *susceptibility*, see Examples. #' #' **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. #' #' These functions are not meant to count isolates, but to calculate the proportion of resistance/susceptibility. Use the [`count()`][AMR::count()] functions to count isolates. The function [susceptibility()] is essentially equal to `count_susceptible() / count_all()`. *Low counts can influence the outcome - the `proportion` functions may camouflage this, since they only return the proportion (albeit being dependent on the `minimum` argument).* #' -#' The function [proportion_df()] takes any variable from `data` that has an [`rsi`] class (created with [as.rsi()]) and calculates the proportions R, I and S. It also supports grouped variables. The function [rsi_df()] works exactly like [proportion_df()], but adds the number of isolates. +#' The function [proportion_df()] takes any variable from `data` that has an [`sir`] class (created with [as.sir()]) and calculates the proportions S, I, and R. It also supports grouped variables. The function [sir_df()] works exactly like [proportion_df()], but adds the number of isolates. #' @section Combination Therapy: #' When using more than one variable for `...` (= combination therapy), use `only_all_tested` to only count isolates that are tested for all antibiotics/variables that you test them for. See this example for two antibiotics, Drug A and Drug B, about how [susceptibility()] works to calculate the %SI: #' @@ -102,14 +102,14 @@ #' # base R ------------------------------------------------------------ #' # determines %R #' resistance(example_isolates$AMX) -#' rsi_confidence_interval(example_isolates$AMX) -#' rsi_confidence_interval(example_isolates$AMX, +#' sir_confidence_interval(example_isolates$AMX) +#' sir_confidence_interval(example_isolates$AMX, #' confidence_level = 0.975 #' ) #' #' # determines %S+I: #' susceptibility(example_isolates$AMX) -#' rsi_confidence_interval(example_isolates$AMX, +#' sir_confidence_interval(example_isolates$AMX, #' ab_result = c("S", "I") #' ) #' @@ -127,16 +127,16 @@ #' group_by(ward) %>% #' summarise( #' r = resistance(CIP), -#' n = n_rsi(CIP) -#' ) # n_rsi works like n_distinct in dplyr, see ?n_rsi +#' n = n_sir(CIP) +#' ) # n_sir works like n_distinct in dplyr, see ?n_sir #' } #' if (require("dplyr")) { #' example_isolates %>% #' group_by(ward) %>% #' summarise( #' cipro_R = resistance(CIP), -#' ci_min = rsi_confidence_interval(CIP, side = "min"), -#' ci_max = rsi_confidence_interval(CIP, side = "max"), +#' ci_min = sir_confidence_interval(CIP, side = "min"), +#' ci_max = sir_confidence_interval(CIP, side = "max"), #' ) #' } #' if (require("dplyr")) { @@ -157,7 +157,7 @@ #' R = resistance(CIP, as_percent = TRUE), #' SI = susceptibility(CIP, as_percent = TRUE), #' n1 = count_all(CIP), # the actual total; sum of all three -#' n2 = n_rsi(CIP), # same - analogous to n_distinct +#' n2 = n_sir(CIP), # same - analogous to n_distinct #' total = n() #' ) # NOT the number of tested isolates! #' @@ -200,17 +200,17 @@ #' combination_n = count_all(CIP, GEN) #' ) #' -#' # Get proportions S/I/R immediately of all rsi columns +#' # Get proportions S/I/R immediately of all sir columns #' example_isolates %>% #' select(AMX, CIP) %>% #' proportion_df(translate = FALSE) #' #' # It also supports grouping variables -#' # (use rsi_df to also include the count) +#' # (use sir_df to also include the count) #' example_isolates %>% #' select(ward, AMX, CIP) %>% #' group_by(ward) %>% -#' rsi_df(translate = FALSE) +#' sir_df(translate = FALSE) #' } #' } resistance <- function(..., @@ -218,14 +218,14 @@ resistance <- function(..., as_percent = FALSE, only_all_tested = FALSE) { tryCatch( - rsi_calc(..., + sir_calc(..., ab_result = "R", minimum = minimum, as_percent = as_percent, only_all_tested = only_all_tested, only_count = FALSE ), - error = function(e) stop_(gsub("in rsi_calc(): ", "", e$message, fixed = TRUE), call = -5) + error = function(e) stop_(gsub("in sir_calc(): ", "", e$message, fixed = TRUE), call = -5) ) } @@ -236,50 +236,50 @@ susceptibility <- function(..., as_percent = FALSE, only_all_tested = FALSE) { tryCatch( - rsi_calc(..., + sir_calc(..., ab_result = c("S", "I"), minimum = minimum, as_percent = as_percent, only_all_tested = only_all_tested, only_count = FALSE ), - error = function(e) stop_(gsub("in rsi_calc(): ", "", e$message, fixed = TRUE), call = -5) + error = function(e) stop_(gsub("in sir_calc(): ", "", e$message, fixed = TRUE), call = -5) ) } #' @rdname proportion #' @export -rsi_confidence_interval <- function(..., +sir_confidence_interval <- function(..., ab_result = "R", minimum = 30, as_percent = FALSE, only_all_tested = FALSE, confidence_level = 0.95, side = "both") { - meet_criteria(ab_result, allow_class = c("character", "rsi"), has_length = c(1, 2, 3), is_in = c("R", "S", "I")) + meet_criteria(ab_result, allow_class = c("character", "sir"), has_length = c(1, 2, 3), is_in = c("S", "I", "R")) meet_criteria(confidence_level, allow_class = "numeric", is_positive = TRUE, has_length = 1) meet_criteria(side, allow_class = "character", has_length = 1, is_in = c("both", "b", "left", "l", "lower", "lowest", "less", "min", "right", "r", "higher", "highest", "greater", "g", "max")) x <- tryCatch( - rsi_calc(..., + sir_calc(..., ab_result = ab_result, only_all_tested = only_all_tested, only_count = TRUE ), - error = function(e) stop_(gsub("in rsi_calc(): ", "", e$message, fixed = TRUE), call = -5) + error = function(e) stop_(gsub("in sir_calc(): ", "", e$message, fixed = TRUE), call = -5) ) n <- tryCatch( - rsi_calc(..., + sir_calc(..., ab_result = c("S", "I", "R"), only_all_tested = only_all_tested, only_count = TRUE ), - error = function(e) stop_(gsub("in rsi_calc(): ", "", e$message, fixed = TRUE), call = -5) + error = function(e) stop_(gsub("in sir_calc(): ", "", e$message, fixed = TRUE), call = -5) ) if (n < minimum) { warning_("Introducing NA: ", ifelse(n == 0, "no", paste("only", n)), - " results available for `rsi_confidence_interval()` (`minimum` = ", minimum, ").", + " results available for `sir_confidence_interval()` (`minimum` = ", minimum, ").", call = FALSE ) if (as_percent == TRUE) { @@ -311,14 +311,14 @@ proportion_R <- function(..., as_percent = FALSE, only_all_tested = FALSE) { tryCatch( - rsi_calc(..., + sir_calc(..., ab_result = "R", minimum = minimum, as_percent = as_percent, only_all_tested = only_all_tested, only_count = FALSE ), - error = function(e) stop_(gsub("in rsi_calc(): ", "", e$message, fixed = TRUE), call = -5) + error = function(e) stop_(gsub("in sir_calc(): ", "", e$message, fixed = TRUE), call = -5) ) } @@ -329,14 +329,14 @@ proportion_IR <- function(..., as_percent = FALSE, only_all_tested = FALSE) { tryCatch( - rsi_calc(..., + sir_calc(..., ab_result = c("I", "R"), minimum = minimum, as_percent = as_percent, only_all_tested = only_all_tested, only_count = FALSE ), - error = function(e) stop_(gsub("in rsi_calc(): ", "", e$message, fixed = TRUE), call = -5) + error = function(e) stop_(gsub("in sir_calc(): ", "", e$message, fixed = TRUE), call = -5) ) } @@ -347,14 +347,14 @@ proportion_I <- function(..., as_percent = FALSE, only_all_tested = FALSE) { tryCatch( - rsi_calc(..., + sir_calc(..., ab_result = "I", minimum = minimum, as_percent = as_percent, only_all_tested = only_all_tested, only_count = FALSE ), - error = function(e) stop_(gsub("in rsi_calc(): ", "", e$message, fixed = TRUE), call = -5) + error = function(e) stop_(gsub("in sir_calc(): ", "", e$message, fixed = TRUE), call = -5) ) } @@ -365,14 +365,14 @@ proportion_SI <- function(..., as_percent = FALSE, only_all_tested = FALSE) { tryCatch( - rsi_calc(..., + sir_calc(..., ab_result = c("S", "I"), minimum = minimum, as_percent = as_percent, only_all_tested = only_all_tested, only_count = FALSE ), - error = function(e) stop_(gsub("in rsi_calc(): ", "", e$message, fixed = TRUE), call = -5) + error = function(e) stop_(gsub("in sir_calc(): ", "", e$message, fixed = TRUE), call = -5) ) } @@ -383,14 +383,14 @@ proportion_S <- function(..., as_percent = FALSE, only_all_tested = FALSE) { tryCatch( - rsi_calc(..., + sir_calc(..., ab_result = "S", minimum = minimum, as_percent = as_percent, only_all_tested = only_all_tested, only_count = FALSE ), - error = function(e) stop_(gsub("in rsi_calc(): ", "", e$message, fixed = TRUE), call = -5) + error = function(e) stop_(gsub("in sir_calc(): ", "", e$message, fixed = TRUE), call = -5) ) } @@ -404,7 +404,7 @@ proportion_df <- function(data, combine_SI = TRUE, confidence_level = 0.95) { tryCatch( - rsi_calc_df( + sir_calc_df( type = "proportion", data = data, translate_ab = translate_ab, @@ -414,6 +414,6 @@ proportion_df <- function(data, combine_SI = combine_SI, confidence_level = confidence_level ), - error = function(e) stop_(gsub("in rsi_calc_df(): ", "", e$message, fixed = TRUE), call = -5) + error = function(e) stop_(gsub("in sir_calc_df(): ", "", e$message, fixed = TRUE), call = -5) ) } diff --git a/R/random.R b/R/random.R index da1767219..39c6e8824 100755 --- a/R/random.R +++ b/R/random.R @@ -27,17 +27,17 @@ # how to conduct AMR data analysis: https://msberends.github.io/AMR/ # # ==================================================================== # -#' Random MIC Values/Disk Zones/RSI Generation +#' Random MIC Values/Disk Zones/SIR Generation #' #' These functions can be used for generating random MIC values and disk diffusion diameters, for AMR data analysis practice. By providing a microorganism and antimicrobial drug, the generated results will reflect reality as much as possible. #' @param size desired size of the returned vector. If used in a [data.frame] call or `dplyr` verb, will get the current (group) size if left blank. #' @param mo any [character] that can be coerced to a valid microorganism code with [as.mo()] #' @param ab any [character] that can be coerced to a valid antimicrobial drug code with [as.ab()] -#' @param prob_RSI a vector of length 3: the probabilities for "R" (1st value), "S" (2nd value) and "I" (3rd value) +#' @param prob_SIR a vector of length 3: the probabilities for "S" (1st value), "I" (2nd value) and "R" (3rd value) #' @param ... ignored, only in place to allow future extensions #' @details The base \R function [sample()] is used for generating values. #' -#' Generated values are based on the EUCAST `r max(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "EUCAST")$guideline)))` guideline as implemented in the [rsi_translation] data set. To create specific generated values per bug or drug, set the `mo` and/or `ab` argument. +#' Generated values are based on the EUCAST `r max(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "EUCAST")$guideline)))` guideline as implemented in the [clinical_breakpoints] data set. To create specific generated values per bug or drug, set the `mo` and/or `ab` argument. #' @return class `mic` for [random_mic()] (see [as.mic()]) and class `disk` for [random_disk()] (see [as.disk()]) #' @name random #' @rdname random @@ -45,7 +45,7 @@ #' @examples #' random_mic(25) #' random_disk(25) -#' random_rsi(25) +#' random_sir(25) #' #' \donttest{ #' # make the random generation more realistic by setting a bug and/or drug: @@ -81,17 +81,17 @@ random_disk <- function(size = NULL, mo = NULL, ab = NULL, ...) { #' @rdname random #' @export -random_rsi <- function(size = NULL, prob_RSI = c(0.33, 0.33, 0.33), ...) { +random_sir <- function(size = NULL, prob_SIR = c(0.33, 0.33, 0.33), ...) { meet_criteria(size, allow_class = c("numeric", "integer"), has_length = 1, is_positive = TRUE, is_finite = TRUE, allow_NULL = TRUE) - meet_criteria(prob_RSI, allow_class = c("numeric", "integer"), has_length = 3) + meet_criteria(prob_SIR, allow_class = c("numeric", "integer"), has_length = 3) if (is.null(size)) { size <- NROW(get_current_data(arg_name = "size", call = -3)) } - sample(as.rsi(c("R", "S", "I")), size = size, replace = TRUE, prob = prob_RSI) + sample(as.sir(c("S", "I", "R")), size = size, replace = TRUE, prob = prob_SIR) } random_exec <- function(type, size, mo = NULL, ab = NULL) { - df <- rsi_translation %pm>% + df <- clinical_breakpoints %pm>% pm_filter(guideline %like% "EUCAST") %pm>% pm_arrange(pm_desc(guideline)) %pm>% subset(guideline == max(guideline) & diff --git a/R/resistance_predict.R b/R/resistance_predict.R index da0ce7de0..7a8878b93 100755 --- a/R/resistance_predict.R +++ b/R/resistance_predict.R @@ -44,7 +44,7 @@ #' @param main title of the plot #' @param ribbon a [logical] to indicate whether a ribbon should be shown (default) or error bars #' @param ... arguments passed on to functions -#' @inheritSection as.rsi Interpretation of R and S/I +#' @inheritSection as.sir Interpretation of SIR #' @inheritParams first_isolate #' @inheritParams graphics::plot #' @details Valid options for the statistical model (argument `model`) are: @@ -76,7 +76,7 @@ #' plot(x) #' \donttest{ #' if (require("ggplot2")) { -#' ggplot_rsi_predict(x) +#' ggplot_sir_predict(x) #' } #' #' # using dplyr: @@ -156,7 +156,7 @@ resistance_predict <- function(x, } df <- x - df[, col_ab] <- droplevels(as.rsi(df[, col_ab, drop = TRUE])) + df[, col_ab] <- droplevels(as.sir(df[, col_ab, drop = TRUE])) if (I_as_S == TRUE) { # then I as S df[, col_ab] <- gsub("I", "S", df[, col_ab, drop = TRUE], fixed = TRUE) @@ -286,7 +286,7 @@ resistance_predict <- function(x, #' @rdname resistance_predict #' @export -rsi_predict <- resistance_predict +sir_predict <- resistance_predict #' @method plot resistance_predict #' @export @@ -341,7 +341,7 @@ plot.resistance_predict <- function(x, main = paste("Resistance Prediction of", #' @rdname resistance_predict #' @export -ggplot_rsi_predict <- function(x, +ggplot_sir_predict <- function(x, main = paste("Resistance Prediction of", x_name), ribbon = TRUE, ...) { @@ -402,7 +402,7 @@ autoplot.resistance_predict <- function(object, x_name <- paste0(ab_name(attributes(object)$ab), " (", attributes(object)$ab, ")") meet_criteria(main, allow_class = "character", has_length = 1) meet_criteria(ribbon, allow_class = "logical", has_length = 1) - ggplot_rsi_predict(x = object, main = main, ribbon = ribbon, ...) + ggplot_sir_predict(x = object, main = main, ribbon = ribbon, ...) } #' @method fortify resistance_predict diff --git a/R/rsi.R b/R/sir.R similarity index 74% rename from R/rsi.R rename to R/sir.R index 54ad546fb..69dc8b390 100755 --- a/R/rsi.R +++ b/R/sir.R @@ -27,50 +27,50 @@ # how to conduct AMR data analysis: https://msberends.github.io/AMR/ # # ==================================================================== # -#' Interpret MIC and Disk Values, or Clean Raw R/SI Data +#' Translate MIC and Disk Diffusion to SIR, or Clean Existing SIR Data #' -#' Interpret minimum inhibitory concentration (MIC) values and disk diffusion diameters according to EUCAST or CLSI, or clean up existing R/SI values. This transforms the input to a new class [`rsi`], which is an ordered [factor] with levels `S < I < R`. -#' @rdname as.rsi +#' Interpret minimum inhibitory concentration (MIC) values and disk diffusion diameters according to EUCAST or CLSI, or clean up existing SIR values. This transforms the input to a new class [`sir`], which is an ordered [factor] with levels `S < I < R`. +#' @rdname as.sir #' @param x vector of values (for class [`mic`]: MIC values in mg/L, for class [`disk`]: a disk diffusion radius in millimetres) #' @param mo any (vector of) text that can be coerced to valid microorganism codes with [as.mo()], can be left empty to determine it automatically #' @param ab any (vector of) text that can be coerced to a valid antimicrobial drug code with [as.ab()] -#' @param uti (Urinary Tract Infection) A vector with [logical]s (`TRUE` or `FALSE`) to specify whether a UTI specific interpretation from the guideline should be chosen. For using [as.rsi()] on a [data.frame], this can also be a column containing [logical]s or when left blank, the data set will be searched for a column 'specimen', and rows within this column containing 'urin' (such as 'urine', 'urina') will be regarded isolates from a UTI. See *Examples*. +#' @param uti (Urinary Tract Infection) A vector with [logical]s (`TRUE` or `FALSE`) to specify whether a UTI specific interpretation from the guideline should be chosen. For using [as.sir()] on a [data.frame], this can also be a column containing [logical]s or when left blank, the data set will be searched for a column 'specimen', and rows within this column containing 'urin' (such as 'urine', 'urina') will be regarded isolates from a UTI. See *Examples*. #' @inheritParams first_isolate -#' @param guideline defaults to EUCAST `r max(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "EUCAST")$guideline)))` (the latest implemented EUCAST guideline in the [rsi_translation] data set), but can be set with the [option][options()] `AMR_guideline`. Supports EUCAST (`r min(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "EUCAST")$guideline)))`-`r max(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "EUCAST")$guideline)))`) and CLSI (`r min(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "CLSI")$guideline)))`-`r max(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "CLSI")$guideline)))`), see *Details*. +#' @param guideline defaults to EUCAST `r max(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "EUCAST")$guideline)))` (the latest implemented EUCAST guideline in the [clinical_breakpoints] data set), but can be set with the [option][options()] `AMR_guideline`. Supports EUCAST (`r min(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "EUCAST")$guideline)))`-`r max(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "EUCAST")$guideline)))`) and CLSI (`r min(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "CLSI")$guideline)))`-`r max(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "CLSI")$guideline)))`), see *Details*. #' @param conserve_capped_values a [logical] to indicate that MIC values starting with `">"` (but not `">="`) must always return "R" , and that MIC values starting with `"<"` (but not `"<="`) must always return "S" #' @param add_intrinsic_resistance *(only useful when using a EUCAST guideline)* a [logical] to indicate whether intrinsic antibiotic resistance must also be considered for applicable bug-drug combinations, meaning that e.g. ampicillin will always return "R" in *Klebsiella* species. Determination is based on the [intrinsic_resistant] data set, that itself is based on `r format_eucast_version_nr(3.3)`. -#' @param reference_data a [data.frame] to be used for interpretation, which defaults to the [rsi_translation] data set. Changing this argument allows for using own interpretation guidelines. This argument must contain a data set that is equal in structure to the [rsi_translation] data set (same column names and column types). Please note that the `guideline` argument will be ignored when `reference_data` is manually set. +#' @param reference_data a [data.frame] to be used for interpretation, which defaults to the [clinical_breakpoints] data set. Changing this argument allows for using own interpretation guidelines. This argument must contain a data set that is equal in structure to the [clinical_breakpoints] data set (same column names and column types). Please note that the `guideline` argument will be ignored when `reference_data` is manually set. #' @param threshold maximum fraction of invalid antimicrobial interpretations of `x`, see *Examples* -#' @param ... for using on a [data.frame]: names of columns to apply [as.rsi()] on (supports tidy selection such as `column1:column4`). Otherwise: arguments passed on to methods. +#' @param ... for using on a [data.frame]: names of columns to apply [as.sir()] on (supports tidy selection such as `column1:column4`). Otherwise: arguments passed on to methods. #' @details #' ### How it Works #' -#' The [as.rsi()] function works in four ways: +#' The [as.sir()] function works in four ways: #' -#' 1. For **cleaning raw / untransformed data**. The data will be cleaned to only contain values S, I and R and will try its best to determine this with some intelligence. For example, mixed values with R/SI interpretations and MIC values such as `"<0.25; S"` will be coerced to `"S"`. Combined interpretations for multiple test methods (as seen in laboratory records) such as `"S; S"` will be coerced to `"S"`, but a value like `"S; I"` will return `NA` with a warning that the input is unclear. +#' 1. For **cleaning raw / untransformed data**. The data will be cleaned to only contain values S, I and R and will try its best to determine this with some intelligence. For example, mixed values with SIR interpretations and MIC values such as `"<0.25; S"` will be coerced to `"S"`. Combined interpretations for multiple test methods (as seen in laboratory records) such as `"S; S"` will be coerced to `"S"`, but a value like `"S; I"` will return `NA` with a warning that the input is unclear. #' #' 2. For **interpreting minimum inhibitory concentration (MIC) values** according to EUCAST or CLSI. You must clean your MIC values first using [as.mic()], that also gives your columns the new data class [`mic`]. Also, be sure to have a column with microorganism names or codes. It will be found automatically, but can be set manually using the `mo` argument. -#' * Using `dplyr`, R/SI interpretation can be done very easily with either: +#' * Using `dplyr`, SIR interpretation can be done very easily with either: #' ``` -#' your_data %>% mutate_if(is.mic, as.rsi) -#' your_data %>% mutate(across(where(is.mic), as.rsi)) +#' your_data %>% mutate_if(is.mic, as.sir) +#' your_data %>% mutate(across(where(is.mic), as.sir)) #' ``` #' * Operators like "<=" will be stripped before interpretation. When using `conserve_capped_values = TRUE`, an MIC value of e.g. ">2" will always return "R", even if the breakpoint according to the chosen guideline is ">=4". This is to prevent that capped values from raw laboratory data would not be treated conservatively. The default behaviour (`conserve_capped_values = FALSE`) considers ">2" to be lower than ">=4" and might in this case return "S" or "I". #' 3. For **interpreting disk diffusion diameters** according to EUCAST or CLSI. You must clean your disk zones first using [as.disk()], that also gives your columns the new data class [`disk`]. Also, be sure to have a column with microorganism names or codes. It will be found automatically, but can be set manually using the `mo` argument. -#' * Using `dplyr`, R/SI interpretation can be done very easily with either: +#' * Using `dplyr`, SIR interpretation can be done very easily with either: #' ``` -#' your_data %>% mutate_if(is.disk, as.rsi) -#' your_data %>% mutate(across(where(is.disk), as.rsi)) +#' your_data %>% mutate_if(is.disk, as.sir) +#' your_data %>% mutate(across(where(is.disk), as.sir)) #' ``` -#' 4. For **interpreting a complete data set**, with automatic determination of MIC values, disk diffusion diameters, microorganism names or codes, and antimicrobial test results. This is done very simply by running `as.rsi(your_data)`. +#' 4. For **interpreting a complete data set**, with automatic determination of MIC values, disk diffusion diameters, microorganism names or codes, and antimicrobial test results. This is done very simply by running `as.sir(your_data)`. #' -#' For points 2, 3 and 4: Use [rsi_interpretation_history()] to retrieve a [data.frame] (or [tibble][tibble::tibble()] if the `tibble` package is installed) with all results of the last [as.rsi()] call. +#' For points 2, 3 and 4: Use [sir_interpretation_history()] to retrieve a [data.frame] (or [tibble][tibble::tibble()] if the `tibble` package is installed) with all results of the last [as.sir()] call. #' #' ### Supported Guidelines #' -#' For interpreting MIC values as well as disk diffusion diameters, currently implemented guidelines are EUCAST (`r min(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "EUCAST")$guideline)))`-`r max(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "EUCAST")$guideline)))`) and CLSI (`r min(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "CLSI")$guideline)))`-`r max(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "CLSI")$guideline)))`). +#' For interpreting MIC values as well as disk diffusion diameters, currently implemented guidelines are EUCAST (`r min(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "EUCAST")$guideline)))`-`r max(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "EUCAST")$guideline)))`) and CLSI (`r min(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "CLSI")$guideline)))`-`r max(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "CLSI")$guideline)))`). #' -#' Thus, the `guideline` argument must be set to e.g., ``r paste0('"', subset(rsi_translation, guideline %like% "EUCAST")$guideline[1], '"')`` or ``r paste0('"', subset(rsi_translation, guideline %like% "CLSI")$guideline[1], '"')``. By simply using `"EUCAST"` (the default) or `"CLSI"` as input, the latest included version of that guideline will automatically be selected. You can set your own data set using the `reference_data` argument. The `guideline` argument will then be ignored. +#' Thus, the `guideline` argument must be set to e.g., ``r paste0('"', subset(clinical_breakpoints, guideline %like% "EUCAST")$guideline[1], '"')`` or ``r paste0('"', subset(clinical_breakpoints, guideline %like% "CLSI")$guideline[1], '"')``. By simply using `"EUCAST"` (the default) or `"CLSI"` as input, the latest included version of that guideline will automatically be selected. You can set your own data set using the `reference_data` argument. The `guideline` argument will then be ignored. #' #' You can set the default guideline with the `AMR_guideline` [option][options()] (e.g. in your `.Rprofile` file), such as: #' @@ -84,42 +84,44 @@ #' #' ### After Interpretation #' -#' After using [as.rsi()], you can use the [eucast_rules()] defined by EUCAST to (1) apply inferred susceptibility and resistance based on results of other antimicrobials and (2) apply intrinsic resistance based on taxonomic properties of a microorganism. +#' After using [as.sir()], you can use the [eucast_rules()] defined by EUCAST to (1) apply inferred susceptibility and resistance based on results of other antimicrobials and (2) apply intrinsic resistance based on taxonomic properties of a microorganism. #' #' ### Machine-Readable Interpretation Guidelines #' -#' The repository of this package [contains a machine-readable version](https://github.com/msberends/AMR/blob/main/data-raw/rsi_translation.txt) of all guidelines. This is a CSV file consisting of `r format(nrow(AMR::rsi_translation), big.mark = ",")` rows and `r ncol(AMR::rsi_translation)` columns. This file is machine-readable, since it contains one row for every unique combination of the test method (MIC or disk diffusion), the antimicrobial drug and the microorganism. **This allows for easy implementation of these rules in laboratory information systems (LIS)**. Note that it only contains interpretation guidelines for humans - interpretation guidelines from CLSI for animals were removed. +#' The repository of this package [contains a machine-readable version](https://github.com/msberends/AMR/blob/main/data-raw/clinical_breakpoints.txt) of all guidelines. This is a CSV file consisting of `r format(nrow(AMR::clinical_breakpoints), big.mark = ",")` rows and `r ncol(AMR::clinical_breakpoints)` columns. This file is machine-readable, since it contains one row for every unique combination of the test method (MIC or disk diffusion), the antimicrobial drug and the microorganism. **This allows for easy implementation of these rules in laboratory information systems (LIS)**. Note that it only contains interpretation guidelines for humans - interpretation guidelines from CLSI for animals were removed. #' #' ### Other #' -#' The function [is.rsi()] detects if the input contains class `rsi`. If the input is a [data.frame], it iterates over all columns and returns a [logical] vector. +#' The function [is.sir()] detects if the input contains class `sir`. If the input is a [data.frame], it iterates over all columns and returns a [logical] vector. #' -#' The function [is.rsi.eligible()] returns `TRUE` when a columns contains at most 5% invalid antimicrobial interpretations (not S and/or I and/or R), and `FALSE` otherwise. The threshold of 5% can be set with the `threshold` argument. If the input is a [data.frame], it iterates over all columns and returns a [logical] vector. -#' @section Interpretation of R and S/I: -#' In 2019, the European Committee on Antimicrobial Susceptibility Testing (EUCAST) has decided to change the definitions of susceptibility testing categories R and S/I as shown below (). +#' The function [is_sir_eligible()] returns `TRUE` when a columns contains at most 5% invalid antimicrobial interpretations (not S and/or I and/or R), and `FALSE` otherwise. The threshold of 5% can be set with the `threshold` argument. If the input is a [data.frame], it iterates over all columns and returns a [logical] vector. +#' @section 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 as shown below (): #' +#' - **S - Susceptible, standard dosing regimen**\cr +#' A microorganism is categorised as "Susceptible, standard dosing regimen", when there is a high likelihood of therapeutic success using a standard dosing regimen of the agent. +#' - **I - Susceptible, increased exposure** *\cr +#' A microorganism is categorised as "Susceptible, Increased exposure*" when there is a high likelihood of therapeutic success because exposure to the agent is increased by adjusting the dosing regimen or by its concentration at the site of infection. #' - **R = Resistant**\cr -#' A microorganism is categorised as *Resistant* when there is a high likelihood of therapeutic failure even when there is increased exposure. Exposure is a function of how the mode of administration, dose, dosing interval, infusion time, as well as distribution and excretion of the antimicrobial agent will influence the infecting organism at the site of infection. -#' - **S = Susceptible**\cr -#' A microorganism is categorised as *Susceptible, standard dosing regimen*, when there is a high likelihood of therapeutic success using a standard dosing regimen of the agent. -#' - **I = Susceptible, Increased exposure**\cr -#' A microorganism is categorised as *Susceptible, Increased exposure* when there is a high likelihood of therapeutic success because exposure to the agent is increased by adjusting the dosing regimen or by its concentration at the site of infection. +#' A microorganism is categorised as "Resistant" when there is a high likelihood of therapeutic failure even when there is increased exposure. +#' +#' * *Exposure* is a function of how the mode of administration, dose, dosing interval, infusion time, as well as distribution and excretion of the antimicrobial agent will influence the infecting organism at the site of infection. #' #' This AMR package honours this insight. Use [susceptibility()] (equal to [proportion_SI()]) to determine antimicrobial susceptibility and [count_susceptible()] (equal to [count_SI()]) to count susceptible isolates. -#' @return Ordered [factor] with new class `rsi` -#' @aliases rsi +#' @return Ordered [factor] with new class `sir` +#' @aliases sir #' @export #' @seealso [as.mic()], [as.disk()], [as.mo()] #' @source #' For interpretations of minimum inhibitory concentration (MIC) values and disk diffusion diameters: #' -#' - **M39 Analysis and Presentation of Cumulative Antimicrobial Susceptibility Test Data**, `r min(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "CLSI")$guideline)))`-`r max(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "CLSI")$guideline)))`, *Clinical and Laboratory Standards Institute* (CLSI). . -#' - **M100 Performance Standard for Antimicrobial Susceptibility Testing**, `r min(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "CLSI")$guideline)))`-`r max(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "CLSI")$guideline)))`, *Clinical and Laboratory Standards Institute* (CLSI). . -#' - **Breakpoint tables for interpretation of MICs and zone diameters**, `r min(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "EUCAST")$guideline)))`-`r max(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "EUCAST")$guideline)))`, *European Committee on Antimicrobial Susceptibility Testing* (EUCAST). . +#' - **M39 Analysis and Presentation of Cumulative Antimicrobial Susceptibility Test Data**, `r min(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "CLSI")$guideline)))`-`r max(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "CLSI")$guideline)))`, *Clinical and Laboratory Standards Institute* (CLSI). . +#' - **M100 Performance Standard for Antimicrobial Susceptibility Testing**, `r min(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "CLSI")$guideline)))`-`r max(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "CLSI")$guideline)))`, *Clinical and Laboratory Standards Institute* (CLSI). . +#' - **Breakpoint tables for interpretation of MICs and zone diameters**, `r min(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "EUCAST")$guideline)))`-`r max(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "EUCAST")$guideline)))`, *European Committee on Antimicrobial Susceptibility Testing* (EUCAST). . #' @inheritSection AMR Reference Data Publicly Available #' @examples #' example_isolates -#' summary(example_isolates) # see all R/SI results at a glance +#' summary(example_isolates) # see all SIR results at a glance #' #' # For INTERPRETING disk diffusion and MIC values ----------------------- #' @@ -132,20 +134,20 @@ #' TOB = as.disk(16), #' ERY = "R" #' ) -#' as.rsi(df) +#' as.sir(df) #' #' # return a 'logbook' about the results: -#' rsi_interpretation_history() +#' sir_interpretation_history() #' #' # for single values -#' as.rsi( +#' as.sir( #' x = as.mic(2), #' mo = as.mo("S. pneumoniae"), #' ab = "AMP", #' guideline = "EUCAST" #' ) #' -#' as.rsi( +#' as.sir( #' x = as.disk(18), #' mo = "Strep pneu", # `mo` will be coerced with as.mo() #' ab = "ampicillin", # and `ab` with as.ab() @@ -155,14 +157,14 @@ #' \donttest{ #' # the dplyr way #' if (require("dplyr")) { -#' df %>% mutate_if(is.mic, as.rsi) -#' df %>% mutate_if(function(x) is.mic(x) | is.disk(x), as.rsi) -#' df %>% mutate(across(where(is.mic), as.rsi)) -#' df %>% mutate_at(vars(AMP:TOB), as.rsi) -#' df %>% mutate(across(AMP:TOB, as.rsi)) +#' df %>% mutate_if(is.mic, as.sir) +#' df %>% mutate_if(function(x) is.mic(x) | is.disk(x), as.sir) +#' df %>% mutate(across(where(is.mic), as.sir)) +#' df %>% mutate_at(vars(AMP:TOB), as.sir) +#' df %>% mutate(across(AMP:TOB, as.sir)) #' #' df %>% -#' mutate_at(vars(AMP:TOB), as.rsi, mo = .$microorganism) +#' mutate_at(vars(AMP:TOB), as.sir, mo = .$microorganism) #' #' # to include information about urinary tract infections (UTI) #' data.frame( @@ -170,74 +172,74 @@ #' NIT = c("<= 2", 32), #' from_the_bladder = c(TRUE, FALSE) #' ) %>% -#' as.rsi(uti = "from_the_bladder") +#' as.sir(uti = "from_the_bladder") #' #' data.frame( #' mo = "E. coli", #' NIT = c("<= 2", 32), #' specimen = c("urine", "blood") #' ) %>% -#' as.rsi() # automatically determines urine isolates +#' as.sir() # automatically determines urine isolates #' #' df %>% -#' mutate_at(vars(AMP:TOB), as.rsi, mo = "E. coli", uti = TRUE) +#' mutate_at(vars(AMP:TOB), as.sir, mo = "E. coli", uti = TRUE) #' } #' -#' # For CLEANING existing R/SI values ------------------------------------ +#' # For CLEANING existing SIR values ------------------------------------ #' -#' as.rsi(c("S", "I", "R", "A", "B", "C")) -#' as.rsi("<= 0.002; S") # will return "S" -#' rsi_data <- as.rsi(c(rep("S", 474), rep("I", 36), rep("R", 370))) -#' is.rsi(rsi_data) -#' plot(rsi_data) # for percentages -#' barplot(rsi_data) # for frequencies +#' as.sir(c("S", "I", "R", "A", "B", "C")) +#' as.sir("<= 0.002; S") # will return "S" +#' sir_data <- as.sir(c(rep("S", 474), rep("I", 36), rep("R", 370))) +#' is.sir(sir_data) +#' plot(sir_data) # for percentages +#' barplot(sir_data) # for frequencies #' #' # the dplyr way #' if (require("dplyr")) { #' example_isolates %>% -#' mutate_at(vars(PEN:RIF), as.rsi) +#' mutate_at(vars(PEN:RIF), as.sir) #' # same: #' example_isolates %>% -#' as.rsi(PEN:RIF) +#' as.sir(PEN:RIF) #' -#' # fastest way to transform all columns with already valid AMR results to class `rsi`: +#' # fastest way to transform all columns with already valid AMR results to class `sir`: #' example_isolates %>% -#' mutate_if(is.rsi.eligible, as.rsi) +#' mutate_if(is_sir_eligible, as.sir) #' #' # since dplyr 1.0.0, this can also be: #' # example_isolates %>% -#' # mutate(across(where(is.rsi.eligible), as.rsi)) +#' # mutate(across(where(is_sir_eligible), as.sir)) #' } #' } -as.rsi <- function(x, ...) { - UseMethod("as.rsi") +as.sir <- function(x, ...) { + UseMethod("as.sir") } -#' @rdname as.rsi -#' @details `NA_rsi_` is a missing value of the new `rsi` class, analogous to e.g. base \R's [`NA_character_`][base::NA]. +#' @rdname as.sir +#' @details `NA_sir_` is a missing value of the new `sir` class, analogous to e.g. base \R's [`NA_character_`][base::NA]. #' @export -NA_rsi_ <- set_clean_class(factor(NA, levels = c("S", "I", "R"), ordered = TRUE), - new_class = c("rsi", "ordered", "factor") +NA_sir_ <- set_clean_class(factor(NA_character_, levels = c("S", "I", "R"), ordered = TRUE), + new_class = c("sir", "ordered", "factor") ) -#' @rdname as.rsi +#' @rdname as.sir #' @export -is.rsi <- function(x) { +is.sir <- function(x) { if (inherits(x, "data.frame")) { - unname(vapply(FUN.VALUE = logical(1), x, is.rsi)) + unname(vapply(FUN.VALUE = logical(1), x, is.sir)) } else { - inherits(x, "rsi") + inherits(x, "sir") } } -#' @rdname as.rsi +#' @rdname as.sir #' @export -is.rsi.eligible <- function(x, threshold = 0.05) { +is_sir_eligible <- function(x, threshold = 0.05) { meet_criteria(threshold, allow_class = "numeric", has_length = 1) if (inherits(x, "data.frame")) { # iterate this function over all columns - return(unname(vapply(FUN.VALUE = logical(1), x, is.rsi.eligible))) + return(unname(vapply(FUN.VALUE = logical(1), x, is_sir_eligible))) } stop_if(NCOL(x) > 1, "`x` must be a one-dimensional vector.") @@ -256,9 +258,9 @@ is.rsi.eligible <- function(x, threshold = 0.05) { %in% class(x))) { # no transformation needed return(FALSE) - } else if (all(x %in% c("R", "S", "I", NA)) & !all(is.na(x))) { + } else if (all(x %in% c("S", "I", "R", NA)) & !all(is.na(x))) { return(TRUE) - } else if (!any(c("R", "S", "I") %in% x, na.rm = TRUE) & !all(is.na(x))) { + } else if (!any(c("S", "I", "R") %in% x, na.rm = TRUE) & !all(is.na(x))) { return(FALSE) } else { x <- x[!is.na(x) & !is.null(x) & !x %in% c("", "-", "NULL")] @@ -270,7 +272,7 @@ is.rsi.eligible <- function(x, threshold = 0.05) { if (!is.na(ab)) { # this is a valid antibiotic drug code message_( - "Column '", font_bold(cur_col), "' is as.rsi()-eligible (despite only having empty values), since it seems to be ", + "Column '", font_bold(cur_col), "' is SIR eligible (despite only having empty values), since it seems to be ", ab_name(ab, language = NULL, tolower = TRUE), " (", ab, ")" ) return(TRUE) @@ -280,7 +282,7 @@ is.rsi.eligible <- function(x, threshold = 0.05) { return(FALSE) } # transform all values and see if it meets the set threshold - checked <- suppressWarnings(as.rsi(x)) + checked <- suppressWarnings(as.sir(x)) outcome <- sum(is.na(checked)) / length(x) outcome <= threshold } @@ -288,8 +290,8 @@ is.rsi.eligible <- function(x, threshold = 0.05) { #' @export # extra param: warn (logical, to never throw a warning) -as.rsi.default <- function(x, ...) { - if (is.rsi(x)) { +as.sir.default <- function(x, ...) { + if (is.sir(x)) { return(x) } @@ -299,7 +301,7 @@ as.rsi.default <- function(x, ...) { if (inherits(x.bak, c("integer", "numeric", "double")) && all(x %in% c(1:3, NA))) { # support haven package for importing e.g., from SPSS - it adds the 'labels' attribute lbls <- attributes(x.bak)$labels - if (!is.null(lbls) && all(c("R", "S", "I") %in% names(lbls)) && all(c(1:3) %in% lbls)) { + if (!is.null(lbls) && all(c("S", "I", "R") %in% names(lbls)) && all(c(1:3) %in% lbls)) { x[x.bak == 1] <- names(lbls[lbls == 1]) x[x.bak == 2] <- names(lbls[lbls == 2]) x[x.bak == 3] <- names(lbls[lbls == 3]) @@ -312,13 +314,13 @@ as.rsi.default <- function(x, ...) { x[x.bak == "1"] <- "S" x[x.bak == "2"] <- "I" x[x.bak == "3"] <- "R" - } else if (!all(is.na(x)) && !identical(levels(x), c("R", "S", "I")) && !all(x %in% c("R", "S", "I", NA))) { + } else if (!all(is.na(x)) && !identical(levels(x), c("S", "I", "R")) && !all(x %in% c("S", "I", "R", NA))) { if (all(x %unlike% "(R|S|I)", na.rm = TRUE)) { # check if they are actually MICs or disks if (all_valid_mics(x)) { - warning_("in `as.rsi()`: the input seems to contain MIC values. You can transform them with `as.mic()` before running `as.rsi()` to interpret them.") + warning_("in `as.sir()`: the input seems to contain MIC values. You can transform them with `as.mic()` before running `as.sir()` to interpret them.") } else if (all_valid_disks(x)) { - warning_("in `as.rsi()`: the input seems to contain disk diffusion values. You can transform them with `as.disk()` before running `as.rsi()` to interpret them.") + warning_("in `as.sir()`: the input seems to contain disk diffusion values. You can transform them with `as.disk()` before running `as.sir()` to interpret them.") } } @@ -368,14 +370,14 @@ as.rsi.default <- function(x, ...) { x[!x %in% c("S", "I", "R")] <- NA_character_ na_after <- length(x[is.na(x) | x == ""]) - if (!isFALSE(list(...)$warn)) { # so as.rsi(..., warn = FALSE) will never throw a warning + if (!isFALSE(list(...)$warn)) { # so as.sir(..., warn = FALSE) will never throw a warning if (na_before != na_after) { list_missing <- x.bak[is.na(x) & !is.na(x.bak) & x.bak != ""] %pm>% unique() %pm>% sort() %pm>% vector_and(quotes = TRUE) cur_col <- get_current_column() - warning_("in `as.rsi()`: ", na_after - na_before, " result", + warning_("in `as.sir()`: ", na_after - na_before, " result", ifelse(na_after - na_before > 1, "s", ""), ifelse(is.null(cur_col), "", paste0(" in column '", cur_col, "'")), " truncated (", @@ -385,38 +387,38 @@ as.rsi.default <- function(x, ...) { call = FALSE ) } - if (any(toupper(x.bak[!is.na(x.bak)]) == "U") && message_not_thrown_before("as.rsi", "U")) { - warning_("in `as.rsi()`: 'U' was interpreted as 'S', following some laboratory systems") + if (any(toupper(x.bak[!is.na(x.bak)]) == "U") && message_not_thrown_before("as.sir", "U")) { + warning_("in `as.sir()`: 'U' was interpreted as 'S', following some laboratory systems") } - if (any(toupper(x.bak[!is.na(x.bak)]) == "D") && message_not_thrown_before("as.rsi", "D")) { - warning_("in `as.rsi()`: 'D' (dose-dependent) was interpreted as 'I', following some laboratory systems") + if (any(toupper(x.bak[!is.na(x.bak)]) == "D") && message_not_thrown_before("as.sir", "D")) { + warning_("in `as.sir()`: 'D' (dose-dependent) was interpreted as 'I', following some laboratory systems") } - if (any(toupper(x.bak[!is.na(x.bak)]) == "SDD") && message_not_thrown_before("as.rsi", "SDD")) { - warning_("in `as.rsi()`: 'SDD' (susceptible dose-dependent, coined by CLSI) was interpreted as 'I' to comply with EUCAST's 'I'") + if (any(toupper(x.bak[!is.na(x.bak)]) == "SDD") && message_not_thrown_before("as.sir", "SDD")) { + warning_("in `as.sir()`: 'SDD' (susceptible dose-dependent, coined by CLSI) was interpreted as 'I' to comply with EUCAST's 'I'") } - if (any(toupper(x.bak[!is.na(x.bak)]) == "H") && message_not_thrown_before("as.rsi", "H")) { - warning_("in `as.rsi()`: 'H' was interpreted as 'I', following some laboratory systems") + if (any(toupper(x.bak[!is.na(x.bak)]) == "H") && message_not_thrown_before("as.sir", "H")) { + warning_("in `as.sir()`: 'H' was interpreted as 'I', following some laboratory systems") } } } set_clean_class(factor(x, levels = c("S", "I", "R"), ordered = TRUE), - new_class = c("rsi", "ordered", "factor") + new_class = c("sir", "ordered", "factor") ) } -#' @rdname as.rsi +#' @rdname as.sir #' @export -as.rsi.mic <- function(x, +as.sir.mic <- function(x, mo = NULL, ab = deparse(substitute(x)), guideline = getOption("AMR_guideline", "EUCAST"), uti = NULL, conserve_capped_values = FALSE, add_intrinsic_resistance = FALSE, - reference_data = AMR::rsi_translation, + reference_data = AMR::clinical_breakpoints, ...) { - as_rsi_method( + as_sir_method( method_short = "mic", method_long = "MIC values", x = x, @@ -431,17 +433,17 @@ as.rsi.mic <- function(x, ) } -#' @rdname as.rsi +#' @rdname as.sir #' @export -as.rsi.disk <- function(x, +as.sir.disk <- function(x, mo = NULL, ab = deparse(substitute(x)), guideline = getOption("AMR_guideline", "EUCAST"), uti = NULL, add_intrinsic_resistance = FALSE, - reference_data = AMR::rsi_translation, + reference_data = AMR::clinical_breakpoints, ...) { - as_rsi_method( + as_sir_method( method_short = "disk", method_long = "disk diffusion zones", x = x, @@ -456,16 +458,16 @@ as.rsi.disk <- function(x, ) } -#' @rdname as.rsi +#' @rdname as.sir #' @export -as.rsi.data.frame <- function(x, +as.sir.data.frame <- function(x, ..., col_mo = NULL, guideline = getOption("AMR_guideline", "EUCAST"), uti = NULL, conserve_capped_values = FALSE, add_intrinsic_resistance = FALSE, - reference_data = AMR::rsi_translation) { + reference_data = AMR::clinical_breakpoints) { meet_criteria(x, allow_class = "data.frame") # will also check for dimensions > 0 meet_criteria(col_mo, allow_class = "character", is_in = colnames(x), allow_NULL = TRUE) meet_criteria(guideline, allow_class = "character", has_length = 1) @@ -525,7 +527,7 @@ as.rsi.data.frame <- function(x, vector_and(values, quotes = TRUE), " in column '", font_bold(col_specimen), "' reflect", plural[2], " ", plural[3], "urinary tract infection", plural[1], - ".\n Use `as.rsi(uti = FALSE)` to prevent this." + ".\n Use `as.sir(uti = FALSE)` to prevent this." ) } else { # no data about UTI's found @@ -576,7 +578,7 @@ as.rsi.data.frame <- function(x, types[vapply(FUN.VALUE = logical(1), x.bak[, ab_cols, drop = FALSE], is.mic)] <- "mic" types[types == "" & vapply(FUN.VALUE = logical(1), x[, ab_cols, drop = FALSE], all_valid_disks)] <- "disk" types[types == "" & vapply(FUN.VALUE = logical(1), x[, ab_cols, drop = FALSE], all_valid_mics)] <- "mic" - types[types == "" & !vapply(FUN.VALUE = logical(1), x.bak[, ab_cols, drop = FALSE], is.rsi)] <- "rsi" + types[types == "" & !vapply(FUN.VALUE = logical(1), x.bak[, ab_cols, drop = FALSE], is.sir)] <- "sir" if (any(types %in% c("mic", "disk"), na.rm = TRUE)) { # now we need an mo column stop_if(is.null(col_mo), "`col_mo` must be set") @@ -593,7 +595,7 @@ as.rsi.data.frame <- function(x, pm_pull(ab_cols[i]) %pm>% as.character() %pm>% as.mic() %pm>% - as.rsi( + as.sir( mo = x_mo, mo.bak = x[, col_mo, drop = TRUE], ab = ab_cols[i], @@ -609,7 +611,7 @@ as.rsi.data.frame <- function(x, pm_pull(ab_cols[i]) %pm>% as.character() %pm>% as.disk() %pm>% - as.rsi( + as.sir( mo = x_mo, mo.bak = x[, col_mo, drop = TRUE], ab = ab_cols[i], @@ -619,11 +621,11 @@ as.rsi.data.frame <- function(x, reference_data = reference_data, is_data.frame = TRUE ) - } else if (types[i] == "rsi") { + } else if (types[i] == "sir") { show_message <- FALSE ab <- ab_cols[i] ab_coerced <- suppressWarnings(as.ab(ab)) - if (!all(x[, ab_cols[i], drop = TRUE] %in% c("R", "S", "I", NA), na.rm = TRUE)) { + if (!all(x[, ab_cols[i], drop = TRUE] %in% c("S", "I", "R", NA), na.rm = TRUE)) { show_message <- TRUE # only print message if values are not already clean message_("=> Cleaning values in column '", font_bold(ab), "' (", @@ -632,17 +634,17 @@ as.rsi.data.frame <- function(x, appendLF = FALSE, as_note = FALSE ) - } else if (!is.rsi(x.bak[, ab_cols[i], drop = TRUE])) { + } else if (!is.sir(x.bak[, ab_cols[i], drop = TRUE])) { show_message <- TRUE # only print message if class not already set - message_("=> Assigning class 'rsi' to already clean column '", font_bold(ab), "' (", + message_("=> Assigning class 'sir' to already clean column '", font_bold(ab), "' (", ifelse(ab_coerced != toupper(ab), paste0(ab_coerced, ", "), ""), ab_name(ab_coerced, tolower = TRUE, language = NULL), ")... ", appendLF = FALSE, as_note = FALSE ) } - x[, ab_cols[i]] <- as.rsi.default(x = as.character(x[, ab_cols[i], drop = TRUE])) + x[, ab_cols[i]] <- as.sir.default(x = as.character(x[, ab_cols[i], drop = TRUE])) if (show_message == TRUE) { message_(" OK.", add_fn = list(font_green), as_note = FALSE) } @@ -653,7 +655,7 @@ as.rsi.data.frame <- function(x, } get_guideline <- function(guideline, reference_data) { - if (!identical(reference_data, AMR::rsi_translation)) { + if (!identical(reference_data, AMR::clinical_breakpoints)) { return(guideline) } guideline_param <- toupper(guideline) @@ -674,7 +676,7 @@ get_guideline <- function(guideline, reference_data) { guideline_param } -as_rsi_method <- function(method_short, +as_sir_method <- function(method_short, method_long, x, mo, @@ -728,15 +730,15 @@ as_rsi_method <- function(method_short, ) } if (is.null(mo)) { - stop_("No information was supplied about the microorganisms (missing argument `mo` and no column of class 'mo' found). See ?as.rsi.\n\n", - "To transform certain columns with e.g. mutate(), use `data %>% mutate(across(..., as.rsi, mo = x))`, where x is your column with microorganisms.\n", - "To tranform all ", method_long, " in a data set, use `data %>% as.rsi()` or `data %>% mutate_if(is.", method_short, ", as.rsi)`.", + stop_("No information was supplied about the microorganisms (missing argument `mo` and no column of class 'mo' found). See ?as.sir.\n\n", + "To transform certain columns with e.g. mutate(), use `data %>% mutate(across(..., as.sir, mo = x))`, where x is your column with microorganisms.\n", + "To tranform all ", method_long, " in a data set, use `data %>% as.sir()` or `data %>% mutate_if(is.", method_short, ", as.sir)`.", call = FALSE ) } if (length(ab) == 1 && ab %like% paste0("as.", method_short)) { - stop_("No unambiguous name was supplied about the antibiotic (argument `ab`). See ?as.rsi.", call = FALSE) + stop_("No unambiguous name was supplied about the antibiotic (argument `ab`). See ?as.sir.", call = FALSE) } ab.bak <- ab @@ -746,7 +748,7 @@ as_rsi_method <- function(method_short, } else { mo.bak <- mo } - # be sure to take current taxonomy, as the rsi_translation data set only contains current taxonomy + # be sure to take current taxonomy, as the clinical_breakpoints data set only contains current taxonomy mo <- suppressWarnings(suppressMessages(as.mo(mo, keep_synonyms = FALSE, inf0 = FALSE))) guideline_coerced <- get_guideline(guideline, reference_data) if (is.na(ab)) { @@ -755,7 +757,7 @@ as_rsi_method <- function(method_short, add_fn = font_red, as_note = FALSE ) - return(as.rsi(rep(NA, length(x)))) + return(as.sir(rep(NA, length(x)))) } if (length(mo) == 1) { mo <- rep(mo, length(x)) @@ -768,8 +770,8 @@ as_rsi_method <- function(method_short, } if (isTRUE(add_intrinsic_resistance) && guideline_coerced %unlike% "EUCAST") { - if (message_not_thrown_before("as.rsi", "intrinsic")) { - warning_("in `as.rsi()`: using 'add_intrinsic_resistance' is only useful when using EUCAST guidelines, since the rules for intrinsic resistance are based on EUCAST.") + if (message_not_thrown_before("as.sir", "intrinsic")) { + warning_("in `as.sir()`: using 'add_intrinsic_resistance' is only useful when using EUCAST guidelines, since the rules for intrinsic resistance are based on EUCAST.") } } @@ -791,7 +793,7 @@ as_rsi_method <- function(method_short, message_("=> Interpreting ", method_long, " of ", ifelse(isTRUE(list(...)$is_data.frame), "column ", ""), agent_formatted, mo_var_found, - " according to ", ifelse(identical(reference_data, AMR::rsi_translation), + " according to ", ifelse(identical(reference_data, AMR::clinical_breakpoints), font_bold(guideline_coerced), "manually defined 'reference_data'" ), @@ -814,14 +816,14 @@ as_rsi_method <- function(method_short, df <- data.frame(values = x, mo = mo, - result = NA_rsi_, + result = NA_sir_, uti = uti, stringsAsFactors = FALSE) if (method == "mic") { - # when as.rsi.mic is called directly + # when as.sir.mic is called directly df$values <- as.mic(df$values) } else if (method == "disk") { - # when as.rsi.disk is called directly + # when as.sir.disk is called directly df$values <- as.disk(df$values) } @@ -831,7 +833,7 @@ as_rsi_method <- function(method_short, ab_coerced <- ab mo_coerced <- mo - if (identical(reference_data, AMR::rsi_translation)) { + if (identical(reference_data, AMR::clinical_breakpoints)) { breakpoints <- reference_data %pm>% subset(guideline == guideline_coerced & method == method_coerced & ab == ab_coerced) if (ab_coerced == "AMX" && nrow(breakpoints) == 0) { @@ -851,7 +853,7 @@ as_rsi_method <- function(method_short, suppressMessages(suppressWarnings(ab_name(ab_coerced, language = NULL, tolower = TRUE))), " (", ab_coerced, ")")) load_mo_uncertainties(metadata_mo) - return(rep(NA_rsi_, nrow(df))) + return(rep(NA_sir_, nrow(df))) } if (guideline_coerced %like% "EUCAST") { @@ -865,7 +867,7 @@ as_rsi_method <- function(method_short, rows <- which(df$mo == mo_unique) values <- df[rows, "values", drop = TRUE] uti <- df[rows, "uti", drop = TRUE] - new_rsi <- rep(NA_rsi_, length(rows)) + new_sir <- rep(NA_sir_, length(rows)) # find different mo properties mo_current_genus <- as.mo(mo_genus(mo_unique, language = NULL)) @@ -903,7 +905,7 @@ as_rsi_method <- function(method_short, breakpoints_current <- breakpoints_current %pm>% # be as specific as possible (i.e. prefer species over genus): # the below `pm_desc(uti)` will put `TRUE` on top and FALSE on bottom - pm_arrange(rank_index, pm_desc(uti)) # 'uti' is a column in data set 'rsi_translation' + pm_arrange(rank_index, pm_desc(uti)) # 'uti' is a column in data set 'clinical_breakpoints' } else { breakpoints_current <- breakpoints_current %pm>% # sort UTI = FALSE first, then UTI = TRUE @@ -911,16 +913,16 @@ as_rsi_method <- function(method_short, } # throw notes for different body sites - if (nrow(breakpoints_current) == 1 && all(breakpoints_current$uti == TRUE) && any(uti %in% c(FALSE, NA)) && message_not_thrown_before("as.rsi", "uti", ab_coerced)) { + if (nrow(breakpoints_current) == 1 && all(breakpoints_current$uti == TRUE) && any(uti %in% c(FALSE, NA)) && message_not_thrown_before("as.sir", "uti", ab_coerced)) { # only UTI breakpoints available - warning_("in `as.rsi()`: interpretation of ", font_bold(ab_formatted), " is only available for (uncomplicated) urinary tract infections (UTI) for some microorganisms, thus assuming `uti = TRUE`. See `?as.rsi`.") + warning_("in `as.sir()`: interpretation of ", font_bold(ab_formatted), " is only available for (uncomplicated) urinary tract infections (UTI) for some microorganisms, thus assuming `uti = TRUE`. See `?as.sir`.") rise_warning <- TRUE - } else if (nrow(breakpoints_current) > 1 && length(unique(breakpoints_current$site)) > 1 && any(is.na(uti)) && all(c(TRUE, FALSE) %in% breakpoints_current$uti, na.rm = TRUE) && message_not_thrown_before("as.rsi", "siteUTI", mo_unique, ab_coerced)) { + } else if (nrow(breakpoints_current) > 1 && length(unique(breakpoints_current$site)) > 1 && any(is.na(uti)) && all(c(TRUE, FALSE) %in% breakpoints_current$uti, na.rm = TRUE) && message_not_thrown_before("as.sir", "siteUTI", mo_unique, ab_coerced)) { # both UTI and Non-UTI breakpoints available - msgs <- c(msgs, paste0("Breakpoints for UTI ", font_underline("and"), " non-UTI available for ", ab_formatted, " in ", mo_formatted, " - assuming non-UTI. Use argument `uti` to set which isolates are from urine. See `?as.rsi`.")) + msgs <- c(msgs, paste0("Breakpoints for UTI ", font_underline("and"), " non-UTI available for ", ab_formatted, " in ", mo_formatted, " - assuming non-UTI. Use argument `uti` to set which isolates are from urine. See `?as.sir`.")) breakpoints_current <- breakpoints_current %pm>% pm_filter(uti == FALSE) - } else if (nrow(breakpoints_current) > 1 && length(unique(breakpoints_current$site)) > 1 && all(breakpoints_current$uti == FALSE, na.rm = TRUE) && message_not_thrown_before("as.rsi", "siteOther", mo_unique, ab_coerced)) { + } else if (nrow(breakpoints_current) > 1 && length(unique(breakpoints_current$site)) > 1 && all(breakpoints_current$uti == FALSE, na.rm = TRUE) && message_not_thrown_before("as.sir", "siteOther", mo_unique, ab_coerced)) { # breakpoints for multiple body sites available site <- breakpoints_current[1L, "site", drop = FALSE] # this is the one we'll take if (is.na(site)) { @@ -934,40 +936,40 @@ as_rsi_method <- function(method_short, # first check if mo is intrinsic resistant if (isTRUE(add_intrinsic_resistance) && guideline_coerced %like% "EUCAST" && paste(mo_unique, ab_coerced) %in% AMR_env$intrinsic_resistant) { msgs <- c(msgs, paste0("Intrinsic resistance applied for ", ab_formatted, " in ", mo_formatted, "")) - new_rsi <- rep(as.rsi("R"), length(rows)) + new_sir <- rep(as.sir("R"), length(rows)) } else { # then run the rules breakpoints_current <- breakpoints_current[1L, , drop = FALSE] if (method == "mic") { - new_rsi <- quick_case_when( - is.na(values) ~ NA_rsi_, - values <= breakpoints_current$breakpoint_S ~ as.rsi("S"), - guideline_coerced %like% "EUCAST" & values > breakpoints_current$breakpoint_R ~ as.rsi("R"), - guideline_coerced %like% "CLSI" & values >= breakpoints_current$breakpoint_R ~ as.rsi("R"), + new_sir <- quick_case_when( + is.na(values) ~ NA_sir_, + values <= breakpoints_current$breakpoint_S ~ as.sir("S"), + guideline_coerced %like% "EUCAST" & values > breakpoints_current$breakpoint_R ~ as.sir("R"), + guideline_coerced %like% "CLSI" & values >= breakpoints_current$breakpoint_R ~ as.sir("R"), # return "I" when breakpoints are in the middle - !is.na(breakpoints_current$breakpoint_S) & !is.na(breakpoints_current$breakpoint_R) ~ as.rsi("I"), + !is.na(breakpoints_current$breakpoint_S) & !is.na(breakpoints_current$breakpoint_R) ~ as.sir("I"), # and NA otherwise - TRUE ~ NA_rsi_ + TRUE ~ NA_sir_ ) } else if (method == "disk") { - new_rsi <- quick_case_when( - is.na(values) ~ NA_rsi_, - as.double(values) >= as.double(breakpoints_current$breakpoint_S) ~ as.rsi("S"), - guideline_coerced %like% "EUCAST" & as.double(values) < as.double(breakpoints_current$breakpoint_R) ~ as.rsi("R"), - guideline_coerced %like% "CLSI" & as.double(values) <= as.double(breakpoints_current$breakpoint_R) ~ as.rsi("R"), + new_sir <- quick_case_when( + is.na(values) ~ NA_sir_, + as.double(values) >= as.double(breakpoints_current$breakpoint_S) ~ as.sir("S"), + guideline_coerced %like% "EUCAST" & as.double(values) < as.double(breakpoints_current$breakpoint_R) ~ as.sir("R"), + guideline_coerced %like% "CLSI" & as.double(values) <= as.double(breakpoints_current$breakpoint_R) ~ as.sir("R"), # return "I" when breakpoints are in the middle - !is.na(breakpoints_current$breakpoint_S) & !is.na(breakpoints_current$breakpoint_R) ~ as.rsi("I"), + !is.na(breakpoints_current$breakpoint_S) & !is.na(breakpoints_current$breakpoint_R) ~ as.sir("I"), # and NA otherwise - TRUE ~ NA_rsi_ + TRUE ~ NA_sir_ ) } # write to verbose output - AMR_env$rsi_interpretation_history <- rbind( - AMR_env$rsi_interpretation_history, + AMR_env$sir_interpretation_history <- rbind( + AMR_env$sir_interpretation_history, # recycling 1 to 2 rows does not seem to work, which is why rep() was added data.frame( datetime = rep(Sys.time(), length(rows)), @@ -980,14 +982,14 @@ as_rsi_method <- function(method_short, ref_table = rep(breakpoints_current[, "ref_tbl", drop = TRUE], length(rows)), method = rep(method_coerced, length(rows)), input = as.double(values), - outcome = as.rsi(new_rsi), + outcome = as.sir(new_sir), breakpoint_S_R = rep(paste0(breakpoints_current[, "breakpoint_S", drop = TRUE], "-", breakpoints_current[, "breakpoint_R", drop = TRUE]), length(rows)), stringsAsFactors = FALSE ) ) } - df[rows, "result"] <- new_rsi + df[rows, "result"] <- new_sir } if (isTRUE(rise_warning)) { @@ -1003,26 +1005,26 @@ as_rsi_method <- function(method_short, df$result } -#' @rdname as.rsi +#' @rdname as.sir #' @param clean a [logical] to indicate whether previously stored results should be forgotten after returning the 'logbook' with results #' @export -rsi_interpretation_history <- function(clean = FALSE) { +sir_interpretation_history <- function(clean = FALSE) { meet_criteria(clean, allow_class = "logical", has_length = 1) - out.bak <- AMR_env$rsi_interpretation_history + out.bak <- AMR_env$sir_interpretation_history out <- out.bak if (NROW(out) == 0) { - message_("No results to return. Run `as.rsi()` on MIC values or disk diffusion zones first to see a 'logbook' data set here.") + message_("No results to return. Run `as.sir()` on MIC values or disk diffusion zones first to see a 'logbook' data set here.") return(invisible(NULL)) } out$ab_guideline <- as.ab(out$ab_guideline) out$mo_guideline <- as.mo(out$mo_guideline) - out$outcome <- as.rsi(out$outcome) + out$outcome <- as.sir(out$outcome) # keep stored for next use if (isTRUE(clean)) { - AMR_env$rsi_interpretation_history <- AMR_env$rsi_interpretation_history[0, , drop = FALSE] + AMR_env$sir_interpretation_history <- AMR_env$sir_interpretation_history[0, , drop = FALSE] } else { - AMR_env$rsi_interpretation_history <- out.bak + AMR_env$sir_interpretation_history <- out.bak } if (pkg_is_available("tibble", also_load = FALSE)) { @@ -1033,26 +1035,26 @@ rsi_interpretation_history <- function(clean = FALSE) { } # will be exported using s3_register() in R/zzz.R -pillar_shaft.rsi <- function(x, ...) { +pillar_shaft.sir <- function(x, ...) { out <- trimws(format(x)) if (has_colour()) { # colours will anyway not work when has_colour() == FALSE, # but then the indentation should also not be applied out[is.na(x)] <- font_grey(" NA") - out[x == "R"] <- font_red_bg(" R ") out[x == "S"] <- font_green_bg(" S ") out[x == "I"] <- font_orange_bg(" I ") + out[x == "R"] <- font_red_bg(" R ") } create_pillar_column(out, align = "left", width = 5) } # will be exported using s3_register() in R/zzz.R -type_sum.rsi <- function(x, ...) { - "rsi" +type_sum.sir <- function(x, ...) { + "sir" } # will be exported using s3_register() in R/zzz.R -freq.rsi <- function(x, ...) { +freq.sir <- function(x, ...) { x_name <- deparse(substitute(x)) x_name <- gsub(".*[$]", "", x_name) if (x_name %in% c("x", ".")) { @@ -1096,7 +1098,7 @@ freq.rsi <- function(x, ...) { # will be exported using s3_register() in R/zzz.R -get_skimmers.rsi <- function(column) { +get_skimmers.sir <- function(column) { # get the variable name 'skim_variable' name_call <- function(.data) { calls <- sys.calls() @@ -1104,7 +1106,7 @@ get_skimmers.rsi <- function(column) { calls_txt <- vapply(calls, function(x) paste(deparse(x), collapse = ""), FUN.VALUE = character(1)) if (any(calls_txt %like% "skim_variable", na.rm = TRUE)) { ind <- which(calls_txt %like% "skim_variable")[1L] - vars <- tryCatch(eval(parse(text = ".data$skim_variable$rsi"), envir = frms[[ind]]), + vars <- tryCatch(eval(parse(text = ".data$skim_variable$sir"), envir = frms[[ind]]), error = function(e) NULL ) tryCatch(ab_name(as.character(calls[[length(calls)]][[2]]), language = NULL), @@ -1116,7 +1118,7 @@ get_skimmers.rsi <- function(column) { } skimr::sfl( - skim_type = "rsi", + skim_type = "sir", ab_name = name_call, count_R = count_R, count_S = count_susceptible, @@ -1127,27 +1129,27 @@ get_skimmers.rsi <- function(column) { ) } -#' @method print rsi +#' @method print sir #' @export #' @noRd -print.rsi <- function(x, ...) { - cat("Class 'rsi'\n") +print.sir <- function(x, ...) { + cat("Class 'sir'\n") print(as.character(x), quote = FALSE) } -#' @method droplevels rsi +#' @method droplevels sir #' @export #' @noRd -droplevels.rsi <- function(x, exclude = if (any(is.na(levels(x)))) NULL else NA, ...) { +droplevels.sir <- function(x, exclude = if (any(is.na(levels(x)))) NULL else NA, ...) { x <- droplevels.factor(x, exclude = exclude, ...) - class(x) <- c("rsi", "ordered", "factor") + class(x) <- c("sir", "ordered", "factor") x } -#' @method summary rsi +#' @method summary sir #' @export #' @noRd -summary.rsi <- function(object, ...) { +summary.sir <- function(object, ...) { x <- object n <- sum(!is.na(x)) S <- sum(x == "S", na.rm = TRUE) @@ -1163,7 +1165,7 @@ summary.rsi <- function(object, ...) { x } value <- c( - "Class" = "rsi", + "Class" = "sir", "%R" = paste0(pad(percentage(R / n, digits = 1)), " (n=", R, ")"), "%SI" = paste0(pad(percentage((S + I) / n, digits = 1)), " (n=", S + I, ")"), "- %S" = paste0(pad(percentage(S / n, digits = 1)), " (n=", S, ")"), @@ -1173,59 +1175,59 @@ summary.rsi <- function(object, ...) { value } -#' @method [<- rsi +#' @method [<- sir #' @export #' @noRd -"[<-.rsi" <- function(i, j, ..., value) { - value <- as.rsi(value) +"[<-.sir" <- function(i, j, ..., value) { + value <- as.sir(value) y <- NextMethod() attributes(y) <- attributes(i) y } -#' @method [[<- rsi +#' @method [[<- sir #' @export #' @noRd -"[[<-.rsi" <- function(i, j, ..., value) { - value <- as.rsi(value) +"[[<-.sir" <- function(i, j, ..., value) { + value <- as.sir(value) y <- NextMethod() attributes(y) <- attributes(i) y } -#' @method c rsi +#' @method c sir #' @export #' @noRd -c.rsi <- function(...) { - as.rsi(unlist(lapply(list(...), as.character))) +c.sir <- function(...) { + as.sir(unlist(lapply(list(...), as.character))) } -#' @method unique rsi +#' @method unique sir #' @export #' @noRd -unique.rsi <- function(x, incomparables = FALSE, ...) { +unique.sir <- function(x, incomparables = FALSE, ...) { y <- NextMethod() attributes(y) <- attributes(x) y } -#' @method rep rsi +#' @method rep sir #' @export #' @noRd -rep.rsi <- function(x, ...) { +rep.sir <- function(x, ...) { y <- NextMethod() attributes(y) <- attributes(x) y } check_reference_data <- function(reference_data) { - if (!identical(reference_data, AMR::rsi_translation)) { - class_rsi <- vapply(FUN.VALUE = character(1), rsi_translation, function(x) paste0("<", class(x), ">", collapse = " and ")) + if (!identical(reference_data, AMR::clinical_breakpoints)) { + class_sir <- vapply(FUN.VALUE = character(1), clinical_breakpoints, function(x) paste0("<", class(x), ">", collapse = " and ")) class_ref <- vapply(FUN.VALUE = character(1), reference_data, function(x) paste0("<", class(x), ">", collapse = " and ")) - if (!all(names(class_rsi) == names(class_ref))) { - stop_("`reference_data` must have the same column names as the 'rsi_translation' data set.", call = -2) + if (!all(names(class_sir) == names(class_ref))) { + stop_("`reference_data` must have the same column names as the 'clinical_breakpoints' data set.", call = -2) } - if (!all(class_rsi == class_ref)) { - class_rsi[class_rsi != class_ref][1] - stop_("`reference_data` must be the same structure as the 'rsi_translation' data set. Column '", names(class_ref[class_rsi != class_ref][1]), "' is of class ", class_ref[class_rsi != class_ref][1], ", but should be of class ", class_rsi[class_rsi != class_ref][1], ".", call = -2) + if (!all(class_sir == class_ref)) { + class_sir[class_sir != class_ref][1] + stop_("`reference_data` must be the same structure as the 'clinical_breakpoints' data set. Column '", names(class_ref[class_sir != class_ref][1]), "' is of class ", class_ref[class_sir != class_ref][1], ", but should be of class ", class_sir[class_sir != class_ref][1], ".", call = -2) } } } diff --git a/R/rsi_calc.R b/R/sir_calc.R similarity index 93% rename from R/rsi_calc.R rename to R/sir_calc.R index cc8a6510c..5b2d9713c 100755 --- a/R/rsi_calc.R +++ b/R/sir_calc.R @@ -34,7 +34,7 @@ dots2vars <- function(...) { as.character(dots)[2:length(dots)] } -rsi_calc <- function(..., +sir_calc <- function(..., ab_result, minimum = 0, as_percent = FALSE, @@ -78,7 +78,7 @@ rsi_calc <- function(..., } if (length(dots) == 0 || all(dots == "df")) { # for complete data.frames, like example_isolates %pm>% select(AMC, GEN) %pm>% proportion_S() - # and the old rsi function, which has "df" as name of the first argument + # and the old sir function, which has "df" as name of the first argument x <- dots_df } else { # get dots that are in column names already, and the ones that will be once evaluated using dots_df or global env @@ -115,21 +115,21 @@ rsi_calc <- function(..., print_warning <- FALSE - ab_result <- as.rsi(ab_result) + ab_result <- as.sir(ab_result) if (is.data.frame(x)) { - rsi_integrity_check <- character(0) + sir_integrity_check <- character(0) for (i in seq_len(ncol(x))) { - # check integrity of columns: force 'rsi' class - if (!is.rsi(x[, i, drop = TRUE])) { - rsi_integrity_check <- c(rsi_integrity_check, as.character(x[, i, drop = TRUE])) - x[, i] <- suppressWarnings(as.rsi(x[, i, drop = TRUE])) # warning will be given later + # check integrity of columns: force 'sir' class + if (!is.sir(x[, i, drop = TRUE])) { + sir_integrity_check <- c(sir_integrity_check, as.character(x[, i, drop = TRUE])) + x[, i] <- suppressWarnings(as.sir(x[, i, drop = TRUE])) # warning will be given later print_warning <- TRUE } } - if (length(rsi_integrity_check) > 0) { + if (length(sir_integrity_check) > 0) { # this will give a warning for invalid results, of all input columns (so only 1 warning) - rsi_integrity_check <- as.rsi(rsi_integrity_check) + sir_integrity_check <- as.sir(sir_integrity_check) } x_transposed <- as.list(as.data.frame(t(x), stringsAsFactors = FALSE)) @@ -150,8 +150,8 @@ rsi_calc <- function(..., } } else { # x is not a data.frame - if (!is.rsi(x)) { - x <- as.rsi(x) + if (!is.sir(x)) { + x <- as.sir(x) print_warning <- TRUE } numerator <- sum(x %in% ab_result, na.rm = TRUE) @@ -159,9 +159,9 @@ rsi_calc <- function(..., } if (print_warning == TRUE) { - if (message_not_thrown_before("rsi_calc")) { - warning_("Increase speed by transforming to class 'rsi' on beforehand:\n", - " your_data %>% mutate_if(is.rsi.eligible, as.rsi)", + if (message_not_thrown_before("sir_calc")) { + warning_("Increase speed by transforming to class 'sir' on beforehand:\n", + " your_data %>% mutate_if(is_sir_eligible, as.sir)", call = FALSE ) } @@ -213,7 +213,7 @@ rsi_calc <- function(..., } } -rsi_calc_df <- function(type, # "proportion", "count" or "both" +sir_calc_df <- function(type, # "proportion", "count" or "both" data, translate_ab = "name", language = get_AMR_locale(), @@ -222,7 +222,7 @@ rsi_calc_df <- function(type, # "proportion", "count" or "both" combine_SI = TRUE, confidence_level = 0.95) { meet_criteria(type, is_in = c("proportion", "count", "both"), has_length = 1) - meet_criteria(data, allow_class = "data.frame", contains_column_class = "rsi") + meet_criteria(data, allow_class = "data.frame", contains_column_class = "sir") meet_criteria(translate_ab, allow_class = c("character", "logical"), has_length = 1, allow_NA = TRUE) meet_criteria(language, has_length = 1, is_in = c(LANGUAGES_SUPPORTED, ""), allow_NULL = TRUE, allow_NA = TRUE) meet_criteria(minimum, allow_class = c("numeric", "integer"), has_length = 1, is_finite = TRUE) @@ -237,16 +237,16 @@ rsi_calc_df <- function(type, # "proportion", "count" or "both" if (is_null_or_grouped_tbl(data)) { data_has_groups <- TRUE groups <- setdiff(names(attributes(data)$groups), ".rows") - data <- data[, c(groups, colnames(data)[vapply(FUN.VALUE = logical(1), data, is.rsi)]), drop = FALSE] + data <- data[, c(groups, colnames(data)[vapply(FUN.VALUE = logical(1), data, is.sir)]), drop = FALSE] } else { data_has_groups <- FALSE - data <- data[, colnames(data)[vapply(FUN.VALUE = logical(1), data, is.rsi)], drop = FALSE] + data <- data[, colnames(data)[vapply(FUN.VALUE = logical(1), data, is.sir)], drop = FALSE] } data <- as.data.frame(data, stringsAsFactors = FALSE) if (isTRUE(combine_SI)) { for (i in seq_len(ncol(data))) { - if (is.rsi(data[, i, drop = TRUE])) { + if (is.sir(data[, i, drop = TRUE])) { data[, i] <- as.character(data[, i, drop = TRUE]) data[, i] <- gsub("(I|S)", "SI", data[, i, drop = TRUE]) } @@ -348,7 +348,7 @@ rsi_calc_df <- function(type, # "proportion", "count" or "both" if (isTRUE(combine_SI)) { out$interpretation <- factor(out$interpretation, levels = c("SI", "R"), ordered = TRUE) } else { - # don't use as.rsi() here, as it would add the class 'rsi' and we would like + # don't use as.sir() here, as it would add the class 'sir' and we would like # the same data structure as output, regardless of input out$interpretation <- factor(out$interpretation, levels = c("S", "I", "R"), ordered = TRUE) } @@ -372,5 +372,5 @@ rsi_calc_df <- function(type, # "proportion", "count" or "both" rownames(out) <- NULL out <- as_original_data_class(out, class(data.bak)) # will remove tibble groups - structure(out, class = c("rsi_df", class(out))) + structure(out, class = c("sir_df", "rsi_df", class(out))) } diff --git a/R/rsi_df.R b/R/sir_df.R similarity index 96% rename from R/rsi_df.R rename to R/sir_df.R index 1ea0b6082..4dca351a1 100755 --- a/R/rsi_df.R +++ b/R/sir_df.R @@ -29,7 +29,7 @@ #' @rdname proportion #' @export -rsi_df <- function(data, +sir_df <- function(data, translate_ab = "name", language = get_AMR_locale(), minimum = 30, @@ -37,7 +37,7 @@ rsi_df <- function(data, combine_SI = TRUE, confidence_level = 0.95) { tryCatch( - rsi_calc_df( + sir_calc_df( type = "both", data = data, translate_ab = translate_ab, @@ -47,6 +47,6 @@ rsi_df <- function(data, combine_SI = combine_SI, confidence_level = confidence_level ), - error = function(e) stop_(gsub("in rsi_calc_df(): ", "", e$message, fixed = TRUE), call = -5) + error = function(e) stop_(gsub("in sir_calc_df(): ", "", e$message, fixed = TRUE), call = -5) ) } diff --git a/R/sysdata.rda b/R/sysdata.rda index ef3829f7b8e2ec7159beb1993c47ee4db82b058f..ddff74bd6bfd34fe163abbcb393bc4f581f74f3c 100755 GIT binary patch literal 76776 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

WJf>frZE*9bffm1iar1xCQaPZVr z<%!;Uv~7g71WBEIR?=sloyq(r_#R*I6a*nhHRZabHArP#kd7aUb78rvW3L<*E9#86 zI@kI0A#O&ewt*L{y{-V-$PhVBS5h#%r%HqkShy^3Zb&-pEn(7SAz~nmk#VRPU91e2ba9i~*8t8xt9v%#gMl)4hH|SnaS;l%VZ?K8my)}Q6u1XO@Q-D0 zm&(+qkTakjR4{Z2ceC_3>=gebuNxr$3?f=TLO?F%Lffbp4H2tv=;1dRXi8^oHBu(T zr6?-wz}icZ4EW%lPm*AP>)2e7cSEm=XApILGxp<@Xc0>ddA(6liKPy!oT+rTwKVg) z{Wva#7tYcZH`Mi>;#&ljK4I-x^*P(_0n)^a7-+-pkMJE%GlODb2X8LemA<(?g7h)K z$|}V9Fm2%+hq6%Wp73+Uu(ICZ{J;GN8jnOWbbSxDPh}KkMHZ9+vYbg3(&2W)APC0) z?5D$=0CLi0#VaG5SybEwD^t;-n6meJ%i6=lEvG+;turwWu0FL>()g^Hy&e{Hx z<5?zsumQsEsCqIyi3$jul#FF)!p-p7Ah|Rk9v9-@_NosG@3iO`?ncAxx<{joV{CNH z;cxs-tq~SNpgm{GFZ@hr3f|lV%AYaQ-ZGRy@5$Fr6(SQpM5DaBn0R<6^x>-7MYZO~ zEGj{Im4onDOQwzx+d&OoOvAfyuH}s9g1qI_guJJBmqX*Ae%Y15cDF>*l2CF7cdg2T zj9dI!j6=paVr2+Ff-KI?&V6;ul7~U*+rC2*4QQ;s@6M|Umi>v?R`OFXkm9y0JPQP6 z{2_knpADw*%nOk71OaJ1o1D{(;4(q3AFGiCF8?wO=I@{&{_(6JVbdi;DA#HYyarhw7&V5Y#R4%s`d-FjZ0g%(w*h>d@Z6b zFe2x4WNhP!lW&1yrl7Xszv#pdM!?}f1Ecif5Sd{|63B}qJ2qsp{aRoeU#*t)1COa; z*atQEI_faYK=lB|CJ73`Io?!-;fTg^9(8d=t$MG2U{HYbHEh)1i8FuCbN9R?EF_s? zI*f7XIh1`bPMxHFkV|pR3~Fo-W!}6+Fez+HyLS9{IXVUUPA=+nq6p-2 z|H!2r?~J|RNefU`JV!vo)ney51R|rXp(a+k9pv;$?K@EGRn&>p7Z)`r1(xCT4#Qv8 zRdhE)wW1&`kO6Su;!ECKxb*sg#Lr)(+DcF85<)^?mx{||J;h>OLhWR)_G5;c!@fC- zh1>hi@8JByZu=#lEnZm!1^3QVtH(Y}+toZ@FQ|eE&U)0UlM4`1(@42zc4r}*Hc~RF zkS-6P>;UEps$&)=;F6SJoz8mYv?qjnDEmPUIw4xy34hU0QCl|>%IqW8LO{@Lz>>qR zdK|~f)ALPQZ}=I%`WUv|2$MNkkvE>~$3E}>nKBPJ%+DkT3T^z#pr$h?pB z@7t=M^S8u0rZ>y|BXsjhg!0#Ptc04~eA+8g3iNHeMnTr0=760Fs1Q3qXOOevW%)(F z#y7yzP!>FAFc}&o{J2>xeE&=+ZRDfSO!zcrRnFb8EiXtn^sp-%O)4cPSHnNiTwrl$ zOMO-|KQ!7MZvV>^}PT90002T)=g9Z0m0V<`>rN=rB3!fFb#_W000000a;oV CD58M? literal 354136 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

0e`a+hCw|yu4-AY~-f# zwG=-Q!B9$xO?Jhzwn7iOy2lD|Ot~>`Es9ynuLBA4L+X6W)!r zjg$`ZVl^7as1;{TTJtL_>FIT*O;W7hdtCs2UGH1xEliF|_V;k}kzUo5>saUBYRK(K z5n4NBke@`}ou_&6toP#r=8!amiNERqb_IdRuwMow#h&Zeggt`UND z=z&00m2%!P%rGA6K#&WM+x&@`wyO|978aU68S&8Y!Oag%lbrIjsmM;%nQX0FoK~G! zH&J0dHPON&UuB-%e?P8*3<-Qh5EuQ}X zR&bS&dSJvPkc7v$&ezwD5ZEV%U_-rUV$8(b^g3@d;a)dsVqC~^oJpr@FD)^HpnAmM zo!0j4A$=sI+*LWZaw$E333M^NDwf+LsQ`>g>S;)+Q`O0tojTuzyOvy4I!x+Ggw4gSJ2^;L+%u~ z<8u{-Zb-#n!`>b^ovK7B{fScACpr;4_W;8A>o6X@N;bZ&`bPgSsZ&XZ+P7PmlvL> z7oup^%bD7?sp1;p=g=SzJff%Dbhll?ufBo95g<#SAtp&m-$QM)v}Dl8vYQ`reDzPRciw%8<`8foUvnk^PrUa{XO?L5T?J30n8Zogb=5_?9zf_qiP4IV z=3`Z2XmEHMU@F3zxLH8xr8%ew!=gw`RQUhQPmqlKY@d_%hHOIv+(-S+H7q-+qT$!D zIX>?88BiQSWg_tIEvNowE8Hab=HAhcr{2P5G20K$+b_m%;nzkwtK>Lwd?HB^yv!Z0U})!!WTb5w>r#3V6J>?IMeWIBSdM|LT&zzb*>+i2J(t z{h>CZjj>T6BLKYi5?|T3KFNY4Z;b-CQ})}AQ1`3CBbr5_7G9N>OPx#9eQI}s<=xi4 z?=7Z+17ecjYpd;4)}Q!Tg|BsRU__;@E^;=HCLNB2L@2yyQr9p`tiO4F-uRz}%0G`} zBJ28OFM&s@wt+k>=6_kgCT#5}8Us=Y+)rz7e+Yj+=&m%Vxe^6uBpNUlw)?oEu#C54 z^<}*MsPeBEy#P)%%Zl9du2SI8`XU9TY-5KqPtd5RBfQxjl zGRa430`|3vkTVckbL;%w1z$|upI2!;_of{4mOPaK(r{R0N%aVm6IZmh6AiB<*yK<1 zup?Ilel+!F5ndg}+90{}Wa6fQ!){{R^u9m)u6hlORJ>7m>#R^;{nkV?oByFbW<08Y z>fCPB`nAx1Wy(X#%OUZdPgBZRjrBSjczl??{iWo{^9qUkoc@!_vl6bfNaL(d*+~c^!eAfk=1(B>p zQ0mAa`}gq|SAX1ue(l*NTA-hvF7VpfMfHxkpXKSwP}dZ*9giUW7i7tZ^byP(50x7b0 z+ZN?=2TE@+jY7J!QVwBpGF96WD*Sh|#FrmtRCh7mEfu?AXqfYkaEJHr$52^6=}`VY zsZSGX40|8cG|jTwFSJid7Q;JuF>r}J85ZZM!OTfQ4x4(i_mE0ozLo0uQv0TzZTRNi<+O1kBIJu6qgN#9kc&ECbe zWP`F#C14ahwuPVocAu_sRRagFX7LfEwD_rRO8NaKu-RDAzqWm+ii9=cxo1S?#Ubr( zf}jUm_150FI#CxyxGi6xh_6?d7Q62H_H;*07zw5}#vx8}1psB~+#CJs2&;Fhe)FD% zbaCX>j6&3X;l-ml))gqZgci+?s4F%}56#JaVf?GG{NqM~0Wy?JRM>Xnuh!+GZ6rat zEGUqPSf29SfOh_obR8q)4wxU=_wjCJuVh@M& zTA(B>=4yA~>9^!i$IQNly;?Gusy9~QK`q5)i|OL`Ot9NZ$n_@Sa#obD0`a9g{k5r5 zMxVt?WbRLRCA*y=`5{7!^QWhAQcgZ)Ppl;nW>S?TxUS)lG=Kq0(GF6l{l#$F{UFm?5h|54h|j(_c?aiAX0CSC=D0@;1MT zONtvWV36nJ)TWLEK(gYzZo)j6b%#}gL+snG-G8`jASr;3lall225@mcB9>++{VFAQ zm4JwapNQ({&zc_T*>=;MJW(?PVa*ZA3P0^zT8-yT1-AZ;A^L{-FFv=p(3rz>)BYbuBJxg7u z54h-5!>=L6C|7Mlbw60ol?raZ<|XZ}jK{&0-t&qEl23{d+w%w0G-wu4pZf;;p#x^y z_m$~5LH2xFb3bFHaU{;v6ZA=FYYk16Kn{e~{YwwedfxXbOE5`#D07BH7Y8g9GC2>D zQ^{GRMJ!y>a5_)av)Vn=OpCumDm_W(Qtp4=`ZvODI8N>G>(3iW-t9J&eftyra-YU* z>&&WTM5I8#d|tzYeveHVBhvuUSa|OYBywoj0=i-cSw%IzUPqmHx^1!TPEaLJH$L;` z=$sRm>G4x2<}XJl3NOu67b^Qlm{cdeqDe^ix1NqdVb|=G&rHc$Us_VIf#t^yW4HhB znFa2^uBL`D?=M>v?aUAkz`6vv(m#?{E5wV>FSJ+mBtl3E1dZDmY7 zRclzcmz(;;A!`uLa`uz4sJa9wO?w~<_5*4o5rZ4gYiGum*pqr>ZoLNMbrL^T++7n5 z<*NUBYbncFj`kq@YfA}UaGP%LN~5@L)MvtAu(% zR#rx)Via`x1dfnA)3cDW@}Y|BtTkFqlHY0GbgxuV{GfTs}0w-oxv%Z z+$L3a_xTz}u&Z;4lxZ@%-X6&llKVttU7+WZ1G8fe77_Wr_59FTQ@})jeENQjfGyJG zRVZEGgM)i}T*giglS+GChA8EPc(e&hxk@i(+kP)lx3C2GN9>VP7{8hWZph>a$Tv?d z1fKxm6X_Ncb(L< z3(qvGK1Rq^xQ3%9f#5ouv>;Ls=xtv>PEdh^i_yzLSMwKSlpbQ}6ky|Ta#UWKx7uTP zA@@%A1HPK`gvcWn7yDUcmTW{awbw_7tHViyihem~n57HO83O3K51pgC+!yzk4m;Oi9t z!vLk9Y=o=g0wiDE70YhaqF|N1@?7mGslIfIZ@R(q2T1*cCmOEA=wvZcd*RuT7hnIb zXvVZ*t!pHhM{&V#WUMXFW#(M;mnq%d^-nUK90GY^^UuKj$aEqhLnK|1BB5EgF)myV ztVzY0ulb?`RaLRZ1H�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 z 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 b73!pe0RR91-orB@o8wVH0{{R300CKAZ5LOO diff --git a/R/translate.R b/R/translate.R index d88349c03..fb076cc83 100755 --- a/R/translate.R +++ b/R/translate.R @@ -140,7 +140,11 @@ reset_AMR_locale <- function() { #' @rdname translate #' @export translate_AMR <- function(x, language = get_AMR_locale()) { - translate_into_language(x, language = language) + translate_into_language(x, + language = language, + only_unknown = FALSE, + only_affect_ab_names = FALSE, + only_affect_mo_names = FALSE) } @@ -192,6 +196,7 @@ translate_into_language <- function(from, only_unknown = FALSE, only_affect_ab_names = FALSE, only_affect_mo_names = FALSE) { + # get ISO-639-1 of language lang <- validate_language(language) if (lang == "en") { @@ -259,7 +264,7 @@ translate_into_language <- function(from, # a kind of left join to get all results back out <- from_unique_translated[match(from.bak, from_unique)] - if (!identical(from.bak, out) && message_not_thrown_before("translation", entire_session = TRUE) && interactive()) { + if (!identical(from.bak, out) && get_AMR_locale() == lang && message_not_thrown_before("translation", entire_session = TRUE) && interactive()) { message(word_wrap( "Assuming the ", LANGUAGES_SUPPORTED_NAMES[[lang]]$exonym, " language (", LANGUAGES_SUPPORTED_NAMES[[lang]]$endonym, ") for the AMR package. See `set_AMR_locale()` to change this or to silence this once-per-session note.", diff --git a/R/vctrs.R b/R/vctrs.R index eba037fef..105783793 100755 --- a/R/vctrs.R +++ b/R/vctrs.R @@ -95,6 +95,7 @@ vec_cast.character.mo <- function(x, to, ...) { as.character(x) } vec_cast.mo.character <- function(x, to, ...) { + add_MO_lookup_to_AMR_env() return_after_integrity_check(x, "microorganism code", as.character(AMR_env$MO_lookup$mo)) } @@ -141,16 +142,16 @@ vec_math.mic <- function(.fn, x, ...) { .fn(as.double(x), ...) } -# S3: rsi -vec_ptype2.character.rsi <- function(x, y, ...) { +# S3: sir +vec_ptype2.character.sir <- function(x, y, ...) { x } -vec_ptype2.rsi.character <- function(x, y, ...) { +vec_ptype2.sir.character <- function(x, y, ...) { y } -vec_cast.character.rsi <- function(x, to, ...) { +vec_cast.character.sir <- function(x, to, ...) { as.character(x) } -vec_cast.rsi.character <- function(x, to, ...) { - as.rsi(x) +vec_cast.sir.character <- function(x, to, ...) { + as.sir(x) } diff --git a/R/zz_deprecated.R b/R/zz_deprecated.R new file mode 100755 index 000000000..81325f089 --- /dev/null +++ b/R/zz_deprecated.R @@ -0,0 +1,210 @@ +# ==================================================================== # +# TITLE # +# AMR: An R Package for Working with Antimicrobial Resistance Data # +# # +# SOURCE # +# https://github.com/msberends/AMR # +# # +# CITE AS # +# Berends MS, Luz CF, Friedrich AW, Sinha BNM, Albers CJ, Glasner C # +# (2022). AMR: An R Package for Working with Antimicrobial Resistance # +# Data. Journal of Statistical Software, 104(3), 1-31. # +# doi:10.18637/jss.v104.i03 # +# # +# Developed at the University of Groningen and the University Medical # +# Center Groningen in The Netherlands, in collaboration with many # +# colleagues from around the world, see our website. # +# # +# This R package is free software; you can freely use and distribute # +# it for both personal and commercial purposes under the terms of the # +# GNU General Public License version 2.0 (GNU GPL-2), as published by # +# the Free Software Foundation. # +# We created this package for both routine data analysis and academic # +# research and it was publicly released in the hope that it will be # +# useful, but it comes WITHOUT ANY WARRANTY OR LIABILITY. # +# # +# Visit our website for the full manual and a complete tutorial about # +# how to conduct AMR data analysis: https://msberends.github.io/AMR/ # +# ==================================================================== # + +#' Deprecated Functions +#' +#' These functions are so-called '[Deprecated]'. **They will be removed in a future release.** Using the functions will give a warning with the name of the function it has been replaced by (if there is one). +#' @keywords internal +#' @name AMR-deprecated +#' @rdname AMR-deprecated +#' @export +NA_rsi_ <- set_clean_class(factor(NA_character_, levels = c("S", "I", "R"), ordered = TRUE), + new_class = c("rsi", "ordered", "factor")) +#' @rdname AMR-deprecated +#' @export +as.rsi <- function(x, ...) { + deprecation_warning("as.rsi", "as.sir") + UseMethod("as.rsi") +} +#' @noRd +#' @export +as.rsi.default <- function(...) { + as.sir.default(...) +} +#' @noRd +#' @export +as.rsi.mic <- function(...) { + as.sir.mic(...) +} +#' @noRd +#' @export +as.rsi.disk <- function(...) { + as.sir.disk(...) +} +#' @noRd +#' @export +as.rsi.data.frame <- function(...) { + as.sir.data.frame(...) +} + +#' @rdname AMR-deprecated +#' @export +facet_rsi <- function(...) { + deprecation_warning("facet_rsi", "facet_sir") + facet_sir(...) +} +#' @rdname AMR-deprecated +#' @export +geom_rsi <- function(...) { + deprecation_warning("geom_rsi", "geom_sir") + geom_sir(...) +} +#' @rdname AMR-deprecated +#' @export +ggplot_rsi <- function(...) { + deprecation_warning("ggplot_rsi", "ggplot_sir") + ggplot_sir(...) +} +#' @rdname AMR-deprecated +#' @export +ggplot_rsi_predict <- function(...) { + deprecation_warning("ggplot_rsi_predict", "ggplot_sir_predict") + ggplot_sir_predict(...) +} +#' @rdname AMR-deprecated +#' @export +is.rsi <- function(x, ...) { + # this is an exception, so mutate_if(is.rsi, as.sir) can be used + if (inherits(x, "data.frame")) { + unname(vapply(FUN.VALUE = logical(1), x, is.rsi)) + } else { + inherits(x, "rsi") + } +} +#' @rdname AMR-deprecated +#' @export +is.rsi.eligible <- function(...) { + deprecation_warning("is.rsi.eligible", "is_sir_eligible") + is_sir_eligible(...) +} +#' @rdname AMR-deprecated +#' @export +labels_rsi_count <- function(...) { + deprecation_warning("labels_rsi_count", "labels_sir_count") + labels_sir_count(...) +} +#' @rdname AMR-deprecated +#' @export +n_rsi <- function(...) { + deprecation_warning("n_rsi", "n_sir") + n_sir(...) +} +#' @rdname AMR-deprecated +#' @export +random_rsi <- function(...) { + deprecation_warning("random_rsi", "random_sir") + random_sir(...) +} +#' @rdname AMR-deprecated +#' @export +rsi_df <- function(...) { + deprecation_warning("rsi_df", "sir_df") + sir_df(...) +} +#' @rdname AMR-deprecated +#' @export +rsi_predict <- function(...) { + deprecation_warning("rsi_predict", "sir_predict") + sir_predict(...) +} +#' @rdname AMR-deprecated +#' @export +scale_rsi_colours <- function(...) { + deprecation_warning("scale_rsi_colours", "scale_sir_colours") + scale_sir_colours(...) +} +#' @rdname AMR-deprecated +#' @export +theme_rsi <- function(...) { + deprecation_warning("theme_rsi", "theme_sir") + theme_sir(...) +} + +# will be exported using s3_register() in R/zzz.R +pillar_shaft.rsi <- pillar_shaft.sir +type_sum.rsi <- function(x, ...) { + deprecation_warning(extra_msg = "* Transform your old 'rsi' class to the new 'sir' class with `as.sir()` using e.g.:\n your_data %>% mutate_if(is.rsi, as.sir)") + paste0("rsi", font_bold(font_red("[!]"))) +} + +#' @method print rsi +#' @export +#' @noRd +print.rsi <- function(x, ...) { + deprecation_warning(extra_msg = "Transform your old 'rsi' class to the new 'sir' class with `as.sir()`") + cat("Class 'rsi'", font_bold(font_red("[!]\n"))) + print(as.character(x), quote = FALSE) +} + +#' @noRd +#' @export +`[<-.rsi` <- `[<-.sir` +#' @noRd +#' @export +`[[<-.rsi` <- `[[<-.sir` +#' @noRd +#' @export +barplot.rsi <- barplot.sir +#' @noRd +#' @export +c.rsi <- c.sir +#' @noRd +#' @export +droplevels.rsi <- droplevels.sir +#' @noRd +#' @export +plot.rsi <- plot.sir +#' @noRd +#' @export +rep.rsi <- rep.sir +#' @noRd +#' @export +summary.rsi <- summary.sir +#' @noRd +#' @export +unique.rsi <- unique.sir + +deprecation_warning <- function(old = NULL, new = NULL, extra_msg = NULL) { + if (is.null(old)) { + warning_(extra_msg) + } else { + env <- paste0("deprecated_", old) + if (!env %in% names(AMR_env)) { + AMR_env[[paste0("deprecated_", old)]] <- 1 + warning_(ifelse(is.null(new), + paste0("The `", old, "()` function is no longer in use"), + paste0("The `", old, "()` function has been replaced with `", new, "()`")), + ", see `?AMR-deprecated`.", + ifelse(!is.null(extra_msg), + paste0(" ", extra_msg), + ""), + "\nThis warning will be shown once per session.") + } + } +} diff --git a/R/zzz.R b/R/zzz.R index 7dd478f75..77aaa2edf 100755 --- a/R/zzz.R +++ b/R/zzz.R @@ -55,7 +55,7 @@ AMR_env$av_previously_coerced <- data.frame( av = character(0), stringsAsFactors = FALSE ) -AMR_env$rsi_interpretation_history <- data.frame( +AMR_env$sir_interpretation_history <- data.frame( datetime = Sys.time()[0], index = integer(0), ab_input = character(0), @@ -97,32 +97,34 @@ if (utf8_supported && !is_latex) { s3_register("pillar::pillar_shaft", "ab") s3_register("pillar::pillar_shaft", "av") s3_register("pillar::pillar_shaft", "mo") - s3_register("pillar::pillar_shaft", "rsi") + s3_register("pillar::pillar_shaft", "sir") + s3_register("pillar::pillar_shaft", "rsi") # remove in a later version s3_register("pillar::pillar_shaft", "mic") s3_register("pillar::pillar_shaft", "disk") s3_register("pillar::type_sum", "ab") s3_register("pillar::type_sum", "av") s3_register("pillar::type_sum", "mo") - s3_register("pillar::type_sum", "rsi") + s3_register("pillar::type_sum", "sir") + s3_register("pillar::type_sum", "rsi") # remove in a later version s3_register("pillar::type_sum", "mic") s3_register("pillar::type_sum", "disk") # Support for frequency tables from the cleaner package s3_register("cleaner::freq", "mo") - s3_register("cleaner::freq", "rsi") + s3_register("cleaner::freq", "sir") # Support for skim() from the skimr package if (pkg_is_available("skimr", also_load = FALSE, min_version = "2.0.0")) { s3_register("skimr::get_skimmers", "mo") - s3_register("skimr::get_skimmers", "rsi") + s3_register("skimr::get_skimmers", "sir") s3_register("skimr::get_skimmers", "mic") s3_register("skimr::get_skimmers", "disk") } # Support for autoplot() from the ggplot2 package - s3_register("ggplot2::autoplot", "rsi") + s3_register("ggplot2::autoplot", "sir") s3_register("ggplot2::autoplot", "mic") s3_register("ggplot2::autoplot", "disk") s3_register("ggplot2::autoplot", "resistance_predict") # Support for fortify from the ggplot2 package - s3_register("ggplot2::fortify", "rsi") + s3_register("ggplot2::fortify", "sir") s3_register("ggplot2::fortify", "mic") s3_register("ggplot2::fortify", "disk") # Support vctrs package for use in e.g. dplyr verbs @@ -164,11 +166,11 @@ if (utf8_supported && !is_latex) { s3_register("vctrs::vec_cast", "mic.character") s3_register("vctrs::vec_cast", "mic.double") s3_register("vctrs::vec_math", "mic") - # S3: rsi - s3_register("vctrs::vec_ptype2", "character.rsi") - s3_register("vctrs::vec_ptype2", "rsi.character") - s3_register("vctrs::vec_cast", "character.rsi") - s3_register("vctrs::vec_cast", "rsi.character") + # S3: sir + s3_register("vctrs::vec_ptype2", "character.sir") + s3_register("vctrs::vec_ptype2", "sir.character") + s3_register("vctrs::vec_cast", "character.sir") + s3_register("vctrs::vec_cast", "sir.character") # if mo source exists, fire it up (see mo_source()) if (tryCatch(file.exists(getOption("AMR_mo_source", "~/mo_source.rds")), error = function(e) FALSE)) { @@ -179,11 +181,10 @@ if (utf8_supported && !is_latex) { try(loadNamespace("tibble"), silent = TRUE) } - # reference data - they have additional columns compared to `antibiotics` and `microorganisms` to improve speed + # reference data - they have additional to improve algorithm speed # they cannot be part of R/sysdata.rda since CRAN thinks it would make the package too large (+3 MB) - AMR_env$AB_lookup <- create_AB_lookup() - AMR_env$AV_lookup <- create_AV_lookup() - AMR_env$MO_lookup <- create_MO_lookup() + AMR_env$AB_lookup <- cbind(AMR::antibiotics, AB_LOOKUP) + AMR_env$AV_lookup <- cbind(AMR::antivirals, AV_LOOKUP) } .onAttach <- function(lib, pkg) { @@ -206,36 +207,3 @@ if (utf8_supported && !is_latex) { }, error = function(e) packageStartupMessage("Failed: ", e$message)) } } - -# Helper functions -------------------------------------------------------- - -create_AB_lookup <- function() { - cbind(AMR::antibiotics, AB_LOOKUP) -} - -create_AV_lookup <- function() { - cbind(AMR::antivirals, AV_LOOKUP) -} - -create_MO_lookup <- function() { - MO_lookup <- AMR::microorganisms - - MO_lookup$kingdom_index <- NA_real_ - MO_lookup[which(MO_lookup$kingdom == "Bacteria" | MO_lookup$mo == "UNKNOWN"), "kingdom_index"] <- 1 - MO_lookup[which(MO_lookup$kingdom == "Fungi"), "kingdom_index"] <- 2 - MO_lookup[which(MO_lookup$kingdom == "Protozoa"), "kingdom_index"] <- 3 - MO_lookup[which(MO_lookup$kingdom == "Archaea"), "kingdom_index"] <- 4 - # all the rest - MO_lookup[which(is.na(MO_lookup$kingdom_index)), "kingdom_index"] <- 5 - - if (length(MO_FULLNAME_LOWER) != nrow(MO_lookup)) { - packageStartupMessage("fullname_lower not same size - applied tolower(), update sysdata.rda!") - MO_lookup$fullname_lower <- tolower(MO_lookup$fullname) - } else { - MO_lookup$fullname_lower <- MO_FULLNAME_LOWER - } - MO_lookup$full_first <- substr(MO_lookup$fullname_lower, 1, 1) - MO_lookup$species_first <- tolower(substr(MO_lookup$species, 1, 1)) # tolower for groups (Streptococcus, Salmonella) - MO_lookup$subspecies_first <- tolower(substr(MO_lookup$subspecies, 1, 1)) # tolower for Salmonella serovars - MO_lookup -} diff --git a/README.md b/README.md index e1409b00e..88c9f3ce2 100755 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ This work was published in the Journal of Statistical Software (Volume 104(3); [ `AMR` is a free, open-source and independent R package to simplify the analysis and prediction of Antimicrobial Resistance (AMR) and to work with microbial and antimicrobial data and properties, by using evidence-based methods. Our aim is to provide a standard for clean and reproducible antimicrobial resistance data analysis, that can therefore empower epidemiological analyses to continuously enable surveillance and treatment evaluation in any setting. It is currently being used in over 175 countries. -After installing this package, R knows ~52,000 distinct microbial species and all ~600 antibiotic, antimycotic, and antiviral drugs by name and code (including ATC, WHONET/EARS-Net, PubChem, LOINC and SNOMED CT), and knows all about valid R/SI and MIC values. It supports any data format, including WHONET/EARS-Net data. Antimicrobial names and group names are available in English, Chinese, Danish, Dutch, French, German, Greek, Italian, Japanese, Polish, Portuguese, Russian, Spanish, Swedish, Turkish, and Ukrainian. +After installing this package, R knows ~52,000 distinct microbial species and all ~600 antibiotic, antimycotic, and antiviral drugs by name and code (including ATC, WHONET/EARS-Net, PubChem, LOINC and SNOMED CT), and knows all about valid SIR and MIC values. It supports any data format, including WHONET/EARS-Net data. Antimicrobial names and group names are available in English, Chinese, Danish, Dutch, French, German, Greek, Italian, Japanese, Polish, Portuguese, Russian, Spanish, Swedish, Turkish, and Ukrainian. This package is fully independent of any other R package and works on Windows, macOS and Linux with all versions of R since R-3.0.0 (April 2013). It was designed to work in any setting, including those with very limited resources. It was created for both routine data analysis and academic research at the Faculty of Medical Sciences of the University of Groningen, in collaboration with non-profit organisations Certe Medical Diagnostics and Advice Foundation and University Medical Center Groningen. This R package is actively maintained and free software; you can freely use and distribute it for both personal and commercial (but not patent) purposes under the terms of the GNU General Public License version 2.0 (GPL-2), as published by the Free Software Foundation. diff --git a/_pkgdown.yml b/_pkgdown.yml index 18107f43b..edda6e6b5 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -146,10 +146,10 @@ reference: - title: "Preparing data: antimicrobial resistance" desc: > With `as.mic()` and `as.disk()` you can transform your raw input to valid MIC or disk diffusion values. - Use `as.rsi()` for cleaning raw data to let it only contain "R", "I" and "S", or to interpret MIC or disk diffusion values as R/SI based on the lastest EUCAST and CLSI guidelines. + Use `as.sir()` for cleaning raw data to let it only contain "R", "I" and "S", or to interpret MIC or disk diffusion values as SIR based on the lastest EUCAST and CLSI guidelines. Afterwards, you can extend antibiotic interpretations by applying [EUCAST rules](https://www.eucast.org/expert_rules_and_intrinsic_resistance/) with `eucast_rules()`. contents: - - "`as.rsi`" + - "`as.sir`" - "`as.mic`" - "`as.disk`" - "`eucast_rules`" @@ -169,7 +169,7 @@ reference: - "`mdro`" - "`count`" - "`plot`" - - "`ggplot_rsi`" + - "`ggplot_sir`" - "`bug_drug_combinations`" - "`antibiotic_class_selectors`" - "`mean_amr_distance`" @@ -201,7 +201,7 @@ reference: - "`dosage`" - "`WHOCC`" - "`example_isolates_unclean`" - - "`rsi_translation`" + - "`clinical_breakpoints`" - "`WHONET`" - title: "Other: miscellaneous functions" diff --git a/data-raw/_pre_commit_hook.R b/data-raw/_pre_commit_hook.R index de2e808d5..8925df92d 100644 --- a/data-raw/_pre_commit_hook.R +++ b/data-raw/_pre_commit_hook.R @@ -144,21 +144,6 @@ create_species_cons_cops <- function(type = c("CoNS", "CoPS")) { ] } } -create_MO_fullname_lower <- function() { - AMR_env$MO_lookup <- AMR::microorganisms - # use this paste instead of `fullname` to work with Viridans Group Streptococci, etc. - AMR_env$MO_lookup$fullname_lower <- tolower(trimws(paste( - AMR_env$MO_lookup$genus, - AMR_env$MO_lookup$species, - AMR_env$MO_lookup$subspecies - ))) - ind <- AMR_env$MO_lookup$genus == "" | grepl("^[(]unknown ", AMR_env$MO_lookup$fullname, perl = TRUE) - AMR_env$MO_lookup[ind, "fullname_lower"] <- tolower(AMR_env$MO_lookup[ind, "fullname", drop = TRUE]) - AMR_env$MO_lookup$fullname_lower <- trimws(gsub("[^.a-z0-9/ \\-]+", "", AMR_env$MO_lookup$fullname_lower, perl = TRUE)) - # special for Salmonella - they have cities as subspecies but not the species (enterica) in the fullname: - AMR_env$MO_lookup$fullname_lower[which(AMR_env$MO_lookup$subspecies %like_case% "^[A-Z]")] <- gsub(" enterica ", " ", AMR_env$MO_lookup$fullname_lower[which(AMR_env$MO_lookup$subspecies %like_case% "^[A-Z]")], fixed = TRUE) - AMR_env$MO_lookup$fullname_lower -} MO_CONS <- create_species_cons_cops("CoNS") MO_COPS <- create_species_cons_cops("CoPS") MO_STREP_ABCG <- AMR_env$MO_lookup$mo[which(AMR_env$MO_lookup$genus == "Streptococcus" & @@ -166,7 +151,6 @@ MO_STREP_ABCG <- AMR_env$MO_lookup$mo[which(AMR_env$MO_lookup$genus == "Streptoc "pyogenes", "agalactiae", "dysgalactiae", "equi", "canis", "group A", "group B", "group C", "group G" ))] -MO_FULLNAME_LOWER <- create_MO_fullname_lower() MO_PREVALENT_GENERA <- c( "Absidia", "Acanthamoeba", "Acremonium", "Aedes", "Alternaria", "Amoeba", "Ancylostoma", "Angiostrongylus", "Anisakis", "Anopheles", "Apophysomyces", "Aspergillus", "Aureobasidium", "Basidiobolus", "Beauveria", @@ -298,7 +282,6 @@ suppressMessages(usethis::use_data(EUCAST_RULES_DF, MO_CONS, MO_COPS, MO_STREP_ABCG, - MO_FULLNAME_LOWER, MO_PREVALENT_GENERA, AB_LOOKUP, AV_LOOKUP, @@ -369,20 +352,20 @@ changed_md5 <- function(object) { } # give official names to ABs and MOs -rsi <- rsi_translation %>% +clin_break <- clinical_breakpoints %>% mutate(mo_name = mo_name(mo, language = NULL, keep_synonyms = TRUE, info = FALSE), .after = mo) %>% mutate(ab_name = ab_name(ab, language = NULL), .after = ab) -if (changed_md5(rsi)) { - usethis::ui_info(paste0("Saving {usethis::ui_value('rsi_translation')} to {usethis::ui_value('data-raw/')}")) - write_md5(rsi) - try(saveRDS(rsi, "data-raw/rsi_translation.rds", version = 2, compress = "xz"), silent = TRUE) - try(write.table(rsi, "data-raw/rsi_translation.txt", sep = "\t", na = "", row.names = FALSE), silent = TRUE) - try(haven::write_sas(rsi, "data-raw/rsi_translation.sas"), silent = TRUE) - try(haven::write_sav(rsi, "data-raw/rsi_translation.sav"), silent = TRUE) - try(haven::write_dta(rsi, "data-raw/rsi_translation.dta"), silent = TRUE) - try(openxlsx::write.xlsx(rsi, "data-raw/rsi_translation.xlsx"), silent = TRUE) - try(arrow::write_feather(rsi, "data-raw/rsi_translation.feather"), silent = TRUE) - try(arrow::write_parquet(rsi, "data-raw/rsi_translation.parquet"), silent = TRUE) +if (changed_md5(clin_break)) { + usethis::ui_info(paste0("Saving {usethis::ui_value('clinical_breakpoints')} to {usethis::ui_value('data-raw/')}")) + write_md5(clin_break) + try(saveRDS(clin_break, "data-raw/clinical_breakpoints.rds", version = 2, compress = "xz"), silent = TRUE) + try(write.table(clin_break, "data-raw/clinical_breakpoints.txt", sep = "\t", na = "", row.names = FALSE), silent = TRUE) + try(haven::write_sas(clin_break, "data-raw/clinical_breakpoints.sas"), silent = TRUE) + try(haven::write_sav(clin_break, "data-raw/clinical_breakpoints.sav"), silent = TRUE) + try(haven::write_dta(clin_break, "data-raw/clinical_breakpoints.dta"), silent = TRUE) + try(openxlsx::write.xlsx(clin_break, "data-raw/clinical_breakpoints.xlsx"), silent = TRUE) + try(arrow::write_feather(clin_break, "data-raw/clinical_breakpoints.feather"), silent = TRUE) + try(arrow::write_parquet(clin_break, "data-raw/clinical_breakpoints.parquet"), silent = TRUE) } if (changed_md5(microorganisms)) { diff --git a/data-raw/rsi.md5 b/data-raw/clin_break.md5 similarity index 100% rename from data-raw/rsi.md5 rename to data-raw/clin_break.md5 diff --git a/data-raw/rsi_translation.dta b/data-raw/clinical_breakpoints.dta similarity index 99% rename from data-raw/rsi_translation.dta rename to data-raw/clinical_breakpoints.dta index 1f5240a84382e55ff6793cbcf0d6065645f9b4f4..20cb0a67e94ab20528bc36f1173cac0d5d713a85 100644 GIT binary patch delta 194 zcmWN=J5s_>06@_R3ZeuwihM*d3Vr~EdZ{vR-X-TpG delta 194 zcmWN=J5s_>06@_RA_7J*B7z?<2r7aKdGRwt?M@i>U~6%U+flOs+Enbt<-nOa#pXXM z4%fd)_MQH$mT8!WkY@QJB|O419%BVhu!=RT<0-~?h7D}uIVO04Exg1wUSS8j xc#SuBi+9+=KHg)B1AM?Cj_?tm@EOPWf)kwLE56}7&Tx(y2F&pTKX-m@<2@LdNvHq- diff --git a/data-raw/rsi_translation.feather b/data-raw/clinical_breakpoints.feather similarity index 99% rename from data-raw/rsi_translation.feather rename to data-raw/clinical_breakpoints.feather index c1a18e9b4b323b81a58af0cd84a82b32fdf70dc7..fe182eb45ec16aa41a0cf4e824f1d6e825cda7a9 100644 GIT binary patch delta 88 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 ETEe<5w*UYD literal 0 HcmV?d00001 diff --git a/data-raw/rsi_translation.sas b/data-raw/clinical_breakpoints.sas similarity index 99% rename from data-raw/rsi_translation.sas rename to data-raw/clinical_breakpoints.sas index 15961b5a403679fb27b2c70e5aa8cac046b05e1b..b41c2ab5f6274a463b28630b54f5f6d05976dbe3 100644 GIT binary patch delta 198 zcmWl~$#Fpe0D$555X2ry1hEs@Bb)6;16t979R7Q%P{2Q<95XI%iooHUZ?)TptCRnA zCYT-8+j$V2{}V%uU=(9`fpJV=5-%}@Y0O|2bC|~hUSSch@dj_Pgm+lR3RdwRYgoqy tHnD|m>|hsr_<((U#3y{l7ktGxe8&$Q;3t0JH~!!+4snEIoNSyfmPY`SSY-eJ delta 198 zcmWl~w^4!t0Dw`l{7M!BAW?#fie%|v0T!`v1uVXv-kt%zJI3+OhCP7d-P`;h!kd%r zF0~B4e*adX(D@%Rj1i1t4C9!<3ru2wmw1IKOk)PKn8Q34@EVJFgSU8x_gKO*R`3C< uSi?Ftu!${v#5Q)Yi#>e8XMDjvzTz9c;{ZQ!h$9^11gAK|IezY4tiO*(?pI#` diff --git a/data-raw/rsi_translation.sav b/data-raw/clinical_breakpoints.sav similarity index 99% rename from data-raw/rsi_translation.sav rename to data-raw/clinical_breakpoints.sav index 7a6d8400531f3dcea4b24d6406135a4016956b52..5b96128b7368570eee38508cb8b9922f2e067219 100644 GIT binary patch delta 149 zcmWN=ISv5<06@{$_hsz6vGp@FB2M588W)f_fP~`r6pryr7jP{NFL|HuEAjb%9D{Wn z9!}?Qy@}&pwB1F~^Rj>5(swa|NlalHGnmC3=COc9EMXZdSj8IFF~9~kv4w5yU>AGX X#{mv;gkzlG6hoZh92dBJyJ}y5JQzHm delta 149 zcmWN=ISv5<06@{$_hsz6vGryY5>YyaP8`4iBox1=aExENfNN=Z$@_d?iO>Jz7)0Cf za6W}`9Bp>-X19)>m;LjWzKaP=VhYok!7S!5j|D7Z3Cmc)D%P-$0XDFSEo@^4yV%1% X4seJg9ODG17~%})xWMJxRr~q_H-0>p diff --git a/data-raw/rsi_translation.txt b/data-raw/clinical_breakpoints.txt similarity index 100% rename from data-raw/rsi_translation.txt rename to data-raw/clinical_breakpoints.txt diff --git a/data-raw/rsi_translation.xlsx b/data-raw/clinical_breakpoints.xlsx similarity index 99% rename from data-raw/rsi_translation.xlsx rename to data-raw/clinical_breakpoints.xlsx index 68c519bcf207d4df4514bc2dd1b76472890ca2db..f9214fc36d7953631bfd734d22d002a2e26b4881 100644 GIT binary patch delta 600 zcmdn}*l_n_L%slSW)=|!4h{|mhDg(}jePQqEFi{aL&oJ0*5o@(&%r{Ik2CAlFJYEc zeCv?v&&Q(Pm2bH7cGp??qQ!Uj?TuVs>MURDb8hGU>K*QS-?r)7DI`6Qb*?z-!RS|g zd1tP(-1XB%eq27MB(GMp^I9@Ya@F42Um#!GFvIGAlCz9i%Jd+CDU0qkhDM~`Oig{f zI8@XA@iexj_pgX$oV_8sb;6WD&x^`ydFqAx=2SSf*SkyEDju$WsoCY4~SS!@@StR{X1-4n)&wEs+rkg=e>@dp0(am zJV#GkqT2G^z8U$dd)Msv%M#$t&e3`DVW|Wo1A`V50|RPUZkA)!ga)QJTL+YNot;e( z62K27*qI=#H&T795LTVScBnc_B^?N>Ia9ekQ<)KnnShuXh*^M`6^Pk@m>q~YfS41A zxqz5^d!{mvk~i42>HT>;rV!SNJRVyJi!-0ciUSnEAa_sq&gU_Qh_~hQxIkFv@_7Ow jEad_oI|wVa0H$t10nDU_1w57zS-C5 delta 600 zcmdn}*l_n_L%slSW)=|!4h{~62U!zCH}c6dvVa(y4H=h1Sd;HCJqHU-KF+LHzl?S2 zgt7&j)Y+Sak8YoFC->+x{+$=|?%&&TdDp^zr?^SQ@ATWNk0j;)dc(|AcFwFtRQ2Qm zt>xCcb5A_3ni)TlXYrP(Z|9tx`5IC#ay@0b!~R_H2%mwsKsWErqc1F%t|&`T5%b*U zd2>fXiqG{8OXF6V?_`ad`jpjFVCl5LOB1Kn|CV&`vsw3Nzw*{u6aU$M5q8k#vX$5% zsHrXS_oEvJ+kcrEQ*Q1&o>#_uIDqHt6Yoxm+PJ&6J`X>i>+242h*~Hb&X`iN(DVlv z;~FyK{N`VH<3FLYcVeS8p{eE(E%ZSn57N!zqmYo))8 zSr>VB^(^h_Z&LsK&er9o=Y$?FlaF`FrbFzW;s?(XkdD?bwF9y z+1Ugk0sK&coe9EvBh|+WVbv*YhpMww(t)s=GnLyjl^KDU35c12m<5PgftU@5*@2h? zh&h3n3y8V5XDah3d4o-x-k--~3Sphd(U%cw0V?3xstp mpC=H)QZC@JgRoKyVCohWz)X5rz+(xKl`G`&g|PAqd3*p41N^xF diff --git a/data-raw/microorganisms.txt b/data-raw/microorganisms.txt index 30cb622c9..9a1a2c8d5 100644 --- a/data-raw/microorganisms.txt +++ b/data-raw/microorganisms.txt @@ -45554,7 +45554,7 @@ "B_STRPT_ORLX" "Streptococcus oriloxodontae" "accepted" "Bacteria" "Bacillota" "Bacilli" "Lactobacillales" "Streptococcaceae" "Streptococcus" "oriloxodontae" "" "species" "Shinozaki-Kuwahara et al., 2014" "LPSN" "792340" "517118" 1.5 "" "B_STRPT_ORSS" "Streptococcus orisasini" "accepted" "Bacteria" "Bacillota" "Bacilli" "Lactobacillales" "Streptococcaceae" "Streptococcus" "orisasini" "" "species" "Takada et al., 2013" "LPSN" "790987" "517118" 1.5 "" "B_STRPT_ORSR" "Streptococcus orisratti" "accepted" "Bacteria" "Bacillota" "Bacilli" "Lactobacillales" "Streptococcaceae" "Streptococcus" "orisratti" "" "species" "Zhu et al., 2000" "LPSN" "781365" "517118" 1.5 "438034004" -"B_STRPT_RSIS" "Streptococcus orisuis" "accepted" "Bacteria" "Bacillota" "Bacilli" "Lactobacillales" "Streptococcaceae" "Streptococcus" "orisuis" "" "species" "Takada et al., 2007" "LPSN" "781314" "517118" 1.5 "6441000146108" +"B_STRPT_sirS" "Streptococcus orisuis" "accepted" "Bacteria" "Bacillota" "Bacilli" "Lactobacillales" "Streptococcaceae" "Streptococcus" "orisuis" "" "species" "Takada et al., 2007" "LPSN" "781314" "517118" 1.5 "6441000146108" "B_STRPT_OVIS" "Streptococcus ovis" "accepted" "Bacteria" "Bacillota" "Bacilli" "Lactobacillales" "Streptococcaceae" "Streptococcus" "ovis" "" "species" "Collins et al., 2001" "LPSN" "781366" "517118" 1.5 "438035003" "B_STRPT_OVBR" "Streptococcus ovuberis" "accepted" "Bacteria" "Bacillota" "Bacilli" "Lactobacillales" "Streptococcaceae" "Streptococcus" "ovuberis" "" "species" "Zamora et al., 2017" "LPSN" "796216" "517118" 1.5 "" "B_STRPT_PCFC" "Streptococcus pacificus" "accepted" "Bacteria" "Bacillota" "Bacilli" "Lactobacillales" "Streptococcaceae" "Streptococcus" "pacificus" "" "species" "Volokhov et al., 2021" "LPSN" "19573" "517118" 1.5 "" diff --git a/data-raw/read_EUCAST.R b/data-raw/read_EUCAST.R index 9495b4c9e..f96d1ffd4 100644 --- a/data-raw/read_EUCAST.R +++ b/data-raw/read_EUCAST.R @@ -230,7 +230,7 @@ read_EUCAST <- function(sheet, file, guideline_name) { mo = ifelse(mo == "", mo_sheet, mo) ) %>% filter(!(is.na(breakpoint_S) & is.na(breakpoint_R))) %>% - # comply with rsi_translation for now + # comply with clinical_breakpoints for now transmute(guideline, method, site = case_when( @@ -285,7 +285,7 @@ for (i in 2:length(sheets_to_analyse)) { } # 2021-07-12 fix for Morganellaceae (check other lines too next time) -morg <- rsi_translation %>% +morg <- clinical_breakpoints %>% as_tibble() %>% filter( ab == "IPM", @@ -298,7 +298,7 @@ morg[which(morg$method == "MIC"), "breakpoint_R"] <- 4 morg[which(morg$method == "DISK"), "breakpoint_S"] <- 50 morg[which(morg$method == "DISK"), "breakpoint_R"] <- 19 -rsi_translation <- rsi_translation %>% +clinical_breakpoints <- clinical_breakpoints %>% bind_rows(morg) %>% bind_rows(morg %>% mutate(guideline = "EUCAST 2020")) %>% diff --git a/data-raw/reproduction_of_rsi_translation.R b/data-raw/reproduction_of_clinical_breakpoints.R similarity index 96% rename from data-raw/reproduction_of_rsi_translation.R rename to data-raw/reproduction_of_clinical_breakpoints.R index 6ed1db0be..fd7fe1d5f 100644 --- a/data-raw/reproduction_of_rsi_translation.R +++ b/data-raw/reproduction_of_clinical_breakpoints.R @@ -28,7 +28,7 @@ # ==================================================================== # # This script runs in under a minute and renews all guidelines of CLSI and EUCAST! -# Run it with source("data-raw/reproduction_of_rsi_translation.R") +# Run it with source("data-raw/reproduction_of_clinical_breakpoints.R") library(dplyr) library(readr) @@ -206,11 +206,11 @@ breakpoints_new[which(is.na(breakpoints_new$breakpoint_R)), "breakpoint_R"] <- b # check again breakpoints_new %>% filter(guideline == "EUCAST 2022", ab == "AMC", mo == "B_[ORD]_ENTRBCTR", method == "MIC") # compare with current version -rsi_translation %>% filter(guideline == "EUCAST 2022", ab == "AMC", mo == "B_[ORD]_ENTRBCTR", method == "MIC") +clinical_breakpoints %>% filter(guideline == "EUCAST 2022", ab == "AMC", mo == "B_[ORD]_ENTRBCTR", method == "MIC") # Save to package ---- -rsi_translation <- breakpoints_new -usethis::use_data(rsi_translation, overwrite = TRUE, compress = "xz", version = 2) -rm(rsi_translation) +clinical_breakpoints <- breakpoints_new +usethis::use_data(clinical_breakpoints, overwrite = TRUE, compress = "xz", version = 2) +rm(clinical_breakpoints) devtools::load_all(".") diff --git a/data-raw/reproduction_of_intrinsic_resistant.R b/data-raw/reproduction_of_intrinsic_resistant.R index c1defc53b..8c0afb613 100644 --- a/data-raw/reproduction_of_intrinsic_resistant.R +++ b/data-raw/reproduction_of_intrinsic_resistant.R @@ -31,7 +31,7 @@ library(AMR) library(dplyr) int_resis <- data.frame(mo = microorganisms$mo, stringsAsFactors = FALSE) for (i in seq_len(nrow(antibiotics))) { - int_resis$new <- as.rsi("S") + int_resis$new <- as.sir("S") colnames(int_resis)[ncol(int_resis)] <- antibiotics$ab[i] } @@ -43,7 +43,7 @@ int_resis <- eucast_rules(int_resis, info = FALSE ) -int_resis2 <- int_resis[, sapply(int_resis, function(x) any(!is.rsi(x) | x == "R")), drop = FALSE] %>% +int_resis2 <- int_resis[, sapply(int_resis, function(x) any(!is.sir(x) | x == "R")), drop = FALSE] %>% tidyr::pivot_longer(-mo) %>% filter(value == "R") %>% select(mo, ab = name) diff --git a/data-raw/reproduction_of_microorganisms.R b/data-raw/reproduction_of_microorganisms.R index c5d36dac0..09a55f7f4 100644 --- a/data-raw/reproduction_of_microorganisms.R +++ b/data-raw/reproduction_of_microorganisms.R @@ -1333,7 +1333,7 @@ rm(microorganisms) # and check: these codes should not be missing (will otherwise throw a unit test error): AMR::microorganisms.codes %>% filter(!mo %in% taxonomy$mo) -AMR::rsi_translation %>% filter(!mo %in% taxonomy$mo) +AMR::clinical_breakpoints %>% filter(!mo %in% taxonomy$mo) AMR::example_isolates %>% filter(!mo %in% taxonomy$mo) AMR::intrinsic_resistant %>% filter(!mo %in% taxonomy$mo) @@ -1342,10 +1342,10 @@ devtools::load_all(".") # reset previously changed mo codes -if (!identical(rsi_translation$mo, as.mo(rsi_translation$mo, language = NULL))) { - rsi_translation$mo <- as.mo(rsi_translation$mo, language = NULL) - usethis::use_data(rsi_translation, overwrite = TRUE, version = 2, compress = "xz") - rm(rsi_translation) +if (!identical(clinical_breakpoints$mo, as.mo(clinical_breakpoints$mo, language = NULL))) { + clinical_breakpoints$mo <- as.mo(clinical_breakpoints$mo, language = NULL) + usethis::use_data(clinical_breakpoints, overwrite = TRUE, version = 2, compress = "xz") + rm(clinical_breakpoints) } if (!identical(microorganisms.codes$mo, as.mo(microorganisms.codes$mo, language = NULL))) { diff --git a/data-raw/rsi_translation.rds b/data-raw/rsi_translation.rds deleted file mode 100644 index d0563813f4f569af2d5475106799a690fafce659..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43280 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 diff --git a/data/clinical_breakpoints.rda b/data/clinical_breakpoints.rda new file mode 100644 index 0000000000000000000000000000000000000000..ebd267d1563af9764a92f4a49e91f1565ef187ab GIT binary patch literal 32620 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 H00CKAOSn|$ literal 24292 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 set_ab_names(property = "atc") This package was intended as a comprehensive toolbox for integrated AMR data analysis. This package can be used for: * Reference for the taxonomy of microorganisms, since the package contains all microbial (sub)species from the List of Prokaryotic names with Standing in Nomenclature ([LPSN]((https://lpsn.dsmz.de))) and the Global Biodiversity Information Facility ([GBIF](https://www.gbif.org)) ([manual](./reference/mo_property.html)) - * Interpreting raw MIC and disk diffusion values, based on any CLSI or EUCAST guideline from the last 10 years ([manual](./reference/as.rsi.html)) + * Interpreting raw MIC and disk diffusion values, based on any CLSI or EUCAST guideline from the last 10 years ([manual](./reference/as.sir.html)) * Retrieving antimicrobial drug names, doses and forms of administration from clinical health care records ([manual](./reference/ab_from_text.html)) * Determining first isolates to be used for AMR data analysis ([manual](./reference/first_isolate.html)) * Calculating antimicrobial resistance ([tutorial](./articles/AMR.html)) @@ -135,7 +135,7 @@ This package was intended as a comprehensive toolbox for integrated AMR data ana * Applying EUCAST expert rules ([manual](./reference/eucast_rules.html)) * Getting SNOMED codes of a microorganism, or getting properties of a microorganism based on a SNOMED code ([manual](./reference/mo_property.html)) * Getting LOINC codes of an antibiotic, or getting properties of an antibiotic based on a LOINC code ([manual](./reference/ab_property.html)) - * Machine reading the EUCAST and CLSI guidelines from 2011-2021 to translate MIC values and disk diffusion diameters to R/SI ([link](./articles/datasets.html)) + * Machine reading the EUCAST and CLSI guidelines from 2011-2021 to translate MIC values and disk diffusion diameters to SIR ([link](./articles/datasets.html)) * Principal component analysis for AMR ([tutorial](./articles/PCA.html)) ### Get this package diff --git a/inst/tinytest/test-count.R b/inst/tinytest/test-count.R index 09d54a184..a44cc3143 100644 --- a/inst/tinytest/test-count.R +++ b/inst/tinytest/test-count.R @@ -29,7 +29,7 @@ expect_equal(count_resistant(example_isolates$AMX), count_R(example_isolates$AMX)) expect_equal(count_susceptible(example_isolates$AMX), count_SI(example_isolates$AMX)) -expect_equal(count_all(example_isolates$AMX), n_rsi(example_isolates$AMX)) +expect_equal(count_all(example_isolates$AMX), n_sir(example_isolates$AMX)) # AMX resistance in `example_isolates` expect_equal(count_R(example_isolates$AMX), 804) @@ -103,10 +103,10 @@ if (AMR:::pkg_is_available("dplyr", min_version = "1.0.0")) { ) ) - # grouping in rsi_calc_df() (= backbone of rsi_df()) + # grouping in sir_calc_df() (= backbone of sir_df()) expect_true("ward" %in% (example_isolates %>% group_by(ward) %>% select(ward, AMX, CIP, gender) %>% - rsi_df() %>% + sir_df() %>% colnames())) } diff --git a/inst/tinytest/test-data.R b/inst/tinytest/test-data.R index b012f5fe1..a2c203a2f 100644 --- a/inst/tinytest/test-data.R +++ b/inst/tinytest/test-data.R @@ -38,8 +38,8 @@ expect_identical(class(antibiotics$ab), c("ab", "character")) # check cross table reference expect_true(all(microorganisms.codes$mo %in% microorganisms$mo)) expect_true(all(example_isolates$mo %in% microorganisms$mo)) -expect_true(all(rsi_translation$mo %in% microorganisms$mo)) -expect_true(all(rsi_translation$ab %in% antibiotics$ab)) +expect_true(all(clinical_breakpoints$mo %in% microorganisms$mo)) +expect_true(all(clinical_breakpoints$ab %in% antibiotics$ab)) expect_true(all(intrinsic_resistant$mo %in% microorganisms$mo)) expect_true(all(intrinsic_resistant$ab %in% antibiotics$ab)) expect_false(any(is.na(microorganisms.codes$code))) @@ -47,10 +47,10 @@ expect_false(any(is.na(microorganisms.codes$mo))) expect_true(all(dosage$ab %in% antibiotics$ab)) expect_true(all(dosage$name %in% antibiotics$name)) # check valid disks/MICs -expect_false(any(is.na(as.mic(rsi_translation[which(rsi_translation$method == "MIC"), "breakpoint_S", drop = TRUE])))) -expect_false(any(is.na(as.mic(rsi_translation[which(rsi_translation$method == "MIC"), "breakpoint_R", drop = TRUE])))) -expect_false(any(is.na(as.disk(rsi_translation[which(rsi_translation$method == "DISK"), "breakpoint_S", drop = TRUE])))) -expect_false(any(is.na(as.disk(rsi_translation[which(rsi_translation$method == "DISK"), "breakpoint_R", drop = TRUE])))) +expect_false(any(is.na(as.mic(clinical_breakpoints[which(clinical_breakpoints$method == "MIC"), "breakpoint_S", drop = TRUE])))) +expect_false(any(is.na(as.mic(clinical_breakpoints[which(clinical_breakpoints$method == "MIC"), "breakpoint_R", drop = TRUE])))) +expect_false(any(is.na(as.disk(clinical_breakpoints[which(clinical_breakpoints$method == "DISK"), "breakpoint_S", drop = TRUE])))) +expect_false(any(is.na(as.disk(clinical_breakpoints[which(clinical_breakpoints$method == "DISK"), "breakpoint_R", drop = TRUE])))) # antibiotic names must always be coercible to their original AB code expect_identical(as.ab(antibiotics$name), antibiotics$ab) diff --git a/inst/tinytest/test-eucast_rules.R b/inst/tinytest/test-eucast_rules.R index ad08c12cd..37048c5d7 100755 --- a/inst/tinytest/test-eucast_rules.R +++ b/inst/tinytest/test-eucast_rules.R @@ -104,8 +104,8 @@ if (AMR:::pkg_is_available("dplyr", min_version = "1.0.0")) { example_isolates %>% filter(mo_family(mo) == "Enterobacteriaceae") %>% mutate( - TIC = as.rsi("R"), - PIP = as.rsi("S") + TIC = as.sir("R"), + PIP = as.sir("S") ) %>% eucast_rules(col_mo = "mo", version_expertrules = 3.1, info = FALSE) %>% pull(PIP) %>% @@ -117,15 +117,15 @@ if (AMR:::pkg_is_available("dplyr", min_version = "1.0.0")) { } # azithromycin and clarythromycin must be equal to Erythromycin -a <- suppressWarnings(as.rsi(eucast_rules(data.frame( +a <- suppressWarnings(as.sir(eucast_rules(data.frame( mo = example_isolates$mo, ERY = example_isolates$ERY, - AZM = as.rsi("R"), + AZM = as.sir("R"), CLR = factor("R"), stringsAsFactors = FALSE ), version_expertrules = 3.1, -only_rsi_columns = FALSE +only_sir_columns = FALSE )$CLR)) b <- example_isolates$ERY expect_identical( @@ -162,34 +162,34 @@ expect_stdout(suppressWarnings(eucast_rules(example_isolates, verbose = TRUE, ru expect_identical( eucast_rules(data.frame( mo = c("Escherichia coli", "Enterobacter cloacae"), - cefotax = as.rsi(c("S", "S")) + cefotax = as.sir(c("S", "S")) ), ampc_cephalosporin_resistance = TRUE, info = FALSE )$cefotax, - as.rsi(c("S", "R")) + as.sir(c("S", "R")) ) expect_identical( eucast_rules(data.frame( mo = c("Escherichia coli", "Enterobacter cloacae"), - cefotax = as.rsi(c("S", "S")) + cefotax = as.sir(c("S", "S")) ), ampc_cephalosporin_resistance = NA, info = FALSE )$cefotax, - as.rsi(c("S", NA)) + as.sir(c("S", NA)) ) expect_identical( eucast_rules(data.frame( mo = c("Escherichia coli", "Enterobacter cloacae"), - cefotax = as.rsi(c("S", "S")) + cefotax = as.sir(c("S", "S")) ), ampc_cephalosporin_resistance = NULL, info = FALSE )$cefotax, - as.rsi(c("S", "S")) + as.sir(c("S", "S")) ) # EUCAST dosage ----------------------------------------------------------- diff --git a/inst/tinytest/test-first_isolate.R b/inst/tinytest/test-first_isolate.R index c8ca6858d..7cc03773b 100755 --- a/inst/tinytest/test-first_isolate.R +++ b/inst/tinytest/test-first_isolate.R @@ -214,9 +214,9 @@ expect_equal( 1108 ) -# empty rsi results +# empty sir results expect_equal( - sum(first_isolate(example_isolates, include_untested_rsi = FALSE)), + sum(first_isolate(example_isolates, include_untested_sir = FALSE)), 1366 ) diff --git a/inst/tinytest/test-ggplot_rsi.R b/inst/tinytest/test-ggplot_rsi.R index 24af561c6..cb5cd5490 100644 --- a/inst/tinytest/test-ggplot_rsi.R +++ b/inst/tinytest/test-ggplot_rsi.R @@ -34,7 +34,7 @@ if (AMR:::pkg_is_available("dplyr", min_version = "1.0.0") & AMR:::pkg_is_availa expect_equal( (example_isolates %>% select(AMC, CIP) %>% - ggplot_rsi())$data %>% + ggplot_sir())$data %>% summarise_all(resistance) %>% as.double(), example_isolates %>% @@ -45,15 +45,15 @@ if (AMR:::pkg_is_available("dplyr", min_version = "1.0.0") & AMR:::pkg_is_availa expect_stdout(print(example_isolates %>% select(AMC, CIP) %>% - ggplot_rsi(x = "interpretation", facet = "antibiotic"))) + ggplot_sir(x = "interpretation", facet = "antibiotic"))) expect_stdout(print(example_isolates %>% select(AMC, CIP) %>% - ggplot_rsi(x = "antibiotic", facet = "interpretation"))) + ggplot_sir(x = "antibiotic", facet = "interpretation"))) expect_equal( (example_isolates %>% select(AMC, CIP) %>% - ggplot_rsi(x = "interpretation", facet = "antibiotic"))$data %>% + ggplot_sir(x = "interpretation", facet = "antibiotic"))$data %>% summarise_all(resistance) %>% as.double(), example_isolates %>% @@ -65,7 +65,7 @@ if (AMR:::pkg_is_available("dplyr", min_version = "1.0.0") & AMR:::pkg_is_availa expect_equal( (example_isolates %>% select(AMC, CIP) %>% - ggplot_rsi(x = "antibiotic", facet = "interpretation"))$data %>% + ggplot_sir(x = "antibiotic", facet = "interpretation"))$data %>% summarise_all(resistance) %>% as.double(), example_isolates %>% @@ -77,7 +77,7 @@ if (AMR:::pkg_is_available("dplyr", min_version = "1.0.0") & AMR:::pkg_is_availa expect_equal( (example_isolates %>% select(AMC, CIP) %>% - ggplot_rsi(x = "antibiotic", facet = "interpretation"))$data %>% + ggplot_sir(x = "antibiotic", facet = "interpretation"))$data %>% summarise_all(count_resistant) %>% as.double(), example_isolates %>% @@ -124,7 +124,7 @@ if (AMR:::pkg_is_available("dplyr", min_version = "1.0.0") & AMR:::pkg_is_availa z = c("Value4", "Value5", "Value6") )) + geom_col(aes(x = x, y = y, fill = z)) + - scale_rsi_colours(Value4 = "S", Value5 = "I", Value6 = "R"))$data, + scale_sir_colours(Value4 = "S", Value5 = "I", Value6 = "R"))$data, "data.frame" ) } diff --git a/inst/tinytest/test-mdro.R b/inst/tinytest/test-mdro.R index 87532d9d0..6dcd933e6 100755 --- a/inst/tinytest/test-mdro.R +++ b/inst/tinytest/test-mdro.R @@ -133,13 +133,13 @@ expect_equal( ) x <- data.frame( - rifampicin = random_rsi(5000, prob_RSI = c(0.4, 0.1, 0.5)), - inh = random_rsi(5000, prob_RSI = c(0.4, 0.1, 0.5)), - gatifloxacin = random_rsi(5000, prob_RSI = c(0.4, 0.1, 0.5)), - eth = random_rsi(5000, prob_RSI = c(0.4, 0.1, 0.5)), - pza = random_rsi(5000, prob_RSI = c(0.4, 0.1, 0.5)), - MFX = random_rsi(5000, prob_RSI = c(0.4, 0.1, 0.5)), - KAN = random_rsi(5000, prob_RSI = c(0.4, 0.1, 0.5)) + rifampicin = random_sir(5000, prob_sir = c(0.4, 0.1, 0.5)), + inh = random_sir(5000, prob_sir = c(0.4, 0.1, 0.5)), + gatifloxacin = random_sir(5000, prob_sir = c(0.4, 0.1, 0.5)), + eth = random_sir(5000, prob_sir = c(0.4, 0.1, 0.5)), + pza = random_sir(5000, prob_sir = c(0.4, 0.1, 0.5)), + MFX = random_sir(5000, prob_sir = c(0.4, 0.1, 0.5)), + KAN = random_sir(5000, prob_sir = c(0.4, 0.1, 0.5)) ) expect_true(length(unique(mdr_tb(x))) > 2) diff --git a/inst/tinytest/test-mean_amr_distance.R b/inst/tinytest/test-mean_amr_distance.R index 0a7290f6d..25e151af6 100644 --- a/inst/tinytest/test-mean_amr_distance.R +++ b/inst/tinytest/test-mean_amr_distance.R @@ -29,7 +29,7 @@ vctr_disk <- as.disk(c(20:25)) vctr_mic <- as.mic(2^c(0:5)) -vctr_rsi <- as.rsi(c("S", "S", "I", "I", "R", "R")) +vctr_sir <- as.sir(c("S", "S", "I", "I", "R", "R")) expect_identical( mean_amr_distance(vctr_disk), @@ -42,22 +42,22 @@ expect_identical( ) expect_identical( - mean_amr_distance(vctr_rsi, combine_SI = FALSE), + mean_amr_distance(vctr_sir, combine_SI = FALSE), (c(1, 1, 2, 2, 3, 3) - mean(c(1, 1, 2, 2, 3, 3))) / sd(c(1, 1, 2, 2, 3, 3)) ) expect_identical( - mean_amr_distance(vctr_rsi, combine_SI = TRUE), + mean_amr_distance(vctr_sir, combine_SI = TRUE), (c(1, 1, 1, 1, 3, 3) - mean(c(1, 1, 1, 1, 3, 3))) / sd(c(1, 1, 1, 1, 3, 3)) ) expect_equal( - mean_amr_distance(data.frame(AMX = vctr_mic, GEN = vctr_rsi, TOB = vctr_disk)), + mean_amr_distance(data.frame(AMX = vctr_mic, GEN = vctr_sir, TOB = vctr_disk)), c(-1.10603655, -0.74968823, -0.39333990, -0.03699158, 0.96485397, 1.32120229), tolerance = 0.00001 ) expect_equal( - mean_amr_distance(data.frame(AMX = vctr_mic, GEN = vctr_rsi, TOB = vctr_disk), 2:3), + mean_amr_distance(data.frame(AMX = vctr_mic, GEN = vctr_sir, TOB = vctr_disk), 2:3), c(-0.9909017, -0.7236405, -0.4563792, -0.1891180, 1.0463891, 1.3136503), tolerance = 0.00001 ) diff --git a/inst/tinytest/test-pca.R b/inst/tinytest/test-pca.R index 0286debef..02f27eebe 100644 --- a/inst/tinytest/test-pca.R +++ b/inst/tinytest/test-pca.R @@ -63,7 +63,7 @@ if (AMR:::pkg_is_available("dplyr", min_version = "1.0.0")) { order = mo_order(mo), genus = mo_genus(mo) ) %>% - summarise_if(is.rsi, resistance, minimum = 0) + summarise_if(is.sir, resistance, minimum = 0) pca_result <- resistance_data %>% pca(AMC, CXM, CTX, CAZ, GEN, TOB, TMP, "SXT") expect_inherits(pca_result, "prcomp") diff --git a/inst/tinytest/test-proportion.R b/inst/tinytest/test-proportion.R index 811627405..ceaffff45 100755 --- a/inst/tinytest/test-proportion.R +++ b/inst/tinytest/test-proportion.R @@ -32,8 +32,8 @@ expect_equal(proportion_SI(example_isolates$AMX), susceptibility(example_isolate # AMX resistance in `example_isolates` expect_equal(proportion_R(example_isolates$AMX), 0.5955556, tolerance = 0.0001) expect_equal(proportion_I(example_isolates$AMX), 0.002222222, tolerance = 0.0001) -expect_equal(rsi_confidence_interval(example_isolates$AMX)[1], 0.5688204, tolerance = 0.0001) -expect_equal(rsi_confidence_interval(example_isolates$AMX)[2], 0.6218738, tolerance = 0.0001) +expect_equal(sir_confidence_interval(example_isolates$AMX)[1], 0.5688204, tolerance = 0.0001) +expect_equal(sir_confidence_interval(example_isolates$AMX)[2], 0.6218738, tolerance = 0.0001) expect_equal( 1 - proportion_R(example_isolates$AMX) - proportion_I(example_isolates$AMX), proportion_S(example_isolates$AMX) @@ -69,7 +69,7 @@ if (AMR:::pkg_is_available("dplyr", min_version = "1.0.0")) { R = proportion_R(CIP, as_percent = TRUE), I = proportion_I(CIP, as_percent = TRUE), S = proportion_S(CIP, as_percent = TRUE), - n = n_rsi(CIP), + n = n_sir(CIP), total = n() ) %>% pull(n) %>% @@ -83,11 +83,11 @@ if (AMR:::pkg_is_available("dplyr", min_version = "1.0.0")) { group_by(ward) %>% summarise( cipro_p = proportion_SI(CIP, as_percent = TRUE), - cipro_n = n_rsi(CIP), + cipro_n = n_sir(CIP), genta_p = proportion_SI(GEN, as_percent = TRUE), - genta_n = n_rsi(GEN), + genta_n = n_sir(GEN), combination_p = proportion_SI(CIP, GEN, as_percent = TRUE), - combination_n = n_rsi(CIP, GEN) + combination_n = n_sir(CIP, GEN) ) %>% pull(combination_n), c(1181, 577, 116) @@ -110,7 +110,7 @@ if (AMR:::pkg_is_available("dplyr", min_version = "1.0.0")) { ) ) - expect_warning(example_isolates %>% group_by(ward) %>% summarise(across(KAN, rsi_confidence_interval))) + expect_warning(example_isolates %>% group_by(ward) %>% summarise(across(KAN, sir_confidence_interval))) } expect_warning(proportion_R(as.character(example_isolates$AMC))) @@ -120,12 +120,12 @@ expect_warning(proportion_S(as.character( example_isolates$GEN ))) -expect_warning(n_rsi(as.character( +expect_warning(n_sir(as.character( example_isolates$AMC, example_isolates$GEN ))) expect_equal( - suppressWarnings(n_rsi(as.character( + suppressWarnings(n_sir(as.character( example_isolates$AMC, example_isolates$GEN ))), diff --git a/inst/tinytest/test-random.R b/inst/tinytest/test-random.R index 7e7251c01..4d427cc7d 100644 --- a/inst/tinytest/test-random.R +++ b/inst/tinytest/test-random.R @@ -37,4 +37,4 @@ expect_inherits(random_disk(100), "disk") expect_inherits(random_disk(100, mo = "Klebsiella pneumoniae"), "disk") expect_inherits(random_disk(100, mo = "Klebsiella pneumoniae", ab = "meropenem"), "disk") expect_inherits(random_disk(100, ab = "meropenem"), "disk") -expect_inherits(random_rsi(100), "rsi") +expect_inherits(random_sir(100), "sir") diff --git a/inst/tinytest/test-resistance_predict.R b/inst/tinytest/test-resistance_predict.R index 5b66f9987..658c5ffb8 100644 --- a/inst/tinytest/test-resistance_predict.R +++ b/inst/tinytest/test-resistance_predict.R @@ -30,7 +30,7 @@ if (AMR:::pkg_is_available("dplyr", min_version = "1.0.0")) { expect_stdout(AMX_R <- example_isolates %>% filter(mo == "B_ESCHR_COLI") %>% - rsi_predict( + sir_predict( col_ab = "AMX", col_date = "date", model = "binomial", @@ -51,25 +51,25 @@ expect_stdout(x <- suppressMessages(resistance_predict(example_isolates, pdf(NULL) # prevent Rplots.pdf being created expect_silent(plot(x)) if (AMR:::pkg_is_available("ggplot2")) { - expect_silent(ggplot_rsi_predict(x)) + expect_silent(ggplot_sir_predict(x)) expect_silent(autoplot(x)) - expect_error(ggplot_rsi_predict(example_isolates)) + expect_error(ggplot_sir_predict(example_isolates)) } -expect_stdout(rsi_predict( +expect_stdout(sir_predict( x = subset(example_isolates, mo == "B_ESCHR_COLI"), model = "binomial", col_ab = "AMX", col_date = "date", info = TRUE )) -expect_stdout(rsi_predict( +expect_stdout(sir_predict( x = subset(example_isolates, mo == "B_ESCHR_COLI"), model = "loglin", col_ab = "AMX", col_date = "date", info = TRUE )) -expect_stdout(rsi_predict( +expect_stdout(sir_predict( x = subset(example_isolates, mo == "B_ESCHR_COLI"), model = "lin", col_ab = "AMX", @@ -77,34 +77,34 @@ expect_stdout(rsi_predict( info = TRUE )) -expect_error(rsi_predict( +expect_error(sir_predict( x = subset(example_isolates, mo == "B_ESCHR_COLI"), model = "INVALID MODEL", col_ab = "AMX", col_date = "date", info = TRUE )) -expect_error(rsi_predict( +expect_error(sir_predict( x = subset(example_isolates, mo == "B_ESCHR_COLI"), model = "binomial", col_ab = "NOT EXISTING COLUMN", col_date = "date", info = TRUE )) -expect_error(rsi_predict( +expect_error(sir_predict( x = subset(example_isolates, mo == "B_ESCHR_COLI"), model = "binomial", col_ab = "AMX", col_date = "NOT EXISTING COLUMN", info = TRUE )) -expect_error(rsi_predict( +expect_error(sir_predict( x = subset(example_isolates, mo == "B_ESCHR_COLI"), col_ab = "AMX", col_date = "NOT EXISTING COLUMN", info = TRUE )) -expect_error(rsi_predict( +expect_error(sir_predict( x = subset(example_isolates, mo == "B_ESCHR_COLI"), col_ab = "AMX", col_date = "date", diff --git a/inst/tinytest/test-rsi.R b/inst/tinytest/test-rsi.R index 5cbe24230..d7181e234 100644 --- a/inst/tinytest/test-rsi.R +++ b/inst/tinytest/test-rsi.R @@ -27,34 +27,34 @@ # how to conduct AMR data analysis: https://msberends.github.io/AMR/ # # ==================================================================== # -# we must only have EUCAST and CLSI, because otherwise the rules in as.rsi() will fail +# we must only have EUCAST and CLSI, because otherwise the rules in as.sir() will fail expect_identical( - unique(gsub("[^A-Z]", "", AMR::rsi_translation$guideline)), + unique(gsub("[^A-Z]", "", AMR::clinical_breakpoints$guideline)), c("EUCAST", "CLSI") ) -expect_true(as.rsi("S") < as.rsi("I")) -expect_true(as.rsi("I") < as.rsi("R")) -expect_true(is.rsi(as.rsi("S"))) +expect_true(as.sir("S") < as.sir("I")) +expect_true(as.sir("I") < as.sir("R")) +expect_true(is.sir(as.sir("S"))) x <- example_isolates$AMX -expect_inherits(x[1], "rsi") -expect_inherits(x[[1]], "rsi") -expect_inherits(c(x[1], x[9]), "rsi") -expect_inherits(unique(x[1], x[9]), "rsi") +expect_inherits(x[1], "sir") +expect_inherits(x[[1]], "sir") +expect_inherits(c(x[1], x[9]), "sir") +expect_inherits(unique(x[1], x[9]), "sir") pdf(NULL) # prevent Rplots.pdf being created -expect_silent(barplot(as.rsi(c("S", "I", "R")))) -expect_silent(plot(as.rsi(c("S", "I", "R")))) +expect_silent(barplot(as.sir(c("S", "I", "R")))) +expect_silent(plot(as.sir(c("S", "I", "R")))) if (AMR:::pkg_is_available("ggplot2")) { - expect_inherits(autoplot(as.rsi(c("S", "I", "R"))), "gg") + expect_inherits(autoplot(as.sir(c("S", "I", "R"))), "gg") } -expect_stdout(print(as.rsi(c("S", "I", "R")))) -expect_equal(as.character(as.rsi(c(1:3))), c("S", "I", "R")) -expect_equal(as.character(as.rsi(c(1:3))), c("S", "I", "R")) -expect_equal(suppressWarnings(as.logical(as.rsi("INVALID VALUE"))), NA) +expect_stdout(print(as.sir(c("S", "I", "R")))) +expect_equal(as.character(as.sir(c(1:3))), c("S", "I", "R")) +expect_equal(as.character(as.sir(c(1:3))), c("S", "I", "R")) +expect_equal(suppressWarnings(as.logical(as.sir("INVALID VALUE"))), NA) expect_equal( - summary(as.rsi(c("S", "R"))), + summary(as.sir(c("S", "R"))), structure(c( - "Class" = "rsi", + "Class" = "sir", "%R" = "50.0% (n=1)", "%SI" = "50.0% (n=1)", "- %S" = "50.0% (n=1)", @@ -62,31 +62,31 @@ expect_equal( ), class = c("summaryDefault", "table")) ) expect_identical( - as.logical(lapply(example_isolates, is.rsi.eligible)), - as.logical(lapply(example_isolates, is.rsi)) + as.logical(lapply(example_isolates, is_sir_eligible)), + as.logical(lapply(example_isolates, is.sir)) ) -expect_error(as.rsi.mic(as.mic(16))) -expect_error(as.rsi.disk(as.disk(16))) +expect_error(as.sir.mic(as.mic(16))) +expect_error(as.sir.disk(as.disk(16))) expect_error(get_guideline("this one does not exist")) if (AMR:::pkg_is_available("dplyr", min_version = "1.0.0")) { - # 40 rsi columns + # 40 sir columns expect_equal( example_isolates %>% mutate_at(vars(PEN:RIF), as.character) %>% - lapply(is.rsi.eligible) %>% + lapply(is_sir_eligible) %>% as.logical() %>% sum(), 40 ) - expect_equal(sum(is.rsi(example_isolates)), 40) + expect_equal(sum(is.sir(example_isolates)), 40) - expect_stdout(print(tibble(ab = as.rsi("S")))) + expect_stdout(print(tibble(ab = as.sir("S")))) expect_true(example_isolates %>% select(AMC, MEM) %>% - mutate(MEM = as.rsi(ifelse(AMC == "S", "S", MEM))) %>% + mutate(MEM = as.sir(ifelse(AMC == "S", "S", MEM))) %>% pull(MEM) %>% - is.rsi()) + is.sir()) } if (AMR:::pkg_is_available("skimr", min_version = "2.0.0")) { expect_inherits( @@ -106,12 +106,12 @@ if (AMR:::pkg_is_available("skimr", min_version = "2.0.0")) { } } -expect_equal(as.rsi(c("", "-", NA, "NULL")), c(NA_rsi_, NA_rsi_, NA_rsi_, NA_rsi_)) +expect_equal(as.sir(c("", "-", NA, "NULL")), c(NA_sir_, NA_sir_, NA_sir_, NA_sir_)) # S. pneumoniae/ampicillin in EUCAST 2020: 0.5-2 ug/ml (R is only > 2) expect_equal(suppressMessages( as.character( - as.rsi( + as.sir( x = as.mic(c(0.125, 0.5, 1, 2, 4)), mo = "B_STRPT_PNMN", ab = "AMP", @@ -123,7 +123,7 @@ expect_equal(suppressMessages( # S. pneumoniae/amoxicillin in CLSI 2019: 2-8 ug/ml (R is 8 and > 8) expect_equal(suppressMessages( as.character( - as.rsi( + as.sir( x = as.mic(c(1, 2, 4, 8, 16)), mo = "B_STRPT_PNMN", ab = "AMX", @@ -133,31 +133,31 @@ expect_equal(suppressMessages( c("S", "S", "I", "R", "R") ) -expect_true(is.data.frame(rsi_interpretation_history(clean = FALSE))) -expect_true(is.data.frame(rsi_interpretation_history(clean = TRUE))) -expect_true(is.null(rsi_interpretation_history())) +expect_true(is.data.frame(sir_interpretation_history(clean = FALSE))) +expect_true(is.data.frame(sir_interpretation_history(clean = TRUE))) +expect_true(is.null(sir_interpretation_history())) # cutoffs at MIC = 8 expect_equal( - suppressMessages(as.rsi(as.mic(2), "E. coli", "ampicillin", guideline = "EUCAST 2020")), - as.rsi("S") + suppressMessages(as.sir(as.mic(2), "E. coli", "ampicillin", guideline = "EUCAST 2020")), + as.sir("S") ) expect_equal( - suppressMessages(as.rsi(as.mic(32), "E. coli", "ampicillin", guideline = "EUCAST 2020")), - as.rsi("R") + suppressMessages(as.sir(as.mic(32), "E. coli", "ampicillin", guideline = "EUCAST 2020")), + as.sir("R") ) if (AMR:::pkg_is_available("dplyr", min_version = "1.0.0")) { expect_true(suppressWarnings(example_isolates %>% mutate(amox_mic = as.mic(2)) %>% select(mo, amox_mic) %>% - as.rsi() %>% + as.sir() %>% pull(amox_mic) %>% - is.rsi())) + is.sir())) } expect_equal( as.character( - as.rsi( + as.sir( x = as.disk(22), mo = "B_STRPT_PNMN", ab = "ERY", @@ -168,7 +168,7 @@ expect_equal( ) expect_equal( as.character( - as.rsi( + as.sir( x = as.disk(18), mo = "B_STRPT_PNMN", ab = "ERY", @@ -179,7 +179,7 @@ expect_equal( ) expect_equal( as.character( - as.rsi( + as.sir( x = as.disk(10), mo = "B_STRPT_PNMN", ab = "ERY", @@ -192,9 +192,9 @@ if (AMR:::pkg_is_available("dplyr", min_version = "1.0.0")) { expect_true(example_isolates %>% mutate(amox_disk = as.disk(15)) %>% select(mo, amox_disk) %>% - as.rsi(guideline = "CLSI") %>% + as.sir(guideline = "CLSI") %>% pull(amox_disk) %>% - is.rsi()) + is.sir()) } # frequency tables if (AMR:::pkg_is_available("cleaner")) { @@ -212,26 +212,26 @@ df <- data.frame( CLR = "V" ) # note about cleaning expect_inherits( - suppressWarnings(as.rsi(df)), + suppressWarnings(as.sir(df)), "data.frame" ) expect_inherits( - suppressWarnings(as.rsi(data.frame( + suppressWarnings(as.sir(data.frame( mo = "Escherichia coli", - amoxi = c("R", "S", "I", "invalid") + amoxi = c("S", "I", "R", "invalid") ))$amoxi), - "rsi" + "sir" ) -expect_warning(as.rsi(data.frame( +expect_warning(as.sir(data.frame( mo = "E. coli", NIT = c("<= 2", 32) ))) -expect_message(as.rsi(data.frame( +expect_message(as.sir(data.frame( mo = "E. coli", NIT = c("<= 2", 32), uti = TRUE ))) -expect_message(as.rsi(data.frame( +expect_message(as.sir(data.frame( mo = "E. coli", NIT = c("<= 2", 32), specimen = c("urine", "blood") diff --git a/inst/tinytest/test-vctrs.R b/inst/tinytest/test-vctrs.R index 046d582e6..76c5de43d 100755 --- a/inst/tinytest/test-vctrs.R +++ b/inst/tinytest/test-vctrs.R @@ -33,7 +33,7 @@ if (AMR:::pkg_is_available("dplyr", also_load = FALSE)) { mo = as.mo("Escherichia coli"), mic = as.mic(2), disk = as.disk(20), - rsi = as.rsi("S")) + sir = as.sir("S")) check1 <- lapply(test, class) test[1, "ab"] <- "GEN" test[1, "mo"] <- "B_KLBSL_PNMN" @@ -42,11 +42,11 @@ if (AMR:::pkg_is_available("dplyr", also_load = FALSE)) { test[1, "disk"] <- "35" test[1, "disk"] <- 25 test[1, "disk"] <- 26L - test[1, "rsi"] <- "R" + test[1, "sir"] <- "R" check2 <- lapply(test, class) expect_identical(check1, check2) - test <- dplyr::tibble(cipro = as.rsi("S"), + test <- dplyr::tibble(cipro = as.sir("S"), variable = "test") expect_equal(nrow(test[quinolones() == "S", ]), 1) expect_equal(nrow(test[quinolones() == "R", ]), 0) diff --git a/man/AMR-deprecated.Rd b/man/AMR-deprecated.Rd index 07b8221ed..ab25dd7ef 100755 --- a/man/AMR-deprecated.Rd +++ b/man/AMR-deprecated.Rd @@ -1,8 +1,58 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/deprecated.R +% Please edit documentation in R/zz_deprecated.R +\docType{data} \name{AMR-deprecated} \alias{AMR-deprecated} +\alias{NA_rsi_} +\alias{as.rsi} +\alias{facet_rsi} +\alias{geom_rsi} +\alias{ggplot_rsi} +\alias{ggplot_rsi_predict} +\alias{is.rsi} +\alias{is.rsi.eligible} +\alias{labels_rsi_count} +\alias{n_rsi} +\alias{random_rsi} +\alias{rsi_df} +\alias{rsi_predict} +\alias{scale_rsi_colours} +\alias{theme_rsi} \title{Deprecated Functions} +\format{ +An object of class \code{rsi} (inherits from \code{ordered}, \code{factor}) of length 1. +} +\usage{ +NA_rsi_ + +as.rsi(x, ...) + +facet_rsi(...) + +geom_rsi(...) + +ggplot_rsi(...) + +ggplot_rsi_predict(...) + +is.rsi(x, ...) + +is.rsi.eligible(...) + +labels_rsi_count(...) + +n_rsi(...) + +random_rsi(...) + +rsi_df(...) + +rsi_predict(...) + +scale_rsi_colours(...) + +theme_rsi(...) +} \description{ These functions are so-called '\link{Deprecated}'. \strong{They will be removed in a future release.} Using the functions will give a warning with the name of the function it has been replaced by (if there is one). } diff --git a/man/AMR.Rd b/man/AMR.Rd index a1d944178..c353473bd 100755 --- a/man/AMR.Rd +++ b/man/AMR.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/amr.R +% Please edit documentation in R/aa_amr-package.R \docType{package} \name{AMR} \alias{AMR} @@ -28,37 +28,17 @@ A BibTeX entry for LaTeX users is: \description{ Welcome to the \code{AMR} package. -\code{AMR} is a free, open-source and independent \R package to simplify the analysis and prediction of Antimicrobial Resistance (AMR) and to work with microbial and antimicrobial data and properties, by using evidence-based methods. Our aim is to provide a standard for clean and reproducible antimicrobial resistance data analysis, that can therefore empower epidemiological analyses to continuously enable surveillance and treatment evaluation in any setting. +The \code{AMR} package is a \href{https://msberends.github.io/AMR/#copyright}{free and open-source} R package with \href{https://en.wikipedia.org/wiki/Dependency_hell}{zero dependencies} to simplify the analysis and prediction of Antimicrobial Resistance (AMR) and to work with microbial and antimicrobial data and properties, by using evidence-based methods. \strong{Our aim is to provide a standard} for clean and reproducible AMR data analysis, that can therefore empower epidemiological analyses to continuously enable surveillance and treatment evaluation in any setting. \href{https://msberends.github.io/AMR/authors.html}{Many different researchers} from around the globe are continually helping us to make this a successful and durable project! -This work was published in the Journal of Statistical Software (Volume 104(3); \doi{10.18637/jss.v104.i03}) and formed the basis of two PhD theses (\doi{10.33612/diss.177417131} and \doi{10.33612/diss.192486375}). +This work was published in the Journal of Statistical Software (Volume 104(3); \href{https://doi.org/10.18637/jss.v104.i03}{DOI 10.18637/jss.v104.i03}) and formed the basis of two PhD theses (\href{https://doi.org/10.33612/diss.177417131}{DOI 10.33612/diss.177417131} and \href{https://doi.org/10.33612/diss.192486375}{DOI 10.33612/diss.192486375}). -After installing this package, \R knows ~52,000 distinct microbial species and all ~600 antibiotic, antimycotic and antiviral drugs by name and code (including ATC, EARS-NET, LOINC and SNOMED CT), and knows all about valid R/SI and MIC values. It supports any data format, including WHONET/EARS-Net data. +After installing this package, R knows \href{https://msberends.github.io/AMR/reference/microorganisms.html}{\strong{~52,000}} (updated December 2022) and all \href{https://msberends.github.io/AMR/reference/antibiotics.html}{\strong{~600 antibiotic, antimycotic and antiviral drugs}} by name and code (including ATC, EARS-Net, ASIARS-Net, PubChem, LOINC and SNOMED CT), and knows all about valid SIR and MIC values. The integral breakpoint guidelines from CLSI and EUCAST are included from the last 10 years. It supports and can read any data format, including WHONET data. This package works on Windows, macOS and Linux with all versions of R since R-3.0 (April 2013). \strong{It was designed to work in any setting, including those with very limited resources}. It was created for both routine data analysis and academic research at the Faculty of Medical Sciences of the \href{https://www.rug.nl}{University of Groningen}, in collaboration with non-profit organisations \href{https://www.certe.nl}{Certe Medical Diagnostics and Advice Foundation} and \href{https://www.umcg.nl}{University Medical Center Groningen}. -This package is fully independent of any other \R package and works on Windows, macOS and Linux with all versions of \R since R-3.0.0 (April 2013). It was designed to work in any setting, including those with very limited resources. It was created for both routine data analysis and academic research at the Faculty of Medical Sciences of the University of Groningen, in collaboration with non-profit organisations Certe Medical Diagnostics and Advice and University Medical Center Groningen. This \R package is actively maintained and free software; you can freely use and distribute it for both personal and commercial (but not patent) purposes under the terms of the GNU General Public License version 2.0 (GPL-2), as published by the Free Software Foundation. - -This package can be used for: -\itemize{ -\item Reference for the taxonomy of microorganisms, since the package contains all microbial (sub)species from the List of Prokaryotic names with Standing in Nomenclature (LPSN) and the Global Biodiversity Information Facility (GBIF) -\item Interpreting raw MIC and disk diffusion values, based on any CLSI or EUCAST guideline from the last 10 years -\item Retrieving antimicrobial drug names, doses and forms of administration from clinical health care records -\item Determining first isolates to be used for AMR data analysis -\item Calculating antimicrobial resistance -\item Determining multi-drug resistance (MDR) / multi-drug resistant organisms (MDRO) -\item Calculating (empirical) susceptibility of both mono therapy and combination therapies -\item Predicting future antimicrobial resistance using regression models -\item Getting properties for any microorganism (such as Gram stain, species, genus or family) -\item Getting properties for any antibiotic (such as name, code of EARS-Net/ATC/LOINC/PubChem, defined daily dose or trade name) -\item Plotting antimicrobial resistance -\item Applying EUCAST expert rules -\item Getting SNOMED codes of a microorganism, or getting properties of a microorganism based on a SNOMED code -\item Getting LOINC codes of an antibiotic, or getting properties of an antibiotic based on a LOINC code -\item Machine reading the EUCAST and CLSI guidelines from 2011-2020 to translate MIC values and disk diffusion diameters to R/SI -\item Principal component analysis for AMR -} +The \code{AMR} package is available in English, Chinese, Danish, Dutch, French, German, Greek, Italian, Japanese, Polish, Portuguese, Russian, Spanish, Swedish, Turkish and Ukrainian. Antimicrobial drug (group) names and colloquial microorganism names are provided in these languages. } \section{Reference Data Publicly Available}{ -All data sets in this \code{AMR} package (about microorganisms, antibiotics, R/SI interpretation, EUCAST rules, etc.) are publicly and freely available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. We also provide tab-separated plain text files that are machine-readable and suitable for input in any software program, such as laboratory information systems. Please visit \href{https://msberends.github.io/AMR/articles/datasets.html}{our website for the download links}. The actual files are of course available on \href{https://github.com/msberends/AMR/tree/main/data-raw}{our GitHub repository}. +All data sets in this \code{AMR} package (about microorganisms, antibiotics, SIR interpretation, EUCAST rules, etc.) are publicly and freely available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. We also provide tab-separated plain text files that are machine-readable and suitable for input in any software program, such as laboratory information systems. Please visit \href{https://msberends.github.io/AMR/articles/datasets.html}{our website for the download links}. The actual files are of course available on \href{https://github.com/msberends/AMR/tree/main/data-raw}{our GitHub repository}. } \seealso{ diff --git a/man/WHONET.Rd b/man/WHONET.Rd index 4539b8913..8c027a476 100755 --- a/man/WHONET.Rd +++ b/man/WHONET.Rd @@ -32,7 +32,7 @@ A \link[tibble:tibble]{tibble} with 500 observations and 53 variables: \item \verb{Inducible clindamycin resistance}\cr Clindamycin can be induced? \item \code{Comment}\cr Other comments \item \verb{Date of data entry}\cr \link{Date} this data was entered in WHONET -\item \code{AMP_ND10:CIP_EE}\cr 28 different antibiotics. You can lookup the abbreviations in the \link{antibiotics} data set, or use e.g. \code{\link[=ab_name]{ab_name("AMP")}} to get the official name immediately. Before analysis, you should transform this to a valid antibiotic class, using \code{\link[=as.rsi]{as.rsi()}}. +\item \code{AMP_ND10:CIP_EE}\cr 0 different antibiotics. You can lookup the abbreviations in the \link{antibiotics} data set, or use e.g. \code{\link[=ab_name]{ab_name("AMP")}} to get the official name immediately. Before analysis, you should transform this to a valid antibiotic class, using \code{\link[=as.sir]{as.sir()}}. } } \usage{ diff --git a/man/ab_property.Rd b/man/ab_property.Rd index 7a49e2b62..e1935f75a 100755 --- a/man/ab_property.Rd +++ b/man/ab_property.Rd @@ -104,7 +104,7 @@ European Commission Public Health PHARMACEUTICALS - COMMUNITY REGISTER: \url{htt \section{Reference Data Publicly Available}{ -All data sets in this \code{AMR} package (about microorganisms, antibiotics, R/SI interpretation, EUCAST rules, etc.) are publicly and freely available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. We also provide tab-separated plain text files that are machine-readable and suitable for input in any software program, such as laboratory information systems. Please visit \href{https://msberends.github.io/AMR/articles/datasets.html}{our website for the download links}. The actual files are of course available on \href{https://github.com/msberends/AMR/tree/main/data-raw}{our GitHub repository}. +All data sets in this \code{AMR} package (about microorganisms, antibiotics, SIR interpretation, EUCAST rules, etc.) are publicly and freely available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. We also provide tab-separated plain text files that are machine-readable and suitable for input in any software program, such as laboratory information systems. Please visit \href{https://msberends.github.io/AMR/articles/datasets.html}{our website for the download links}. The actual files are of course available on \href{https://github.com/msberends/AMR/tree/main/data-raw}{our GitHub repository}. } \examples{ @@ -166,7 +166,7 @@ if (require("dplyr")) { head() example_isolates \%>\% - set_ab_names(where(is.rsi)) \%>\% + set_ab_names(where(is.sir)) \%>\% colnames() example_isolates \%>\% diff --git a/man/add_custom_antimicrobials.Rd b/man/add_custom_antimicrobials.Rd index 73f47a365..c7618ac27 100755 --- a/man/add_custom_antimicrobials.Rd +++ b/man/add_custom_antimicrobials.Rd @@ -93,8 +93,8 @@ ab_name("J01CR50") # even antibiotic selectors work x <- data.frame( random_column = "some value", - coflu = as.rsi("S"), - ampicillin = as.rsi("R") + coflu = as.sir("S"), + ampicillin = as.sir("R") ) x x[, betalactams()] diff --git a/man/add_custom_microorganisms.Rd b/man/add_custom_microorganisms.Rd index e0db9432d..81f63b6e8 100755 --- a/man/add_custom_microorganisms.Rd +++ b/man/add_custom_microorganisms.Rd @@ -22,7 +22,7 @@ This function will fill in missing taxonomy for you, if specific taxonomic colum There are two ways to automate this process: -\strong{Method 1:} Using the , which is the preferred method. To use this method: +\strong{Method 1:} Using the option \code{\link[=AMR-options]{AMR_custom_mo}}, which is the preferred method. To use this method: \enumerate{ \item Create a data set in the structure of the \link{microorganisms} data set (containing at the very least column "genus") and save it with \code{\link[=saveRDS]{saveRDS()}} to a location of choice, e.g. \code{"~/my_custom_mo.rds"}, or any remote location. \item Set the file location to the \code{AMR_custom_mo} \R option: \code{options(AMR_custom_mo = "~/my_custom_mo.rds")}. This can even be a remote file location, such as an https URL. Since options are not saved between \R sessions, it is best to save this option to the \code{.Rprofile} file so that it will be loaded on start-up of \R. To do this, open the \code{.Rprofile} file using e.g. \code{utils::file.edit("~/.Rprofile")}, add this text and save the file: diff --git a/man/age_groups.Rd b/man/age_groups.Rd index aa529535a..2e675ea86 100755 --- a/man/age_groups.Rd +++ b/man/age_groups.Rd @@ -62,7 +62,7 @@ if (require("dplyr") && require("ggplot2")) { filter(mo == as.mo("Escherichia coli")) \%>\% group_by(age_group = age_groups(age)) \%>\% select(age_group, CIP) \%>\% - ggplot_rsi( + ggplot_sir( x = "age_group", minimum = 0, x.title = "Age Group", diff --git a/man/antibiotic_class_selectors.Rd b/man/antibiotic_class_selectors.Rd index 39e75635f..df584cbed 100755 --- a/man/antibiotic_class_selectors.Rd +++ b/man/antibiotic_class_selectors.Rd @@ -34,66 +34,66 @@ \alias{not_intrinsic_resistant} \title{Antibiotic Selectors} \usage{ -ab_class(ab_class, only_rsi_columns = FALSE, only_treatable = TRUE, ...) +ab_class(ab_class, only_sir_columns = FALSE, only_treatable = TRUE, ...) -ab_selector(filter, only_rsi_columns = FALSE, only_treatable = TRUE, ...) +ab_selector(filter, only_sir_columns = FALSE, only_treatable = TRUE, ...) -aminoglycosides(only_rsi_columns = FALSE, only_treatable = TRUE, ...) +aminoglycosides(only_sir_columns = FALSE, only_treatable = TRUE, ...) -aminopenicillins(only_rsi_columns = FALSE, ...) +aminopenicillins(only_sir_columns = FALSE, ...) -antifungals(only_rsi_columns = FALSE, ...) +antifungals(only_sir_columns = FALSE, ...) -antimycobacterials(only_rsi_columns = FALSE, ...) +antimycobacterials(only_sir_columns = FALSE, ...) -betalactams(only_rsi_columns = FALSE, only_treatable = TRUE, ...) +betalactams(only_sir_columns = FALSE, only_treatable = TRUE, ...) -carbapenems(only_rsi_columns = FALSE, only_treatable = TRUE, ...) +carbapenems(only_sir_columns = FALSE, only_treatable = TRUE, ...) -cephalosporins(only_rsi_columns = FALSE, ...) +cephalosporins(only_sir_columns = FALSE, ...) -cephalosporins_1st(only_rsi_columns = FALSE, ...) +cephalosporins_1st(only_sir_columns = FALSE, ...) -cephalosporins_2nd(only_rsi_columns = FALSE, ...) +cephalosporins_2nd(only_sir_columns = FALSE, ...) -cephalosporins_3rd(only_rsi_columns = FALSE, ...) +cephalosporins_3rd(only_sir_columns = FALSE, ...) -cephalosporins_4th(only_rsi_columns = FALSE, ...) +cephalosporins_4th(only_sir_columns = FALSE, ...) -cephalosporins_5th(only_rsi_columns = FALSE, ...) +cephalosporins_5th(only_sir_columns = FALSE, ...) -fluoroquinolones(only_rsi_columns = FALSE, ...) +fluoroquinolones(only_sir_columns = FALSE, ...) -glycopeptides(only_rsi_columns = FALSE, ...) +glycopeptides(only_sir_columns = FALSE, ...) -lincosamides(only_rsi_columns = FALSE, ...) +lincosamides(only_sir_columns = FALSE, ...) -lipoglycopeptides(only_rsi_columns = FALSE, ...) +lipoglycopeptides(only_sir_columns = FALSE, ...) -macrolides(only_rsi_columns = FALSE, ...) +macrolides(only_sir_columns = FALSE, ...) -oxazolidinones(only_rsi_columns = FALSE, ...) +oxazolidinones(only_sir_columns = FALSE, ...) -penicillins(only_rsi_columns = FALSE, ...) +penicillins(only_sir_columns = FALSE, ...) -polymyxins(only_rsi_columns = FALSE, only_treatable = TRUE, ...) +polymyxins(only_sir_columns = FALSE, only_treatable = TRUE, ...) -streptogramins(only_rsi_columns = FALSE, ...) +streptogramins(only_sir_columns = FALSE, ...) -quinolones(only_rsi_columns = FALSE, ...) +quinolones(only_sir_columns = FALSE, ...) -tetracyclines(only_rsi_columns = FALSE, ...) +tetracyclines(only_sir_columns = FALSE, ...) -trimethoprims(only_rsi_columns = FALSE, ...) +trimethoprims(only_sir_columns = FALSE, ...) -ureidopenicillins(only_rsi_columns = FALSE, ...) +ureidopenicillins(only_sir_columns = FALSE, ...) -administrable_per_os(only_rsi_columns = FALSE, ...) +administrable_per_os(only_sir_columns = FALSE, ...) -administrable_iv(only_rsi_columns = FALSE, ...) +administrable_iv(only_sir_columns = FALSE, ...) not_intrinsic_resistant( - only_rsi_columns = FALSE, + only_sir_columns = FALSE, col_mo = NULL, version_expertrules = 3.3, ... @@ -102,7 +102,7 @@ not_intrinsic_resistant( \arguments{ \item{ab_class}{an antimicrobial class or a part of it, such as \code{"carba"} and \code{"carbapenems"}. The columns \code{group}, \code{atc_group1} and \code{atc_group2} of the \link{antibiotics} data set will be searched (case-insensitive) for this value.} -\item{only_rsi_columns}{a \link{logical} to indicate whether only columns of class \code{rsi} must be selected (defaults to \code{FALSE}), see \code{\link[=as.rsi]{as.rsi()}}} +\item{only_sir_columns}{a \link{logical} to indicate whether only columns of class \code{sir} must be selected (defaults to \code{FALSE}), see \code{\link[=as.sir]{as.sir()}}} \item{only_treatable}{a \link{logical} to indicate whether antimicrobial drugs should be excluded that are only for laboratory tests (defaults to \code{TRUE}), such as gentamicin-high (\code{GEH}) and imipenem/EDTA (\code{IPE})} @@ -166,7 +166,7 @@ The \code{\link[=not_intrinsic_resistant]{not_intrinsic_resistant()}} function c \section{Reference Data Publicly Available}{ -All data sets in this \code{AMR} package (about microorganisms, antibiotics, R/SI interpretation, EUCAST rules, etc.) are publicly and freely available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. We also provide tab-separated plain text files that are machine-readable and suitable for input in any software program, such as laboratory information systems. Please visit \href{https://msberends.github.io/AMR/articles/datasets.html}{our website for the download links}. The actual files are of course available on \href{https://github.com/msberends/AMR/tree/main/data-raw}{our GitHub repository}. +All data sets in this \code{AMR} package (about microorganisms, antibiotics, SIR interpretation, EUCAST rules, etc.) are publicly and freely available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. We also provide tab-separated plain text files that are machine-readable and suitable for input in any software program, such as laboratory information systems. Please visit \href{https://msberends.github.io/AMR/articles/datasets.html}{our website for the download links}. The actual files are of course available on \href{https://github.com/msberends/AMR/tree/main/data-raw}{our GitHub repository}. } \examples{ diff --git a/man/as.ab.Rd b/man/as.ab.Rd index 0e9462a58..2cce65e3b 100755 --- a/man/as.ab.Rd +++ b/man/as.ab.Rd @@ -62,7 +62,7 @@ The WHOCC is located in Oslo at the Norwegian Institute of Public Health and fun \section{Reference Data Publicly Available}{ -All data sets in this \code{AMR} package (about microorganisms, antibiotics, R/SI interpretation, EUCAST rules, etc.) are publicly and freely available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. We also provide tab-separated plain text files that are machine-readable and suitable for input in any software program, such as laboratory information systems. Please visit \href{https://msberends.github.io/AMR/articles/datasets.html}{our website for the download links}. The actual files are of course available on \href{https://github.com/msberends/AMR/tree/main/data-raw}{our GitHub repository}. +All data sets in this \code{AMR} package (about microorganisms, antibiotics, SIR interpretation, EUCAST rules, etc.) are publicly and freely available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. We also provide tab-separated plain text files that are machine-readable and suitable for input in any software program, such as laboratory information systems. Please visit \href{https://msberends.github.io/AMR/articles/datasets.html}{our website for the download links}. The actual files are of course available on \href{https://github.com/msberends/AMR/tree/main/data-raw}{our GitHub repository}. } \examples{ @@ -92,9 +92,9 @@ ab_name("eryt") \donttest{ if (require("dplyr")) { - # you can quickly rename 'rsi' columns using set_ab_names() with dplyr: + # you can quickly rename 'sir' columns using set_ab_names() with dplyr: example_isolates \%>\% - set_ab_names(where(is.rsi), property = "atc") + set_ab_names(where(is.sir), property = "atc") } } } diff --git a/man/as.av.Rd b/man/as.av.Rd index 8a0967811..ad5cdeea1 100755 --- a/man/as.av.Rd +++ b/man/as.av.Rd @@ -60,7 +60,7 @@ The WHOCC is located in Oslo at the Norwegian Institute of Public Health and fun \section{Reference Data Publicly Available}{ -All data sets in this \code{AMR} package (about microorganisms, antibiotics, R/SI interpretation, EUCAST rules, etc.) are publicly and freely available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. We also provide tab-separated plain text files that are machine-readable and suitable for input in any software program, such as laboratory information systems. Please visit \href{https://msberends.github.io/AMR/articles/datasets.html}{our website for the download links}. The actual files are of course available on \href{https://github.com/msberends/AMR/tree/main/data-raw}{our GitHub repository}. +All data sets in this \code{AMR} package (about microorganisms, antibiotics, SIR interpretation, EUCAST rules, etc.) are publicly and freely available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. We also provide tab-separated plain text files that are machine-readable and suitable for input in any software program, such as laboratory information systems. Please visit \href{https://msberends.github.io/AMR/articles/datasets.html}{our website for the download links}. The actual files are of course available on \href{https://github.com/msberends/AMR/tree/main/data-raw}{our GitHub repository}. } \examples{ diff --git a/man/as.disk.Rd b/man/as.disk.Rd index 848771f11..eddf10db9 100755 --- a/man/as.disk.Rd +++ b/man/as.disk.Rd @@ -29,7 +29,7 @@ An \link{integer} with additional class \code{\link{disk}} This transforms a vector to a new class \code{\link{disk}}, which is a disk diffusion growth zone size (around an antibiotic disk) in millimetres between 6 and 50. } \details{ -Interpret disk values as RSI values with \code{\link[=as.rsi]{as.rsi()}}. It supports guidelines from EUCAST and CLSI. +Interpret disk values as SIR values with \code{\link[=as.sir]{as.sir()}}. It supports guidelines from EUCAST and CLSI. Disk diffusion growth zone sizes must be between 6 and 50 millimetres. Values higher than 50 but lower than 100 will be maximised to 50. All others input values outside the 6-50 range will return \code{NA}. @@ -54,8 +54,8 @@ if (require("dplyr")) { } } -# interpret disk values, see ?as.rsi -as.rsi( +# interpret disk values, see ?as.sir +as.sir( x = as.disk(18), mo = "Strep pneu", # `mo` will be coerced with as.mo() ab = "ampicillin", # and `ab` with as.ab() @@ -63,9 +63,9 @@ as.rsi( ) # interpret whole data set, pretend to be all from urinary tract infections: -as.rsi(df, uti = TRUE) +as.sir(df, uti = TRUE) } \seealso{ -\code{\link[=as.rsi]{as.rsi()}} +\code{\link[=as.sir]{as.sir()}} } \keyword{datasets} diff --git a/man/as.mic.Rd b/man/as.mic.Rd index 390999ce1..d46347edf 100755 --- a/man/as.mic.Rd +++ b/man/as.mic.Rd @@ -33,7 +33,7 @@ Ordered \link{factor} with additional class \code{\link{mic}}, that in mathemati This transforms vectors to a new class \code{\link{mic}}, which treats the input as decimal numbers, while maintaining operators (such as ">=") and only allowing valid MIC values known to the field of (medical) microbiology. } \details{ -To interpret MIC values as RSI values, use \code{\link[=as.rsi]{as.rsi()}} on MIC values. It supports guidelines from EUCAST (2013-2022) and CLSI (2013-2022). +To interpret MIC values as SIR values, use \code{\link[=as.sir]{as.sir()}} on MIC values. It supports guidelines from EUCAST (2013-2022) and CLSI (2013-2022). This class for MIC values is a quite a special data type: formally it is an ordered \link{factor} with valid MIC values as \link{factor} levels (to make sure only valid MIC values are retained), but for any mathematical operation it acts as decimal numbers: @@ -82,7 +82,7 @@ mic_data <- as.mic(c(">=32", "1.0", "1", "1.00", 8, "<=0.128", "8", "16", "16")) mic_data is.mic(mic_data) -# this can also coerce combined MIC/RSI values: +# this can also coerce combined MIC/SIR values: as.mic("<=0.002; S") # mathematical processing treats MICs as numeric values @@ -91,13 +91,13 @@ quantile(mic_data) all(mic_data < 512) # interpret MIC values -as.rsi( +as.sir( x = as.mic(2), mo = as.mo("Streptococcus pneumoniae"), ab = "AMX", guideline = "EUCAST" ) -as.rsi( +as.sir( x = as.mic(c(0.01, 2, 4, 8)), mo = as.mo("Streptococcus pneumoniae"), ab = "AMX", @@ -119,6 +119,6 @@ if (require("ggplot2")) { } } \seealso{ -\code{\link[=as.rsi]{as.rsi()}} +\code{\link[=as.sir]{as.sir()}} } \keyword{datasets} diff --git a/man/as.mo.Rd b/man/as.mo.Rd index cad7f4aba..88de3b72a 100755 --- a/man/as.mo.Rd +++ b/man/as.mo.Rd @@ -167,7 +167,7 @@ All matches are sorted descending on their matching score and for all user input \section{Reference Data Publicly Available}{ -All data sets in this \code{AMR} package (about microorganisms, antibiotics, R/SI interpretation, EUCAST rules, etc.) are publicly and freely available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. We also provide tab-separated plain text files that are machine-readable and suitable for input in any software program, such as laboratory information systems. Please visit \href{https://msberends.github.io/AMR/articles/datasets.html}{our website for the download links}. The actual files are of course available on \href{https://github.com/msberends/AMR/tree/main/data-raw}{our GitHub repository}. +All data sets in this \code{AMR} package (about microorganisms, antibiotics, SIR interpretation, EUCAST rules, etc.) are publicly and freely available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. We also provide tab-separated plain text files that are machine-readable and suitable for input in any software program, such as laboratory information systems. Please visit \href{https://msberends.github.io/AMR/articles/datasets.html}{our website for the download links}. The actual files are of course available on \href{https://github.com/msberends/AMR/tree/main/data-raw}{our GitHub repository}. } \examples{ diff --git a/man/as.rsi.Rd b/man/as.sir.Rd old mode 100755 new mode 100644 similarity index 61% rename from man/as.rsi.Rd rename to man/as.sir.Rd index c8cd5d6aa..517a69a7c --- a/man/as.rsi.Rd +++ b/man/as.sir.Rd @@ -1,19 +1,19 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/rsi.R +% Please edit documentation in R/sir.R \docType{data} -\name{as.rsi} -\alias{as.rsi} -\alias{rsi} -\alias{NA_rsi_} -\alias{is.rsi} -\alias{is.rsi.eligible} -\alias{as.rsi.mic} -\alias{as.rsi.disk} -\alias{as.rsi.data.frame} -\alias{rsi_interpretation_history} -\title{Interpret MIC and Disk Values, or Clean Raw R/SI Data} +\name{as.sir} +\alias{as.sir} +\alias{sir} +\alias{NA_sir_} +\alias{is.sir} +\alias{is_sir_eligible} +\alias{as.sir.mic} +\alias{as.sir.disk} +\alias{as.sir.data.frame} +\alias{sir_interpretation_history} +\title{Translate MIC and Disk Diffusion to SIR, or Clean Existing SIR Data} \format{ -An object of class \code{rsi} (inherits from \code{ordered}, \code{factor}) of length 1. +An object of class \code{sir} (inherits from \code{ordered}, \code{factor}) of length 1. } \source{ For interpretations of minimum inhibitory concentration (MIC) values and disk diffusion diameters: @@ -24,15 +24,15 @@ For interpretations of minimum inhibitory concentration (MIC) values and disk di } } \usage{ -as.rsi(x, ...) +as.sir(x, ...) -NA_rsi_ +NA_sir_ -is.rsi(x) +is.sir(x) -is.rsi.eligible(x, threshold = 0.05) +is_sir_eligible(x, threshold = 0.05) -\method{as.rsi}{mic}( +\method{as.sir}{mic}( x, mo = NULL, ab = deparse(substitute(x)), @@ -40,22 +40,22 @@ is.rsi.eligible(x, threshold = 0.05) uti = NULL, conserve_capped_values = FALSE, add_intrinsic_resistance = FALSE, - reference_data = AMR::rsi_translation, + reference_data = AMR::clinical_breakpoints, ... ) -\method{as.rsi}{disk}( +\method{as.sir}{disk}( x, mo = NULL, ab = deparse(substitute(x)), guideline = getOption("AMR_guideline", "EUCAST"), uti = NULL, add_intrinsic_resistance = FALSE, - reference_data = AMR::rsi_translation, + reference_data = AMR::clinical_breakpoints, ... ) -\method{as.rsi}{data.frame}( +\method{as.sir}{data.frame}( x, ..., col_mo = NULL, @@ -63,15 +63,15 @@ is.rsi.eligible(x, threshold = 0.05) uti = NULL, conserve_capped_values = FALSE, add_intrinsic_resistance = FALSE, - reference_data = AMR::rsi_translation + reference_data = AMR::clinical_breakpoints ) -rsi_interpretation_history(clean = FALSE) +sir_interpretation_history(clean = FALSE) } \arguments{ \item{x}{vector of values (for class \code{\link{mic}}: MIC values in mg/L, for class \code{\link{disk}}: a disk diffusion radius in millimetres)} -\item{...}{for using on a \link{data.frame}: names of columns to apply \code{\link[=as.rsi]{as.rsi()}} on (supports tidy selection such as \code{column1:column4}). Otherwise: arguments passed on to methods.} +\item{...}{for using on a \link{data.frame}: names of columns to apply \code{\link[=as.sir]{as.sir()}} on (supports tidy selection such as \code{column1:column4}). Otherwise: arguments passed on to methods.} \item{threshold}{maximum fraction of invalid antimicrobial interpretations of \code{x}, see \emph{Examples}} @@ -79,53 +79,53 @@ rsi_interpretation_history(clean = FALSE) \item{ab}{any (vector of) text that can be coerced to a valid antimicrobial drug code with \code{\link[=as.ab]{as.ab()}}} -\item{guideline}{defaults to EUCAST 2022 (the latest implemented EUCAST guideline in the \link{rsi_translation} data set), but can be set with the \link[=options]{option} \code{AMR_guideline}. Supports EUCAST (2013-2022) and CLSI (2013-2022), see \emph{Details}.} +\item{guideline}{defaults to EUCAST 2022 (the latest implemented EUCAST guideline in the \link{clinical_breakpoints} data set), but can be set with the \link[=options]{option} \code{AMR_guideline}. Supports EUCAST (2013-2022) and CLSI (2013-2022), see \emph{Details}.} -\item{uti}{(Urinary Tract Infection) A vector with \link{logical}s (\code{TRUE} or \code{FALSE}) to specify whether a UTI specific interpretation from the guideline should be chosen. For using \code{\link[=as.rsi]{as.rsi()}} on a \link{data.frame}, this can also be a column containing \link{logical}s or when left blank, the data set will be searched for a column 'specimen', and rows within this column containing 'urin' (such as 'urine', 'urina') will be regarded isolates from a UTI. See \emph{Examples}.} +\item{uti}{(Urinary Tract Infection) A vector with \link{logical}s (\code{TRUE} or \code{FALSE}) to specify whether a UTI specific interpretation from the guideline should be chosen. For using \code{\link[=as.sir]{as.sir()}} on a \link{data.frame}, this can also be a column containing \link{logical}s or when left blank, the data set will be searched for a column 'specimen', and rows within this column containing 'urin' (such as 'urine', 'urina') will be regarded isolates from a UTI. See \emph{Examples}.} \item{conserve_capped_values}{a \link{logical} to indicate that MIC values starting with \code{">"} (but not \code{">="}) must always return "R" , and that MIC values starting with \code{"<"} (but not \code{"<="}) must always return "S"} \item{add_intrinsic_resistance}{\emph{(only useful when using a EUCAST guideline)} a \link{logical} to indicate whether intrinsic antibiotic resistance must also be considered for applicable bug-drug combinations, meaning that e.g. ampicillin will always return "R" in \emph{Klebsiella} species. Determination is based on the \link{intrinsic_resistant} data set, that itself is based on \href{https://www.eucast.org/expert_rules_and_expected_phenotypes/}{'EUCAST Expert Rules' and 'EUCAST Intrinsic Resistance and Unusual Phenotypes' v3.3} (2021).} -\item{reference_data}{a \link{data.frame} to be used for interpretation, which defaults to the \link{rsi_translation} data set. Changing this argument allows for using own interpretation guidelines. This argument must contain a data set that is equal in structure to the \link{rsi_translation} data set (same column names and column types). Please note that the \code{guideline} argument will be ignored when \code{reference_data} is manually set.} +\item{reference_data}{a \link{data.frame} to be used for interpretation, which defaults to the \link{clinical_breakpoints} data set. Changing this argument allows for using own interpretation guidelines. This argument must contain a data set that is equal in structure to the \link{clinical_breakpoints} data set (same column names and column types). Please note that the \code{guideline} argument will be ignored when \code{reference_data} is manually set.} \item{col_mo}{column name of the IDs of the microorganisms (see \code{\link[=as.mo]{as.mo()}}), defaults to the first column of class \code{\link{mo}}. Values will be coerced using \code{\link[=as.mo]{as.mo()}}.} \item{clean}{a \link{logical} to indicate whether previously stored results should be forgotten after returning the 'logbook' with results} } \value{ -Ordered \link{factor} with new class \code{rsi} +Ordered \link{factor} with new class \code{sir} } \description{ -Interpret minimum inhibitory concentration (MIC) values and disk diffusion diameters according to EUCAST or CLSI, or clean up existing R/SI values. This transforms the input to a new class \code{\link{rsi}}, which is an ordered \link{factor} with levels \verb{S < I < R}. +Interpret minimum inhibitory concentration (MIC) values and disk diffusion diameters according to EUCAST or CLSI, or clean up existing SIR values. This transforms the input to a new class \code{\link{sir}}, which is an ordered \link{factor} with levels \verb{S < I < R}. } \details{ \subsection{How it Works}{ -The \code{\link[=as.rsi]{as.rsi()}} function works in four ways: +The \code{\link[=as.sir]{as.sir()}} function works in four ways: \enumerate{ -\item For \strong{cleaning raw / untransformed data}. The data will be cleaned to only contain values S, I and R and will try its best to determine this with some intelligence. For example, mixed values with R/SI interpretations and MIC values such as \code{"<0.25; S"} will be coerced to \code{"S"}. Combined interpretations for multiple test methods (as seen in laboratory records) such as \code{"S; S"} will be coerced to \code{"S"}, but a value like \code{"S; I"} will return \code{NA} with a warning that the input is unclear. +\item For \strong{cleaning raw / untransformed data}. The data will be cleaned to only contain values S, I and R and will try its best to determine this with some intelligence. For example, mixed values with SIR interpretations and MIC values such as \code{"<0.25; S"} will be coerced to \code{"S"}. Combined interpretations for multiple test methods (as seen in laboratory records) such as \code{"S; S"} will be coerced to \code{"S"}, but a value like \code{"S; I"} will return \code{NA} with a warning that the input is unclear. \item For \strong{interpreting minimum inhibitory concentration (MIC) values} according to EUCAST or CLSI. You must clean your MIC values first using \code{\link[=as.mic]{as.mic()}}, that also gives your columns the new data class \code{\link{mic}}. Also, be sure to have a column with microorganism names or codes. It will be found automatically, but can be set manually using the \code{mo} argument. \itemize{ -\item Using \code{dplyr}, R/SI interpretation can be done very easily with either: +\item Using \code{dplyr}, SIR interpretation can be done very easily with either: -\if{html}{\out{

}}\preformatted{your_data \%>\% mutate_if(is.mic, as.rsi) -your_data \%>\% mutate(across(where(is.mic), as.rsi)) +\if{html}{\out{
}}\preformatted{your_data \%>\% mutate_if(is.mic, as.sir) +your_data \%>\% mutate(across(where(is.mic), as.sir)) }\if{html}{\out{
}} \item Operators like "<=" will be stripped before interpretation. When using \code{conserve_capped_values = TRUE}, an MIC value of e.g. ">2" will always return "R", even if the breakpoint according to the chosen guideline is ">=4". This is to prevent that capped values from raw laboratory data would not be treated conservatively. The default behaviour (\code{conserve_capped_values = FALSE}) considers ">2" to be lower than ">=4" and might in this case return "S" or "I". } \item For \strong{interpreting disk diffusion diameters} according to EUCAST or CLSI. You must clean your disk zones first using \code{\link[=as.disk]{as.disk()}}, that also gives your columns the new data class \code{\link{disk}}. Also, be sure to have a column with microorganism names or codes. It will be found automatically, but can be set manually using the \code{mo} argument. \itemize{ -\item Using \code{dplyr}, R/SI interpretation can be done very easily with either: +\item Using \code{dplyr}, SIR interpretation can be done very easily with either: -\if{html}{\out{
}}\preformatted{your_data \%>\% mutate_if(is.disk, as.rsi) -your_data \%>\% mutate(across(where(is.disk), as.rsi)) +\if{html}{\out{
}}\preformatted{your_data \%>\% mutate_if(is.disk, as.sir) +your_data \%>\% mutate(across(where(is.disk), as.sir)) }\if{html}{\out{
}} } -\item For \strong{interpreting a complete data set}, with automatic determination of MIC values, disk diffusion diameters, microorganism names or codes, and antimicrobial test results. This is done very simply by running \code{as.rsi(your_data)}. +\item For \strong{interpreting a complete data set}, with automatic determination of MIC values, disk diffusion diameters, microorganism names or codes, and antimicrobial test results. This is done very simply by running \code{as.sir(your_data)}. } -For points 2, 3 and 4: Use \code{\link[=rsi_interpretation_history]{rsi_interpretation_history()}} to retrieve a \link{data.frame} (or \link[tibble:tibble]{tibble} if the \code{tibble} package is installed) with all results of the last \code{\link[=as.rsi]{as.rsi()}} call. +For points 2, 3 and 4: Use \code{\link[=sir_interpretation_history]{sir_interpretation_history()}} to retrieve a \link{data.frame} (or \link[tibble:tibble]{tibble} if the \code{tibble} package is installed) with all results of the last \code{\link[=as.sir]{as.sir()}} call. } \subsection{Supported Guidelines}{ @@ -146,33 +146,36 @@ You can set the default guideline with the \code{AMR_guideline} \link[=options]{ \subsection{After Interpretation}{ -After using \code{\link[=as.rsi]{as.rsi()}}, you can use the \code{\link[=eucast_rules]{eucast_rules()}} defined by EUCAST to (1) apply inferred susceptibility and resistance based on results of other antimicrobials and (2) apply intrinsic resistance based on taxonomic properties of a microorganism. +After using \code{\link[=as.sir]{as.sir()}}, you can use the \code{\link[=eucast_rules]{eucast_rules()}} defined by EUCAST to (1) apply inferred susceptibility and resistance based on results of other antimicrobials and (2) apply intrinsic resistance based on taxonomic properties of a microorganism. } \subsection{Machine-Readable Interpretation Guidelines}{ -The repository of this package \href{https://github.com/msberends/AMR/blob/main/data-raw/rsi_translation.txt}{contains a machine-readable version} of all guidelines. This is a CSV file consisting of 18,308 rows and 11 columns. This file is machine-readable, since it contains one row for every unique combination of the test method (MIC or disk diffusion), the antimicrobial drug and the microorganism. \strong{This allows for easy implementation of these rules in laboratory information systems (LIS)}. Note that it only contains interpretation guidelines for humans - interpretation guidelines from CLSI for animals were removed. +The repository of this package \href{https://github.com/msberends/AMR/blob/main/data-raw/clinical_breakpoints.txt}{contains a machine-readable version} of all guidelines. This is a CSV file consisting of 18,308 rows and 11 columns. This file is machine-readable, since it contains one row for every unique combination of the test method (MIC or disk diffusion), the antimicrobial drug and the microorganism. \strong{This allows for easy implementation of these rules in laboratory information systems (LIS)}. Note that it only contains interpretation guidelines for humans - interpretation guidelines from CLSI for animals were removed. } \subsection{Other}{ -The function \code{\link[=is.rsi]{is.rsi()}} detects if the input contains class \code{rsi}. If the input is a \link{data.frame}, it iterates over all columns and returns a \link{logical} vector. +The function \code{\link[=is.sir]{is.sir()}} detects if the input contains class \code{sir}. If the input is a \link{data.frame}, it iterates over all columns and returns a \link{logical} vector. -The function \code{\link[=is.rsi.eligible]{is.rsi.eligible()}} returns \code{TRUE} when a columns contains at most 5\% invalid antimicrobial interpretations (not S and/or I and/or R), and \code{FALSE} otherwise. The threshold of 5\% can be set with the \code{threshold} argument. If the input is a \link{data.frame}, it iterates over all columns and returns a \link{logical} vector. +The function \code{\link[=is_sir_eligible]{is_sir_eligible()}} returns \code{TRUE} when a columns contains at most 5\% invalid antimicrobial interpretations (not S and/or I and/or R), and \code{FALSE} otherwise. The threshold of 5\% can be set with the \code{threshold} argument. If the input is a \link{data.frame}, it iterates over all columns and returns a \link{logical} vector. } -\code{NA_rsi_} is a missing value of the new \code{rsi} class, analogous to e.g. base \R's \code{\link[base:NA]{NA_character_}}. +\code{NA_sir_} is a missing value of the new \code{sir} class, analogous to e.g. base \R's \code{\link[base:NA]{NA_character_}}. } -\section{Interpretation of R and S/I}{ +\section{Interpretation of SIR}{ -In 2019, the European Committee on Antimicrobial Susceptibility Testing (EUCAST) has decided to change the definitions of susceptibility testing categories R and S/I as shown below (\url{https://www.eucast.org/newsiandr/}). +In 2019, the European Committee on Antimicrobial Susceptibility Testing (EUCAST) has decided to change the definitions of susceptibility testing categories S, I, and R as shown below (\url{https://www.eucast.org/newsiandr/}): \itemize{ +\item \strong{S - Susceptible, standard dosing regimen}\cr +A microorganism is categorised as "Susceptible, standard dosing regimen", when there is a high likelihood of therapeutic success using a standard dosing regimen of the agent. +\item \strong{I - Susceptible, increased exposure} \emph{\cr +A microorganism is categorised as "Susceptible, Increased exposure}" when there is a high likelihood of therapeutic success because exposure to the agent is increased by adjusting the dosing regimen or by its concentration at the site of infection. \item \strong{R = Resistant}\cr -A microorganism is categorised as \emph{Resistant} when there is a high likelihood of therapeutic failure even when there is increased exposure. Exposure is a function of how the mode of administration, dose, dosing interval, infusion time, as well as distribution and excretion of the antimicrobial agent will influence the infecting organism at the site of infection. -\item \strong{S = Susceptible}\cr -A microorganism is categorised as \emph{Susceptible, standard dosing regimen}, when there is a high likelihood of therapeutic success using a standard dosing regimen of the agent. -\item \strong{I = Susceptible, Increased exposure}\cr -A microorganism is categorised as \emph{Susceptible, Increased exposure} when there is a high likelihood of therapeutic success because exposure to the agent is increased by adjusting the dosing regimen or by its concentration at the site of infection. +A microorganism is categorised as "Resistant" when there is a high likelihood of therapeutic failure even when there is increased exposure. +\itemize{ +\item \emph{Exposure} is a function of how the mode of administration, dose, dosing interval, infusion time, as well as distribution and excretion of the antimicrobial agent will influence the infecting organism at the site of infection. +} } This AMR package honours this insight. Use \code{\link[=susceptibility]{susceptibility()}} (equal to \code{\link[=proportion_SI]{proportion_SI()}}) to determine antimicrobial susceptibility and \code{\link[=count_susceptible]{count_susceptible()}} (equal to \code{\link[=count_SI]{count_SI()}}) to count susceptible isolates. @@ -180,12 +183,12 @@ This AMR package honours this insight. Use \code{\link[=susceptibility]{suscepti \section{Reference Data Publicly Available}{ -All data sets in this \code{AMR} package (about microorganisms, antibiotics, R/SI interpretation, EUCAST rules, etc.) are publicly and freely available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. We also provide tab-separated plain text files that are machine-readable and suitable for input in any software program, such as laboratory information systems. Please visit \href{https://msberends.github.io/AMR/articles/datasets.html}{our website for the download links}. The actual files are of course available on \href{https://github.com/msberends/AMR/tree/main/data-raw}{our GitHub repository}. +All data sets in this \code{AMR} package (about microorganisms, antibiotics, SIR interpretation, EUCAST rules, etc.) are publicly and freely available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. We also provide tab-separated plain text files that are machine-readable and suitable for input in any software program, such as laboratory information systems. Please visit \href{https://msberends.github.io/AMR/articles/datasets.html}{our website for the download links}. The actual files are of course available on \href{https://github.com/msberends/AMR/tree/main/data-raw}{our GitHub repository}. } \examples{ example_isolates -summary(example_isolates) # see all R/SI results at a glance +summary(example_isolates) # see all SIR results at a glance # For INTERPRETING disk diffusion and MIC values ----------------------- @@ -198,20 +201,20 @@ df <- data.frame( TOB = as.disk(16), ERY = "R" ) -as.rsi(df) +as.sir(df) # return a 'logbook' about the results: -rsi_interpretation_history() +sir_interpretation_history() # for single values -as.rsi( +as.sir( x = as.mic(2), mo = as.mo("S. pneumoniae"), ab = "AMP", guideline = "EUCAST" ) -as.rsi( +as.sir( x = as.disk(18), mo = "Strep pneu", # `mo` will be coerced with as.mo() ab = "ampicillin", # and `ab` with as.ab() @@ -221,14 +224,14 @@ as.rsi( \donttest{ # the dplyr way if (require("dplyr")) { - df \%>\% mutate_if(is.mic, as.rsi) - df \%>\% mutate_if(function(x) is.mic(x) | is.disk(x), as.rsi) - df \%>\% mutate(across(where(is.mic), as.rsi)) - df \%>\% mutate_at(vars(AMP:TOB), as.rsi) - df \%>\% mutate(across(AMP:TOB, as.rsi)) + df \%>\% mutate_if(is.mic, as.sir) + df \%>\% mutate_if(function(x) is.mic(x) | is.disk(x), as.sir) + df \%>\% mutate(across(where(is.mic), as.sir)) + df \%>\% mutate_at(vars(AMP:TOB), as.sir) + df \%>\% mutate(across(AMP:TOB, as.sir)) df \%>\% - mutate_at(vars(AMP:TOB), as.rsi, mo = .$microorganism) + mutate_at(vars(AMP:TOB), as.sir, mo = .$microorganism) # to include information about urinary tract infections (UTI) data.frame( @@ -236,43 +239,43 @@ if (require("dplyr")) { NIT = c("<= 2", 32), from_the_bladder = c(TRUE, FALSE) ) \%>\% - as.rsi(uti = "from_the_bladder") + as.sir(uti = "from_the_bladder") data.frame( mo = "E. coli", NIT = c("<= 2", 32), specimen = c("urine", "blood") ) \%>\% - as.rsi() # automatically determines urine isolates + as.sir() # automatically determines urine isolates df \%>\% - mutate_at(vars(AMP:TOB), as.rsi, mo = "E. coli", uti = TRUE) + mutate_at(vars(AMP:TOB), as.sir, mo = "E. coli", uti = TRUE) } -# For CLEANING existing R/SI values ------------------------------------ +# For CLEANING existing SIR values ------------------------------------ -as.rsi(c("S", "I", "R", "A", "B", "C")) -as.rsi("<= 0.002; S") # will return "S" -rsi_data <- as.rsi(c(rep("S", 474), rep("I", 36), rep("R", 370))) -is.rsi(rsi_data) -plot(rsi_data) # for percentages -barplot(rsi_data) # for frequencies +as.sir(c("S", "I", "R", "A", "B", "C")) +as.sir("<= 0.002; S") # will return "S" +sir_data <- as.sir(c(rep("S", 474), rep("I", 36), rep("R", 370))) +is.sir(sir_data) +plot(sir_data) # for percentages +barplot(sir_data) # for frequencies # the dplyr way if (require("dplyr")) { example_isolates \%>\% - mutate_at(vars(PEN:RIF), as.rsi) + mutate_at(vars(PEN:RIF), as.sir) # same: example_isolates \%>\% - as.rsi(PEN:RIF) + as.sir(PEN:RIF) - # fastest way to transform all columns with already valid AMR results to class `rsi`: + # fastest way to transform all columns with already valid AMR results to class `sir`: example_isolates \%>\% - mutate_if(is.rsi.eligible, as.rsi) + mutate_if(is_sir_eligible, as.sir) # since dplyr 1.0.0, this can also be: # example_isolates \%>\% - # mutate(across(where(is.rsi.eligible), as.rsi)) + # mutate(across(where(is_sir_eligible), as.sir)) } } } diff --git a/man/av_property.Rd b/man/av_property.Rd index 0874891c9..a8cb9e842 100755 --- a/man/av_property.Rd +++ b/man/av_property.Rd @@ -79,7 +79,7 @@ European Commission Public Health PHARMACEUTICALS - COMMUNITY REGISTER: \url{htt \section{Reference Data Publicly Available}{ -All data sets in this \code{AMR} package (about microorganisms, antibiotics, R/SI interpretation, EUCAST rules, etc.) are publicly and freely available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. We also provide tab-separated plain text files that are machine-readable and suitable for input in any software program, such as laboratory information systems. Please visit \href{https://msberends.github.io/AMR/articles/datasets.html}{our website for the download links}. The actual files are of course available on \href{https://github.com/msberends/AMR/tree/main/data-raw}{our GitHub repository}. +All data sets in this \code{AMR} package (about microorganisms, antibiotics, SIR interpretation, EUCAST rules, etc.) are publicly and freely available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. We also provide tab-separated plain text files that are machine-readable and suitable for input in any software program, such as laboratory information systems. Please visit \href{https://msberends.github.io/AMR/articles/datasets.html}{our website for the download links}. The actual files are of course available on \href{https://github.com/msberends/AMR/tree/main/data-raw}{our GitHub repository}. } \examples{ diff --git a/man/availability.Rd b/man/availability.Rd index 1da7df380..c4fe6dd7b 100755 --- a/man/availability.Rd +++ b/man/availability.Rd @@ -26,7 +26,7 @@ availability(example_isolates) if (require("dplyr")) { example_isolates \%>\% filter(mo == as.mo("Escherichia coli")) \%>\% - select_if(is.rsi) \%>\% + select_if(is.sir) \%>\% availability() } } diff --git a/man/rsi_translation.Rd b/man/clinical_breakpoints.Rd old mode 100755 new mode 100644 similarity index 79% rename from man/rsi_translation.Rd rename to man/clinical_breakpoints.Rd index 62917d5ce..63c800457 --- a/man/rsi_translation.Rd +++ b/man/clinical_breakpoints.Rd @@ -1,9 +1,9 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/data.R \docType{data} -\name{rsi_translation} -\alias{rsi_translation} -\title{Data Set for R/SI Interpretation} +\name{clinical_breakpoints} +\alias{clinical_breakpoints} +\title{Data Set with Clinical Breakpoints for SIR Interpretation} \format{ A \link[tibble:tibble]{tibble} with 18,308 observations and 11 variables: \itemize{ @@ -21,10 +21,10 @@ A \link[tibble:tibble]{tibble} with 18,308 observations and 11 variables: } } \usage{ -rsi_translation +clinical_breakpoints } \description{ -Data set containing reference data to interpret MIC and disk diffusion to R/SI values, according to international guidelines. Currently implemented guidelines are EUCAST (2013-2022) and CLSI (2013-2022). Use \code{\link[=as.rsi]{as.rsi()}} to transform MICs or disks measurements to R/SI values. +Data set containing clinical breakpoints to interpret MIC and disk diffusion to SIR values, according to international guidelines. Currently implemented guidelines are EUCAST (2013-2022) and CLSI (2013-2022). Use \code{\link[=as.sir]{as.sir()}} to transform MICs or disks measurements to SIR values. } \details{ Like all data sets in this package, this data set is publicly available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. Please visit \href{https://msberends.github.io/AMR/articles/datasets.html}{our website for the download links}. The actual files are of course available on \href{https://github.com/msberends/AMR/tree/main/data-raw}{our GitHub repository}. @@ -32,7 +32,7 @@ Like all data sets in this package, this data set is publicly available for down They \strong{allow for machine reading EUCAST and CLSI guidelines}, which is almost impossible with the MS Excel and PDF files distributed by EUCAST and CLSI. } \examples{ -rsi_translation +clinical_breakpoints } \seealso{ \link{intrinsic_resistant} diff --git a/man/count.Rd b/man/count.Rd index 2abc9344d..e2ca5c774 100755 --- a/man/count.Rd +++ b/man/count.Rd @@ -10,7 +10,7 @@ \alias{count_SI} \alias{count_S} \alias{count_all} -\alias{n_rsi} +\alias{n_sir} \alias{count_df} \title{Count Available Isolates} \usage{ @@ -30,7 +30,7 @@ count_S(..., only_all_tested = FALSE) count_all(..., only_all_tested = FALSE) -n_rsi(..., only_all_tested = FALSE) +n_sir(..., only_all_tested = FALSE) count_df( data, @@ -40,11 +40,11 @@ count_df( ) } \arguments{ -\item{...}{one or more vectors (or columns) with antibiotic interpretations. They will be transformed internally with \code{\link[=as.rsi]{as.rsi()}} if needed.} +\item{...}{one or more vectors (or columns) with antibiotic interpretations. They will be transformed internally with \code{\link[=as.sir]{as.sir()}} if needed.} \item{only_all_tested}{(for combination therapies, i.e. using more than one variable for \code{...}): a \link{logical} to indicate that isolates must be tested for all antibiotics, see section \emph{Combination Therapy} below} -\item{data}{a \link{data.frame} containing columns with class \code{\link{rsi}} (see \code{\link[=as.rsi]{as.rsi()}})} +\item{data}{a \link{data.frame} containing columns with class \code{\link{sir}} (see \code{\link[=as.sir]{as.sir()}})} \item{translate_ab}{a column name of the \link{antibiotics} data set to translate the antibiotic abbreviations to, using \code{\link[=ab_property]{ab_property()}}} @@ -65,20 +65,23 @@ These functions are meant to count isolates. Use the \code{\link[=resistance]{re The function \code{\link[=count_resistant]{count_resistant()}} is equal to the function \code{\link[=count_R]{count_R()}}. The function \code{\link[=count_susceptible]{count_susceptible()}} is equal to the function \code{\link[=count_SI]{count_SI()}}. -The function \code{\link[=n_rsi]{n_rsi()}} is an alias of \code{\link[=count_all]{count_all()}}. They can be used to count all available isolates, i.e. where all input antibiotics have an available result (S, I or R). Their use is equal to \code{n_distinct()}. Their function is equal to \code{count_susceptible(...) + count_resistant(...)}. +The function \code{\link[=n_sir]{n_sir()}} is an alias of \code{\link[=count_all]{count_all()}}. They can be used to count all available isolates, i.e. where all input antibiotics have an available result (S, I or R). Their use is equal to \code{n_distinct()}. Their function is equal to \code{count_susceptible(...) + count_resistant(...)}. -The function \code{\link[=count_df]{count_df()}} takes any variable from \code{data} that has an \code{\link{rsi}} class (created with \code{\link[=as.rsi]{as.rsi()}}) and counts the number of S's, I's and R's. It also supports grouped variables. The function \code{\link[=rsi_df]{rsi_df()}} works exactly like \code{\link[=count_df]{count_df()}}, but adds the percentage of S, I and R. +The function \code{\link[=count_df]{count_df()}} takes any variable from \code{data} that has an \code{\link{sir}} class (created with \code{\link[=as.sir]{as.sir()}}) and counts the number of S's, I's and R's. It also supports grouped variables. The function \code{\link[=sir_df]{sir_df()}} works exactly like \code{\link[=count_df]{count_df()}}, but adds the percentage of S, I and R. } -\section{Interpretation of R and S/I}{ +\section{Interpretation of SIR}{ -In 2019, the European Committee on Antimicrobial Susceptibility Testing (EUCAST) has decided to change the definitions of susceptibility testing categories R and S/I as shown below (\url{https://www.eucast.org/newsiandr/}). +In 2019, the European Committee on Antimicrobial Susceptibility Testing (EUCAST) has decided to change the definitions of susceptibility testing categories S, I, and R as shown below (\url{https://www.eucast.org/newsiandr/}): \itemize{ +\item \strong{S - Susceptible, standard dosing regimen}\cr +A microorganism is categorised as "Susceptible, standard dosing regimen", when there is a high likelihood of therapeutic success using a standard dosing regimen of the agent. +\item \strong{I - Susceptible, increased exposure} \emph{\cr +A microorganism is categorised as "Susceptible, Increased exposure}" when there is a high likelihood of therapeutic success because exposure to the agent is increased by adjusting the dosing regimen or by its concentration at the site of infection. \item \strong{R = Resistant}\cr -A microorganism is categorised as \emph{Resistant} when there is a high likelihood of therapeutic failure even when there is increased exposure. Exposure is a function of how the mode of administration, dose, dosing interval, infusion time, as well as distribution and excretion of the antimicrobial agent will influence the infecting organism at the site of infection. -\item \strong{S = Susceptible}\cr -A microorganism is categorised as \emph{Susceptible, standard dosing regimen}, when there is a high likelihood of therapeutic success using a standard dosing regimen of the agent. -\item \strong{I = Susceptible, Increased exposure}\cr -A microorganism is categorised as \emph{Susceptible, Increased exposure} when there is a high likelihood of therapeutic success because exposure to the agent is increased by adjusting the dosing regimen or by its concentration at the site of infection. +A microorganism is categorised as "Resistant" when there is a high likelihood of therapeutic failure even when there is increased exposure. +\itemize{ +\item \emph{Exposure} is a function of how the mode of administration, dose, dosing interval, infusion time, as well as distribution and excretion of the antimicrobial agent will influence the infecting organism at the site of infection. +} } This AMR package honours this insight. Use \code{\link[=susceptibility]{susceptibility()}} (equal to \code{\link[=proportion_SI]{proportion_SI()}}) to determine antimicrobial susceptibility and \code{\link[=count_susceptible]{count_susceptible()}} (equal to \code{\link[=count_SI]{count_SI()}}) to count susceptible isolates. @@ -139,14 +142,14 @@ count_R(example_isolates$AMX) # Count all available isolates count_all(example_isolates$AMX) -n_rsi(example_isolates$AMX) +n_sir(example_isolates$AMX) -# n_rsi() is an alias of count_all(). +# n_sir() is an alias of count_all(). # Since it counts all available isolates, you can # calculate back to count e.g. susceptible isolates. # These results are the same: count_susceptible(example_isolates$AMX) -susceptibility(example_isolates$AMX) * n_rsi(example_isolates$AMX) +susceptibility(example_isolates$AMX) * n_sir(example_isolates$AMX) # dplyr ------------------------------------------------------------- \donttest{ @@ -158,7 +161,7 @@ if (require("dplyr")) { I = count_I(CIP), S = count_S(CIP), n1 = count_all(CIP), # the actual total; sum of all three - n2 = n_rsi(CIP), # same - analogous to n_distinct + n2 = n_sir(CIP), # same - analogous to n_distinct total = n() ) # NOT the number of tested isolates! @@ -166,7 +169,7 @@ if (require("dplyr")) { # (i.e., in this data set columns GEN, TOB, AMK, KAN) example_isolates \%>\% group_by(ward) \%>\% - summarise(across(aminoglycosides(), n_rsi)) + summarise(across(aminoglycosides(), n_sir)) # Count co-resistance between amoxicillin/clav acid and gentamicin, # so we can see that combination therapy does a lot more than mono therapy. diff --git a/man/custom_eucast_rules.Rd b/man/custom_eucast_rules.Rd index 55d425033..cb989bbed 100755 --- a/man/custom_eucast_rules.Rd +++ b/man/custom_eucast_rules.Rd @@ -43,9 +43,9 @@ These are two custom EUCAST rules: if TZP (piperacillin/tazobactam) is "S", all The rules (the part \emph{before} the tilde, in above example \code{TZP == "S"} and \code{TZP == "R"}) must be evaluable in your data set: it should be able to run as a filter in your data set without errors. This means for the above example that the column \code{TZP} must exist. We will create a sample data set and test the rules set: \if{html}{\out{
}}\preformatted{df <- data.frame(mo = c("Escherichia coli", "Klebsiella pneumoniae"), - TZP = as.rsi("R"), - ampi = as.rsi("S"), - cipro = as.rsi("S")) + TZP = as.sir("R"), + ampi = as.sir("S"), + cipro = as.sir("S")) df #> mo TZP ampi cipro #> 1 Escherichia coli R S S diff --git a/man/eucast_rules.Rd b/man/eucast_rules.Rd index eae346a2d..5880b55ae 100755 --- a/man/eucast_rules.Rd +++ b/man/eucast_rules.Rd @@ -28,7 +28,7 @@ eucast_rules( version_breakpoints = 12, version_expertrules = 3.3, ampc_cephalosporin_resistance = NA, - only_rsi_columns = FALSE, + only_sir_columns = FALSE, custom_rules = NULL, ... ) @@ -52,7 +52,7 @@ eucast_dosage(ab, administration = "iv", version_breakpoints = 12) \item{ampc_cephalosporin_resistance}{a \link{character} value that should be applied to cefotaxime, ceftriaxone and ceftazidime for AmpC de-repressed cephalosporin-resistant mutants, defaults to \code{NA}. Currently only works when \code{version_expertrules} is \code{3.2} and higher; these version of '\emph{EUCAST Expert Rules on Enterobacterales}' state that results of cefotaxime, ceftriaxone and ceftazidime should be reported with a note, or results should be suppressed (emptied) for these three drugs. A value of \code{NA} (the default) for this argument will remove results for these three drugs, while e.g. a value of \code{"R"} will make the results for these drugs resistant. Use \code{NULL} or \code{FALSE} to not alter results for these three drugs of AmpC de-repressed cephalosporin-resistant mutants. Using \code{TRUE} is equal to using \code{"R"}. \cr For \emph{EUCAST Expert Rules} v3.2, this rule applies to: \emph{Citrobacter braakii}, \emph{Citrobacter freundii}, \emph{Citrobacter gillenii}, \emph{Citrobacter murliniae}, \emph{Citrobacter rodenticum}, \emph{Citrobacter sedlakii}, \emph{Citrobacter werkmanii}, \emph{Citrobacter youngae}, \emph{Enterobacter}, \emph{Hafnia alvei}, \emph{Klebsiella aerogenes}, \emph{Morganella morganii}, \emph{Providencia} and \emph{Serratia}.} -\item{only_rsi_columns}{a \link{logical} to indicate whether only antibiotic columns must be detected that were transformed to class \code{rsi} (see \code{\link[=as.rsi]{as.rsi()}}) on beforehand (defaults to \code{FALSE})} +\item{only_sir_columns}{a \link{logical} to indicate whether only antibiotic columns must be detected that were transformed to class \code{sir} (see \code{\link[=as.sir]{as.sir()}}) on beforehand (defaults to \code{FALSE})} \item{custom_rules}{custom rules to apply, created with \code{\link[=custom_eucast_rules]{custom_eucast_rules()}}} @@ -71,7 +71,7 @@ Apply rules for clinical breakpoints and intrinsic resistance as defined by the To improve the interpretation of the antibiogram before EUCAST rules are applied, some non-EUCAST rules can applied at default, see \emph{Details}. } \details{ -\strong{Note:} This function does not translate MIC values to RSI values. Use \code{\link[=as.rsi]{as.rsi()}} for that. \cr +\strong{Note:} This function does not translate MIC values to SIR values. Use \code{\link[=as.sir]{as.sir()}} for that. \cr \strong{Note:} When ampicillin (AMP, J01CA01) is not available but amoxicillin (AMX, J01CA04) is, the latter will be used for all rules where there is a dependency on ampicillin. These drugs are interchangeable when it comes to expression of antimicrobial resistance. \cr The file containing all EUCAST rules is located here: \url{https://github.com/msberends/AMR/blob/main/data-raw/eucast_rules.tsv}. \strong{Note:} Old taxonomic names are replaced with the current taxonomy where applicable. For example, \emph{Ochrobactrum anthropi} was renamed to \emph{Brucella anthropi} in 2020; the original EUCAST rules v3.1 and v3.2 did not yet contain this new taxonomic name. The \code{AMR} package contains the full microbial taxonomy updated until 11 December, 2022, see \link{microorganisms}. @@ -110,7 +110,7 @@ Amikacin (\code{AMK}, \href{https://www.whocc.no/atc_ddd_index/?code=J01GB06&sho \section{Reference Data Publicly Available}{ -All data sets in this \code{AMR} package (about microorganisms, antibiotics, R/SI interpretation, EUCAST rules, etc.) are publicly and freely available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. We also provide tab-separated plain text files that are machine-readable and suitable for input in any software program, such as laboratory information systems. Please visit \href{https://msberends.github.io/AMR/articles/datasets.html}{our website for the download links}. The actual files are of course available on \href{https://github.com/msberends/AMR/tree/main/data-raw}{our GitHub repository}. +All data sets in this \code{AMR} package (about microorganisms, antibiotics, SIR interpretation, EUCAST rules, etc.) are publicly and freely available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. We also provide tab-separated plain text files that are machine-readable and suitable for input in any software program, such as laboratory information systems. Please visit \href{https://msberends.github.io/AMR/articles/datasets.html}{our website for the download links}. The actual files are of course available on \href{https://github.com/msberends/AMR/tree/main/data-raw}{our GitHub repository}. } \examples{ diff --git a/man/example_isolates.Rd b/man/example_isolates.Rd index 34f0d87c2..4e6e59b9f 100755 --- a/man/example_isolates.Rd +++ b/man/example_isolates.Rd @@ -13,7 +13,7 @@ A \link[tibble:tibble]{tibble} with 2,000 observations and 46 variables: \item \code{gender}\cr Gender of the patient, either "F" or "M" \item \code{ward}\cr Ward type where the patient was admitted, either "Clinical", "ICU" or "Outpatient" \item \code{mo}\cr ID of microorganism created with \code{\link[=as.mo]{as.mo()}}, see also the \link{microorganisms} data set -\item \code{PEN:RIF}\cr 40 different antibiotics with class \code{\link{rsi}} (see \code{\link[=as.rsi]{as.rsi()}}); these column names occur in the \link{antibiotics} data set and can be translated with \code{\link[=set_ab_names]{set_ab_names()}} or \code{\link[=ab_name]{ab_name()}} +\item \code{PEN:RIF}\cr 40 different antibiotics with class \code{\link{sir}} (see \code{\link[=as.sir]{as.sir()}}); these column names occur in the \link{antibiotics} data set and can be translated with \code{\link[=set_ab_names]{set_ab_names()}} or \code{\link[=ab_name]{ab_name()}} } } \usage{ diff --git a/man/example_isolates_unclean.Rd b/man/example_isolates_unclean.Rd index aa620b9b6..0c0b24775 100755 --- a/man/example_isolates_unclean.Rd +++ b/man/example_isolates_unclean.Rd @@ -11,7 +11,7 @@ A \link[tibble:tibble]{tibble} with 3,000 observations and 8 variables: \item \code{date}\cr date of receipt at the laboratory \item \code{hospital}\cr ID of the hospital, from A to C \item \code{bacteria}\cr info about microorganism that can be transformed with \code{\link[=as.mo]{as.mo()}}, see also \link{microorganisms} -\item \code{AMX:GEN}\cr 4 different antibiotics that have to be transformed with \code{\link[=as.rsi]{as.rsi()}} +\item \code{AMX:GEN}\cr 4 different antibiotics that have to be transformed with \code{\link[=as.sir]{as.sir()}} } } \usage{ diff --git a/man/first_isolate.Rd b/man/first_isolate.Rd index 607d6b78b..d8eb9e036 100755 --- a/man/first_isolate.Rd +++ b/man/first_isolate.Rd @@ -31,7 +31,7 @@ first_isolate( points_threshold = 2, info = interactive(), include_unknown = FALSE, - include_untested_rsi = TRUE, + include_untested_sir = TRUE, ... ) @@ -82,7 +82,7 @@ filter_first_isolate( \item{include_unknown}{a \link{logical} to indicate whether 'unknown' microorganisms should be included too, i.e. microbial code \code{"UNKNOWN"}, which defaults to \code{FALSE}. For WHONET users, this means that all records with organism code \code{"con"} (\emph{contamination}) will be excluded at default. Isolates with a microbial ID of \code{NA} will always be excluded as first isolate.} -\item{include_untested_rsi}{a \link{logical} to indicate whether also rows without antibiotic results are still eligible for becoming a first isolate. Use \code{include_untested_rsi = FALSE} to always return \code{FALSE} for such rows. This checks the data set for columns of class \code{rsi} and consequently requires transforming columns with antibiotic results using \code{\link[=as.rsi]{as.rsi()}} first.} +\item{include_untested_sir}{a \link{logical} to indicate whether also rows without antibiotic results are still eligible for becoming a first isolate. Use \code{include_untested_sir = FALSE} to always return \code{FALSE} for such rows. This checks the data set for columns of class \code{sir} and consequently requires transforming columns with antibiotic results using \code{\link[=as.sir]{as.sir()}} first.} \item{...}{arguments passed on to \code{\link[=first_isolate]{first_isolate()}} when using \code{\link[=filter_first_isolate]{filter_first_isolate()}}, otherwise arguments passed on to \code{\link[=key_antimicrobials]{key_antimicrobials()}} (such as \code{universal}, \code{gram_negative}, \code{gram_positive})} } diff --git a/man/ggplot_pca.Rd b/man/ggplot_pca.Rd index c1adbb299..3693bc07f 100755 --- a/man/ggplot_pca.Rd +++ b/man/ggplot_pca.Rd @@ -121,7 +121,7 @@ if (require("dplyr")) { genus = mo_genus(mo) ) \%>\% # and genus as we do here; filter(n() >= 30) \%>\% # filter on only 30 results per group - summarise_if(is.rsi, resistance) # then get resistance of all drugs + summarise_if(is.sir, resistance) # then get resistance of all drugs # now conduct PCA for certain antimicrobial drugs pca_result <- resistance_data \%>\% diff --git a/man/ggplot_rsi.Rd b/man/ggplot_sir.Rd old mode 100755 new mode 100644 similarity index 81% rename from man/ggplot_rsi.Rd rename to man/ggplot_sir.Rd index 2032f78fa..98bd36651 --- a/man/ggplot_rsi.Rd +++ b/man/ggplot_sir.Rd @@ -1,16 +1,16 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/ggplot_rsi.R -\name{ggplot_rsi} -\alias{ggplot_rsi} -\alias{geom_rsi} -\alias{facet_rsi} +% Please edit documentation in R/ggplot_sir.R +\name{ggplot_sir} +\alias{ggplot_sir} +\alias{geom_sir} +\alias{facet_sir} \alias{scale_y_percent} -\alias{scale_rsi_colours} -\alias{theme_rsi} -\alias{labels_rsi_count} +\alias{scale_sir_colours} +\alias{theme_sir} +\alias{labels_sir_count} \title{AMR Plots with \code{ggplot2}} \usage{ -ggplot_rsi( +ggplot_sir( data, position = NULL, x = "antibiotic", @@ -36,7 +36,7 @@ ggplot_rsi( ... ) -geom_rsi( +geom_sir( position = NULL, x = c("antibiotic", "interpretation"), fill = "interpretation", @@ -47,15 +47,15 @@ geom_rsi( ... ) -facet_rsi(facet = c("interpretation", "antibiotic"), nrow = NULL) +facet_sir(facet = c("interpretation", "antibiotic"), nrow = NULL) scale_y_percent(breaks = seq(0, 1, 0.1), limits = NULL) -scale_rsi_colours(..., aesthetics = "fill") +scale_sir_colours(..., aesthetics = "fill") -theme_rsi() +theme_sir() -labels_rsi_count( +labels_sir_count( position = NULL, x = "antibiotic", translate_ab = "name", @@ -67,7 +67,7 @@ labels_rsi_count( ) } \arguments{ -\item{data}{a \link{data.frame} with column(s) of class \code{\link{rsi}} (see \code{\link[=as.rsi]{as.rsi()}})} +\item{data}{a \link{data.frame} with column(s) of class \code{\link{sir}} (see \code{\link[=as.sir]{as.sir()}})} \item{position}{position adjustment of bars, either \code{"fill"}, \code{"stack"} or \code{"dodge"}} @@ -93,7 +93,7 @@ labels_rsi_count( \item{colours}{a named vactor with colour to be used for filling. The default colours are colour-blind friendly.} -\item{datalabels}{show datalabels using \code{\link[=labels_rsi_count]{labels_rsi_count()}}} +\item{datalabels}{show datalabels using \code{\link[=labels_sir_count]{labels_sir_count()}}} \item{datalabels.size}{size of the datalabels} @@ -109,7 +109,7 @@ labels_rsi_count( \item{y.title}{text to show as y axis description} -\item{...}{other arguments passed on to \code{\link[=geom_rsi]{geom_rsi()}} or, in case of \code{\link[=scale_rsi_colours]{scale_rsi_colours()}}, named values to set colours. The default colours are colour-blind friendly, while maintaining the convention that e.g. 'susceptible' should be green and 'resistant' should be red. See \emph{Examples}.} +\item{...}{other arguments passed on to \code{\link[=geom_sir]{geom_sir()}} or, in case of \code{\link[=scale_sir_colours]{scale_sir_colours()}}, named values to set colours. The default colours are colour-blind friendly, while maintaining the convention that e.g. 'susceptible' should be green and 'resistant' should be red. See \emph{Examples}.} \item{aesthetics}{aesthetics to apply the colours to, defaults to "fill" but can also be (a combination of) "alpha", "colour", "fill", "linetype", "shape" or "size"} } @@ -120,19 +120,19 @@ Use these functions to create bar plots for AMR data analysis. All functions rel At default, the names of antibiotics will be shown on the plots using \code{\link[=ab_name]{ab_name()}}. This can be set with the \code{translate_ab} argument. See \code{\link[=count_df]{count_df()}}. \subsection{The Functions}{ -\code{\link[=geom_rsi]{geom_rsi()}} will take any variable from the data that has an \code{\link{rsi}} class (created with \code{\link[=as.rsi]{as.rsi()}}) using \code{\link[=rsi_df]{rsi_df()}} and will plot bars with the percentage R, I and S. The default behaviour is to have the bars stacked and to have the different antibiotics on the x axis. +\code{\link[=geom_sir]{geom_sir()}} will take any variable from the data that has an \code{\link{sir}} class (created with \code{\link[=as.sir]{as.sir()}}) using \code{\link[=sir_df]{sir_df()}} and will plot bars with the percentage S, I, and R. The default behaviour is to have the bars stacked and to have the different antibiotics on the x axis. -\code{\link[=facet_rsi]{facet_rsi()}} creates 2d plots (at default based on S/I/R) using \code{\link[ggplot2:facet_wrap]{ggplot2::facet_wrap()}}. +\code{\link[=facet_sir]{facet_sir()}} creates 2d plots (at default based on S/I/R) using \code{\link[ggplot2:facet_wrap]{ggplot2::facet_wrap()}}. \code{\link[=scale_y_percent]{scale_y_percent()}} transforms the y axis to a 0 to 100\% range using \code{\link[ggplot2:scale_continuous]{ggplot2::scale_y_continuous()}}. -\code{\link[=scale_rsi_colours]{scale_rsi_colours()}} sets colours to the bars (green for S, yellow for I, and red for R). with multilingual support. The default colours are colour-blind friendly, while maintaining the convention that e.g. 'susceptible' should be green and 'resistant' should be red. +\code{\link[=scale_sir_colours]{scale_sir_colours()}} sets colours to the bars (green for S, yellow for I, and red for R). with multilingual support. The default colours are colour-blind friendly, while maintaining the convention that e.g. 'susceptible' should be green and 'resistant' should be red. -\code{\link[=theme_rsi]{theme_rsi()}} is a [ggplot2 theme][\code{\link[ggplot2:theme]{ggplot2::theme()}} with minimal distraction. +\code{\link[=theme_sir]{theme_sir()}} is a [ggplot2 theme][\code{\link[ggplot2:theme]{ggplot2::theme()}} with minimal distraction. -\code{\link[=labels_rsi_count]{labels_rsi_count()}} print datalabels on the bars with percentage and amount of isolates using \code{\link[ggplot2:geom_text]{ggplot2::geom_text()}}. +\code{\link[=labels_sir_count]{labels_sir_count()}} print datalabels on the bars with percentage and amount of isolates using \code{\link[ggplot2:geom_text]{ggplot2::geom_text()}}. -\code{\link[=ggplot_rsi]{ggplot_rsi()}} is a wrapper around all above functions that uses data as first input. This makes it possible to use this function after a pipe (\verb{\%>\%}). See \emph{Examples}. +\code{\link[=ggplot_sir]{ggplot_sir()}} is a wrapper around all above functions that uses data as first input. This makes it possible to use this function after a pipe (\verb{\%>\%}). See \emph{Examples}. } } \examples{ @@ -141,39 +141,39 @@ if (require("ggplot2") && require("dplyr")) { # get antimicrobial results for drugs against a UTI: ggplot(example_isolates \%>\% select(AMX, NIT, FOS, TMP, CIP)) + - geom_rsi() + geom_sir() } if (require("ggplot2") && require("dplyr")) { # prettify the plot using some additional functions: df <- example_isolates \%>\% select(AMX, NIT, FOS, TMP, CIP) ggplot(df) + - geom_rsi() + + geom_sir() + scale_y_percent() + - scale_rsi_colours() + - labels_rsi_count() + - theme_rsi() + scale_sir_colours() + + labels_sir_count() + + theme_sir() } if (require("ggplot2") && require("dplyr")) { # or better yet, simplify this using the wrapper function - a single command: example_isolates \%>\% select(AMX, NIT, FOS, TMP, CIP) \%>\% - ggplot_rsi() + ggplot_sir() } if (require("ggplot2") && require("dplyr")) { # get only proportions and no counts: example_isolates \%>\% select(AMX, NIT, FOS, TMP, CIP) \%>\% - ggplot_rsi(datalabels = FALSE) + ggplot_sir(datalabels = FALSE) } if (require("ggplot2") && require("dplyr")) { # add other ggplot2 arguments as you like: example_isolates \%>\% select(AMX, NIT, FOS, TMP, CIP) \%>\% - ggplot_rsi( + ggplot_sir( width = 0.5, colour = "black", size = 1, @@ -186,7 +186,7 @@ if (require("ggplot2") && require("dplyr")) { # you can alter the colours with colour names: example_isolates \%>\% select(AMX) \%>\% - ggplot_rsi(colours = c(SI = "yellow")) + ggplot_sir(colours = c(SI = "yellow")) } if (require("ggplot2") && require("dplyr")) { @@ -199,7 +199,7 @@ if (require("ggplot2") && require("dplyr")) { ) \%>\% ggplot() + geom_col(aes(x = x, y = y, fill = z)) + - scale_rsi_colours(Value4 = "S", Value5 = "I", Value6 = "R") + scale_sir_colours(Value4 = "S", Value5 = "I", Value6 = "R") } if (require("ggplot2") && require("dplyr")) { @@ -213,14 +213,14 @@ if (require("ggplot2") && require("dplyr")) { # age_groups() is also a function in this AMR package: group_by(age_group = age_groups(age)) \%>\% select(age_group, CIP) \%>\% - ggplot_rsi(x = "age_group") + ggplot_sir(x = "age_group") } if (require("ggplot2") && require("dplyr")) { # a shorter version which also adjusts data label colours: example_isolates \%>\% select(AMX, NIT, FOS, TMP, CIP) \%>\% - ggplot_rsi(colours = FALSE) + ggplot_sir(colours = FALSE) } if (require("ggplot2") && require("dplyr")) { @@ -230,7 +230,7 @@ if (require("ggplot2") && require("dplyr")) { # select only UTI-specific drugs select(ward, AMX, NIT, FOS, TMP, CIP) \%>\% group_by(ward) \%>\% - ggplot_rsi( + ggplot_sir( x = "ward", facet = "antibiotic", nrow = 1, diff --git a/man/guess_ab_col.Rd b/man/guess_ab_col.Rd index c411d669f..4ce4e4b89 100755 --- a/man/guess_ab_col.Rd +++ b/man/guess_ab_col.Rd @@ -8,7 +8,7 @@ guess_ab_col( x = NULL, search_string = NULL, verbose = FALSE, - only_rsi_columns = FALSE + only_sir_columns = FALSE ) } \arguments{ @@ -18,7 +18,7 @@ guess_ab_col( \item{verbose}{a \link{logical} to indicate whether additional info should be printed} -\item{only_rsi_columns}{a \link{logical} to indicate whether only antibiotic columns must be detected that were transformed to class \code{rsi} (see \code{\link[=as.rsi]{as.rsi()}}) on beforehand (defaults to \code{FALSE})} +\item{only_sir_columns}{a \link{logical} to indicate whether only antibiotic columns must be detected that were transformed to class \code{sir} (see \code{\link[=as.sir]{as.sir()}}) on beforehand (defaults to \code{FALSE})} } \value{ A column name of \code{x}, or \code{NULL} when no result is found. diff --git a/man/key_antimicrobials.Rd b/man/key_antimicrobials.Rd index 200a26da7..2fe3c999c 100755 --- a/man/key_antimicrobials.Rd +++ b/man/key_antimicrobials.Rd @@ -17,11 +17,11 @@ key_antimicrobials( "oxacillin", "rifampin"), antifungal = c("anidulafungin", "caspofungin", "fluconazole", "miconazole", "nystatin", "voriconazole"), - only_rsi_columns = FALSE, + only_sir_columns = FALSE, ... ) -all_antimicrobials(x = NULL, only_rsi_columns = FALSE, ...) +all_antimicrobials(x = NULL, only_sir_columns = FALSE, ...) antimicrobials_equal( y, @@ -45,7 +45,7 @@ antimicrobials_equal( \item{antifungal}{names of antifungal drugs for \strong{fungi}, case-insensitive. Set to \code{NULL} to ignore. See \emph{Details} for the default antifungal drugs} -\item{only_rsi_columns}{a \link{logical} to indicate whether only columns must be included that were transformed to class \code{rsi} (see \code{\link[=as.rsi]{as.rsi()}}) on beforehand (defaults to \code{FALSE})} +\item{only_sir_columns}{a \link{logical} to indicate whether only columns must be included that were transformed to class \code{sir} (see \code{\link[=as.sir]{as.sir()}}) on beforehand (defaults to \code{FALSE})} \item{...}{ignored, only in place to allow future extensions} diff --git a/man/mdro.Rd b/man/mdro.Rd index e8434df28..ce8623104 100755 --- a/man/mdro.Rd +++ b/man/mdro.Rd @@ -27,21 +27,21 @@ mdro( pct_required_classes = 0.5, combine_SI = TRUE, verbose = FALSE, - only_rsi_columns = FALSE, + only_sir_columns = FALSE, ... ) custom_mdro_guideline(..., as_factor = TRUE) -brmo(x = NULL, only_rsi_columns = FALSE, ...) +brmo(x = NULL, only_sir_columns = FALSE, ...) -mrgn(x = NULL, only_rsi_columns = FALSE, ...) +mrgn(x = NULL, only_sir_columns = FALSE, ...) -mdr_tb(x = NULL, only_rsi_columns = FALSE, ...) +mdr_tb(x = NULL, only_sir_columns = FALSE, ...) -mdr_cmi2012(x = NULL, only_rsi_columns = FALSE, ...) +mdr_cmi2012(x = NULL, only_sir_columns = FALSE, ...) -eucast_exceptional_phenotypes(x = NULL, only_rsi_columns = FALSE, ...) +eucast_exceptional_phenotypes(x = NULL, only_sir_columns = FALSE, ...) } \arguments{ \item{x}{a \link{data.frame} with antibiotics columns, like \code{AMX} or \code{amox}. Can be left blank for automatic determination.} @@ -58,7 +58,7 @@ eucast_exceptional_phenotypes(x = NULL, only_rsi_columns = FALSE, ...) \item{verbose}{a \link{logical} to turn Verbose mode on and off (default is off). In Verbose mode, the function does not return the MDRO results, but instead returns a data set in logbook form with extensive info about which isolates would be MDRO-positive, or why they are not.} -\item{only_rsi_columns}{a \link{logical} to indicate whether only antibiotic columns must be detected that were transformed to class \code{rsi} (see \code{\link[=as.rsi]{as.rsi()}}) on beforehand (defaults to \code{FALSE})} +\item{only_sir_columns}{a \link{logical} to indicate whether only antibiotic columns must be detected that were transformed to class \code{sir} (see \code{\link[=as.sir]{as.sir()}}) on beforehand (defaults to \code{FALSE})} \item{...}{in case of \code{\link[=custom_mdro_guideline]{custom_mdro_guideline()}}: a set of rules, see section \emph{Using Custom Guidelines} below. Otherwise: column name of an antibiotic, see section \emph{Antibiotics} below.} @@ -172,16 +172,19 @@ The following antibiotics are eligible for the functions \code{\link[=eucast_rul Amikacin (\code{AMK}, \href{https://www.whocc.no/atc_ddd_index/?code=J01GB06&showdescription=no}{S01AE08}), amoxicillin (\code{AMX}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CA04&showdescription=no}{J01MA02}), amoxicillin/clavulanic acid (\code{AMC}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CR02&showdescription=no}{J01MA23}), ampicillin (\code{AMP}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CA01&showdescription=no}{J01MA04}), ampicillin/sulbactam (\code{SAM}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CR01&showdescription=no}{J01MA08}), arbekacin (\code{ARB}, \href{https://www.whocc.no/atc_ddd_index/?code=J01GB12&showdescription=no}{J01MA19}), aspoxicillin (\code{APX}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CA19&showdescription=no}{J01MA16}), azidocillin (\code{AZD}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CE04&showdescription=no}{J01MA15}), azithromycin (\code{AZM}, \href{https://www.whocc.no/atc_ddd_index/?code=J01FA10&showdescription=no}{J01MA11}), azlocillin (\code{AZL}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CA09&showdescription=no}{J01MA25}), aztreonam (\code{ATM}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DF01&showdescription=no}{J01MA12}), bacampicillin (\code{BAM}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CA06&showdescription=no}{J01MA24}), bekanamycin (\code{BEK}, \href{https://www.whocc.no/atc_ddd_index/?code=J01GB13&showdescription=no}{J01MA07}), benzathine benzylpenicillin (\code{BNB}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CE08&showdescription=no}{J01MA14}), benzathine phenoxymethylpenicillin (\code{BNP}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CE10&showdescription=no}{D10AF05}), benzylpenicillin (\code{PEN}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CE01&showdescription=no}{J01MA06}), besifloxacin (\code{BES}, \href{https://www.whocc.no/atc_ddd_index/?code=S01AE08&showdescription=no}{J01MA01}), biapenem (\code{BIA}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DH05&showdescription=no}{J01MA18}), carbenicillin (\code{CRB}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CA03&showdescription=no}{J01MA03}), carindacillin (\code{CRN}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CA05&showdescription=no}{J01MA17}), cefacetrile (\code{CAC}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DB10&showdescription=no}{J01MA10}), cefaclor (\code{CEC}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DC04&showdescription=no}{J01MA21}), cefadroxil (\code{CFR}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DB05&showdescription=no}{J01MA09}), cefalexin (\code{LEX}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DB01&showdescription=no}{J01MA05}), cefaloridine (\code{RID}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DB02&showdescription=no}{P01AA05}), cefalotin (\code{CEP}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DB03&showdescription=no}{J01MA22}), cefamandole (\code{MAN}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DC03&showdescription=no}{J01MA13}), cefapirin (\code{HAP}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DB08&showdescription=no}{J01CA01}), cefatrizine (\code{CTZ}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DB07&showdescription=no}{J01CA04}), cefazedone (\code{CZD}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DB06&showdescription=no}{J01CA12}), cefazolin (\code{CZO}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DB04&showdescription=no}{J01CR05}), cefcapene (\code{CCP}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DD17&showdescription=no}{J01CA13}), cefdinir (\code{CDR}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DD15&showdescription=no}{J01AA02}), cefditoren (\code{DIT}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DD16&showdescription=no}{J01FA10}), cefepime (\code{FEP}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DE01&showdescription=no}{J01FA09}), cefetamet (\code{CAT}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DD10&showdescription=no}{J01CR02}), cefixime (\code{CFM}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DD08&showdescription=no}{J01AA08}), cefmenoxime (\code{CMX}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DD05&showdescription=no}{J01FA06}), cefmetazole (\code{CMZ}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DC09&showdescription=no}{J01CF04}), cefodizime (\code{DIZ}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DD09&showdescription=no}{J01CF05}), cefonicid (\code{CID}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DC06&showdescription=no}{J01CR01}), cefoperazone (\code{CFP}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DD12&showdescription=no}{J01CA19}), cefoperazone/sulbactam (\code{CSL}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DD62&showdescription=no}{J01CE04}), ceforanide (\code{CND}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DC11&showdescription=no}{J01CA09}), cefotaxime (\code{CTX}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DD01&showdescription=no}{J01DF01}), cefotaxime/clavulanic acid (\code{CTC}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DD51&showdescription=no}{J01CA06}), cefotetan (\code{CTT}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DC05&showdescription=no}{J01CE08}), cefotiam (\code{CTF}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DC07&showdescription=no}{J01CE10}), cefoxitin (\code{FOX}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DC01&showdescription=no}{J01CE01}), cefozopran (\code{ZOP}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DE03&showdescription=no}{J01CA03}), cefpiramide (\code{CPM}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DD11&showdescription=no}{J01CA05}), cefpirome (\code{CPO}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DE02&showdescription=no}{J01CE07}), cefpodoxime (\code{CPD}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DD13&showdescription=no}{J01CF02}), cefprozil (\code{CPR}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DC10&showdescription=no}{J01CF01}), cefroxadine (\code{CRD}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DB11&showdescription=no}{J01CA07}), cefsulodin (\code{CFS}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DD03&showdescription=no}{J01CA18}), ceftaroline (\code{CPT}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DI02&showdescription=no}{J01CA11}), ceftazidime (\code{CAZ}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DD02&showdescription=no}{J01CA14}), ceftazidime/clavulanic acid (\code{CCV}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DD52&showdescription=no}{J01CF03}), cefteram (\code{CEM}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DD18&showdescription=no}{J01CA10}), ceftezole (\code{CTL}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DB12&showdescription=no}{J01CF06}), ceftibuten (\code{CTB}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DD14&showdescription=no}{J01CE06}), ceftizoxime (\code{CZX}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DD07&showdescription=no}{J01CE05}), ceftobiprole medocaril (\code{CFM1}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DI01&showdescription=no}{J01CE02}), ceftolozane/tazobactam (\code{CZT}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DI54&showdescription=no}{J01CA02}), ceftriaxone (\code{CRO}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DD04&showdescription=no}{J01CA08}), ceftriaxone/beta-lactamase inhibitor (\code{CEB}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DD63&showdescription=no}{J01CE09}), cefuroxime (\code{CXM}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DC02&showdescription=no}{J01CE03}), cephradine (\code{CED}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DB09&showdescription=no}{J01CG01}), chloramphenicol (\code{CHL}, \href{https://www.whocc.no/atc_ddd_index/?code=J01BA01&showdescription=no}{J01CA16}), ciprofloxacin (\code{CIP}, \href{https://www.whocc.no/atc_ddd_index/?code=J01MA02&showdescription=no}{J01CR04}), clarithromycin (\code{CLR}, \href{https://www.whocc.no/atc_ddd_index/?code=J01FA09&showdescription=no}{J01CA15}), clindamycin (\code{CLI}, \href{https://www.whocc.no/atc_ddd_index/?code=J01FF01&showdescription=no}{J01CG02}), clometocillin (\code{CLM}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CE07&showdescription=no}{J01CA17}), cloxacillin (\code{CLO}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CF02&showdescription=no}{J01CR03}), colistin (\code{COL}, \href{https://www.whocc.no/atc_ddd_index/?code=J01XB01&showdescription=no}{J01DB10}), cycloserine (\code{CYC}, \href{https://www.whocc.no/atc_ddd_index/?code=J04AB01&showdescription=no}{J01DC04}), dalbavancin (\code{DAL}, \href{https://www.whocc.no/atc_ddd_index/?code=J01XA04&showdescription=no}{J01DB05}), daptomycin (\code{DAP}, \href{https://www.whocc.no/atc_ddd_index/?code=J01XX09&showdescription=no}{J01DB01}), delafloxacin (\code{DFX}, \href{https://www.whocc.no/atc_ddd_index/?code=J01MA23&showdescription=no}{J01DB02}), dibekacin (\code{DKB}, \href{https://www.whocc.no/atc_ddd_index/?code=J01GB09&showdescription=no}{J01DB03}), dicloxacillin (\code{DIC}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CF01&showdescription=no}{J01DC03}), dirithromycin (\code{DIR}, \href{https://www.whocc.no/atc_ddd_index/?code=J01FA13&showdescription=no}{J01DB08}), doripenem (\code{DOR}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DH04&showdescription=no}{J01DB07}), doxycycline (\code{DOX}, \href{https://www.whocc.no/atc_ddd_index/?code=J01AA02&showdescription=no}{J01DB06}), enoxacin (\code{ENX}, \href{https://www.whocc.no/atc_ddd_index/?code=J01MA04&showdescription=no}{J01DB04}), epicillin (\code{EPC}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CA07&showdescription=no}{J01DD17}), ertapenem (\code{ETP}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DH03&showdescription=no}{J01DD15}), erythromycin (\code{ERY}, \href{https://www.whocc.no/atc_ddd_index/?code=J01FA01&showdescription=no}{J01DD16}), fleroxacin (\code{FLE}, \href{https://www.whocc.no/atc_ddd_index/?code=J01MA08&showdescription=no}{J01DE01}), flucloxacillin (\code{FLC}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CF05&showdescription=no}{J01DD10}), flurithromycin (\code{FLR1}, \href{https://www.whocc.no/atc_ddd_index/?code=J01FA14&showdescription=no}{J01DD08}), fosfomycin (\code{FOS}, \href{https://www.whocc.no/atc_ddd_index/?code=J01XX01&showdescription=no}{J01DD05}), framycetin (\code{FRM}, \href{https://www.whocc.no/atc_ddd_index/?code=D09AA01&showdescription=no}{J01DC09}), fusidic acid (\code{FUS}, \href{https://www.whocc.no/atc_ddd_index/?code=J01XC01&showdescription=no}{J01DD09}), garenoxacin (\code{GRN}, \href{https://www.whocc.no/atc_ddd_index/?code=J01MA19&showdescription=no}{J01DC06}), gatifloxacin (\code{GAT}, \href{https://www.whocc.no/atc_ddd_index/?code=J01MA16&showdescription=no}{J01DD12}), gemifloxacin (\code{GEM}, \href{https://www.whocc.no/atc_ddd_index/?code=J01MA15&showdescription=no}{J01DD62}), gentamicin (\code{GEN}, \href{https://www.whocc.no/atc_ddd_index/?code=J01GB03&showdescription=no}{J01DC11}), grepafloxacin (\code{GRX}, \href{https://www.whocc.no/atc_ddd_index/?code=J01MA11&showdescription=no}{J01DD01}), hetacillin (\code{HET}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CA18&showdescription=no}{J01DD51}), imipenem (\code{IPM}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DH51&showdescription=no}{J01DC05}), imipenem/relebactam (\code{IMR}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DH56&showdescription=no}{J01DC07}), isepamicin (\code{ISE}, \href{https://www.whocc.no/atc_ddd_index/?code=J01GB11&showdescription=no}{J01DC01}), josamycin (\code{JOS}, \href{https://www.whocc.no/atc_ddd_index/?code=J01FA07&showdescription=no}{J01DE03}), kanamycin (\code{KAN}, \href{https://www.whocc.no/atc_ddd_index/?code=J01GB04&showdescription=no}{J01DD11}), lascufloxacin (\code{LSC}, \href{https://www.whocc.no/atc_ddd_index/?code=J01MA25&showdescription=no}{J01DE02}), latamoxef (\code{LTM}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DD06&showdescription=no}{J01DD13}), levofloxacin (\code{LVX}, \href{https://www.whocc.no/atc_ddd_index/?code=J01MA12&showdescription=no}{J01DC10}), levonadifloxacin (\code{LND}, \href{https://www.whocc.no/atc_ddd_index/?code=J01MA24&showdescription=no}{J01DB11}), lincomycin (\code{LIN}, \href{https://www.whocc.no/atc_ddd_index/?code=J01FF02&showdescription=no}{J01DD03}), linezolid (\code{LNZ}, \href{https://www.whocc.no/atc_ddd_index/?code=J01XX08&showdescription=no}{J01DI02}), lomefloxacin (\code{LOM}, \href{https://www.whocc.no/atc_ddd_index/?code=J01MA07&showdescription=no}{J01DD02}), loracarbef (\code{LOR}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DC08&showdescription=no}{J01DD52}), mecillinam (\code{MEC}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CA11&showdescription=no}{J01DD18}), meropenem (\code{MEM}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DH02&showdescription=no}{J01DB12}), meropenem/vaborbactam (\code{MEV}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DH52&showdescription=no}{J01DD14}), metampicillin (\code{MTM}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CA14&showdescription=no}{J01DD07}), meticillin (\code{MET}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CF03&showdescription=no}{J01DI01}), mezlocillin (\code{MEZ}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CA10&showdescription=no}{J01DI54}), micronomicin (\code{MCR}, \href{https://www.whocc.no/atc_ddd_index/?code=S01AA22&showdescription=no}{J01DD04}), midecamycin (\code{MID}, \href{https://www.whocc.no/atc_ddd_index/?code=J01FA03&showdescription=no}{J01DD63}), minocycline (\code{MNO}, \href{https://www.whocc.no/atc_ddd_index/?code=J01AA08&showdescription=no}{J01DC02}), miocamycin (\code{MCM}, \href{https://www.whocc.no/atc_ddd_index/?code=J01FA11&showdescription=no}{J01DB09}), moxifloxacin (\code{MFX}, \href{https://www.whocc.no/atc_ddd_index/?code=J01MA14&showdescription=no}{J01DD06}), nadifloxacin (\code{NAD}, \href{https://www.whocc.no/atc_ddd_index/?code=D10AF05&showdescription=no}{J01DC08}), nafcillin (\code{NAF}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CF06&showdescription=no}{J01DH05}), nalidixic acid (\code{NAL}, \href{https://www.whocc.no/atc_ddd_index/?code=J01MB02&showdescription=no}{J01DH04}), neomycin (\code{NEO}, \href{https://www.whocc.no/atc_ddd_index/?code=J01GB05&showdescription=no}{J01DH03}), netilmicin (\code{NET}, \href{https://www.whocc.no/atc_ddd_index/?code=J01GB07&showdescription=no}{J01DH51}), nitrofurantoin (\code{NIT}, \href{https://www.whocc.no/atc_ddd_index/?code=J01XE01&showdescription=no}{J01DH56}), norfloxacin (\code{NOR}, \href{https://www.whocc.no/atc_ddd_index/?code=J01MA06&showdescription=no}{J01DH02}), ofloxacin (\code{OFX}, \href{https://www.whocc.no/atc_ddd_index/?code=J01MA01&showdescription=no}{J01DH52}), oleandomycin (\code{OLE}, \href{https://www.whocc.no/atc_ddd_index/?code=J01FA05&showdescription=no}{J01DH55}), oritavancin (\code{ORI}, \href{https://www.whocc.no/atc_ddd_index/?code=J01XA05&showdescription=no}{J01DH06}), oxacillin (\code{OXA}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CF04&showdescription=no}{J01XA02}), panipenem (\code{PAN}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DH55&showdescription=no}{J01XA01}), pazufloxacin (\code{PAZ}, \href{https://www.whocc.no/atc_ddd_index/?code=J01MA18&showdescription=no}{J01XC01}), pefloxacin (\code{PEF}, \href{https://www.whocc.no/atc_ddd_index/?code=J01MA03&showdescription=no}{J01FA13}), penamecillin (\code{PNM}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CE06&showdescription=no}{J01FA01}), pheneticillin (\code{PHE}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CE05&showdescription=no}{J01FA14}), phenoxymethylpenicillin (\code{PHN}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CE02&showdescription=no}{J01FA07}), piperacillin (\code{PIP}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CA12&showdescription=no}{J01FA03}), piperacillin/tazobactam (\code{TZP}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CR05&showdescription=no}{J01FA11}), pivampicillin (\code{PVM}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CA02&showdescription=no}{J01FA05}), pivmecillinam (\code{PME}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CA08&showdescription=no}{J01FA12}), plazomicin (\code{PLZ}, \href{https://www.whocc.no/atc_ddd_index/?code=J01GB14&showdescription=no}{J01FA16}), polymyxin B (\code{PLB}, \href{https://www.whocc.no/atc_ddd_index/?code=J01XB02&showdescription=no}{J01FA02}), pristinamycin (\code{PRI}, \href{https://www.whocc.no/atc_ddd_index/?code=J01FG01&showdescription=no}{J01FA15}), procaine benzylpenicillin (\code{PRB}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CE09&showdescription=no}{J01FA08}), propicillin (\code{PRP}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CE03&showdescription=no}{J01FF02}), prulifloxacin (\code{PRU}, \href{https://www.whocc.no/atc_ddd_index/?code=J01MA17&showdescription=no}{J01FG01}), quinupristin/dalfopristin (\code{QDA}, \href{https://www.whocc.no/atc_ddd_index/?code=J01FG02&showdescription=no}{J01FG02}), ribostamycin (\code{RST}, \href{https://www.whocc.no/atc_ddd_index/?code=J01GB10&showdescription=no}{J04AB02}), rifampicin (\code{RIF}, \href{https://www.whocc.no/atc_ddd_index/?code=J04AB02&showdescription=no}{J01XX09}), rokitamycin (\code{ROK}, \href{https://www.whocc.no/atc_ddd_index/?code=J01FA12&showdescription=no}{J01XX08}), roxithromycin (\code{RXT}, \href{https://www.whocc.no/atc_ddd_index/?code=J01FA06&showdescription=no}{J01AA07}), rufloxacin (\code{RFL}, \href{https://www.whocc.no/atc_ddd_index/?code=J01MA10&showdescription=no}{J01XB01}), sisomicin (\code{SIS}, \href{https://www.whocc.no/atc_ddd_index/?code=J01GB08&showdescription=no}{J01XB02}), sitafloxacin (\code{SIT}, \href{https://www.whocc.no/atc_ddd_index/?code=J01MA21&showdescription=no}{J01XE01}), solithromycin (\code{SOL}, \href{https://www.whocc.no/atc_ddd_index/?code=J01FA16&showdescription=no}{J01AA12}), sparfloxacin (\code{SPX}, \href{https://www.whocc.no/atc_ddd_index/?code=J01MA09&showdescription=no}{J01EA01}), spiramycin (\code{SPI}, \href{https://www.whocc.no/atc_ddd_index/?code=J01FA02&showdescription=no}{J01XX01}), streptoduocin (\code{STR}, \href{https://www.whocc.no/atc_ddd_index/?code=J01GA02&showdescription=no}{J01BA01}), streptomycin (\code{STR1}, \href{https://www.whocc.no/atc_ddd_index/?code=J01GA01&showdescription=no}{J01GB06}), sulbactam (\code{SUL}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CG01&showdescription=no}{J01GB12}), sulbenicillin (\code{SBC}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CA16&showdescription=no}{J01GB13}), sulfadiazine (\code{SDI}, \href{https://www.whocc.no/atc_ddd_index/?code=J01EC02&showdescription=no}{J01GB09}), sulfadiazine/trimethoprim (\code{SLT1}, \href{https://www.whocc.no/atc_ddd_index/?code=J01EE02&showdescription=no}{D09AA01}), sulfadimethoxine (\code{SUD}, \href{https://www.whocc.no/atc_ddd_index/?code=J01ED01&showdescription=no}{J01GB03}), sulfadimidine (\code{SDM}, \href{https://www.whocc.no/atc_ddd_index/?code=J01EB03&showdescription=no}{J01GB11}), sulfadimidine/trimethoprim (\code{SLT2}, \href{https://www.whocc.no/atc_ddd_index/?code=J01EE05&showdescription=no}{J01GB04}), sulfafurazole (\code{SLF}, \href{https://www.whocc.no/atc_ddd_index/?code=J01EB05&showdescription=no}{S01AA22}), sulfaisodimidine (\code{SLF1}, \href{https://www.whocc.no/atc_ddd_index/?code=J01EB01&showdescription=no}{J01GB05}), sulfalene (\code{SLF2}, \href{https://www.whocc.no/atc_ddd_index/?code=J01ED02&showdescription=no}{J01GB07}), sulfamazone (\code{SZO}, \href{https://www.whocc.no/atc_ddd_index/?code=J01ED09&showdescription=no}{J01GB14}), sulfamerazine (\code{SLF3}, \href{https://www.whocc.no/atc_ddd_index/?code=J01ED07&showdescription=no}{J01GB10}), sulfamerazine/trimethoprim (\code{SLT3}, \href{https://www.whocc.no/atc_ddd_index/?code=J01EE07&showdescription=no}{J01GB08}), sulfamethizole (\code{SLF4}, \href{https://www.whocc.no/atc_ddd_index/?code=J01EB02&showdescription=no}{J01GA02}), sulfamethoxazole (\code{SMX}, \href{https://www.whocc.no/atc_ddd_index/?code=J01EC01&showdescription=no}{J01GA01}), sulfamethoxypyridazine (\code{SLF5}, \href{https://www.whocc.no/atc_ddd_index/?code=J01ED05&showdescription=no}{J01GB01}), sulfametomidine (\code{SLF6}, \href{https://www.whocc.no/atc_ddd_index/?code=J01ED03&showdescription=no}{J01EE01}), sulfametoxydiazine (\code{SLF7}, \href{https://www.whocc.no/atc_ddd_index/?code=J01ED04&showdescription=no}{J01MB02}), sulfametrole/trimethoprim (\code{SLT4}, \href{https://www.whocc.no/atc_ddd_index/?code=J01EE03&showdescription=no}{J01FF01}), sulfamoxole (\code{SLF8}, \href{https://www.whocc.no/atc_ddd_index/?code=J01EC03&showdescription=no}{J01XA04}), sulfamoxole/trimethoprim (\code{SLT5}, \href{https://www.whocc.no/atc_ddd_index/?code=J01EE04&showdescription=no}{J01XA05}), sulfanilamide (\code{SLF9}, \href{https://www.whocc.no/atc_ddd_index/?code=J01EB06&showdescription=no}{J01XA03}), sulfaperin (\code{SLF10}, \href{https://www.whocc.no/atc_ddd_index/?code=J01ED06&showdescription=no}{J04AB01}), sulfaphenazole (\code{SLF11}, \href{https://www.whocc.no/atc_ddd_index/?code=J01ED08&showdescription=no}{J01XX11}), sulfapyridine (\code{SLF12}, \href{https://www.whocc.no/atc_ddd_index/?code=J01EB04&showdescription=no}{J01EC02}), sulfathiazole (\code{SUT}, \href{https://www.whocc.no/atc_ddd_index/?code=J01EB07&showdescription=no}{J01ED01}), sulfathiourea (\code{SLF13}, \href{https://www.whocc.no/atc_ddd_index/?code=J01EB08&showdescription=no}{J01EB03}), sultamicillin (\code{SLT6}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CR04&showdescription=no}{J01EB05}), talampicillin (\code{TAL}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CA15&showdescription=no}{J01EB01}), tazobactam (\code{TAZ}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CG02&showdescription=no}{J01ED02}), tebipenem (\code{TBP}, \href{https://www.whocc.no/atc_ddd_index/?code=J01DH06&showdescription=no}{J01ED09}), tedizolid (\code{TZD}, \href{https://www.whocc.no/atc_ddd_index/?code=J01XX11&showdescription=no}{J01ED07}), teicoplanin (\code{TEC}, \href{https://www.whocc.no/atc_ddd_index/?code=J01XA02&showdescription=no}{J01EB02}), telavancin (\code{TLV}, \href{https://www.whocc.no/atc_ddd_index/?code=J01XA03&showdescription=no}{J01EC01}), telithromycin (\code{TLT}, \href{https://www.whocc.no/atc_ddd_index/?code=J01FA15&showdescription=no}{J01ED05}), temafloxacin (\code{TMX}, \href{https://www.whocc.no/atc_ddd_index/?code=J01MA05&showdescription=no}{J01ED03}), temocillin (\code{TEM}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CA17&showdescription=no}{J01ED04}), tetracycline (\code{TCY}, \href{https://www.whocc.no/atc_ddd_index/?code=J01AA07&showdescription=no}{J01EC03}), ticarcillin (\code{TIC}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CA13&showdescription=no}{J01EB06}), ticarcillin/clavulanic acid (\code{TCC}, \href{https://www.whocc.no/atc_ddd_index/?code=J01CR03&showdescription=no}{J01ED06}), tigecycline (\code{TGC}, \href{https://www.whocc.no/atc_ddd_index/?code=J01AA12&showdescription=no}{J01ED08}), tilbroquinol (\code{TBQ}, \href{https://www.whocc.no/atc_ddd_index/?code=P01AA05&showdescription=no}{J01EB04}), tobramycin (\code{TOB}, \href{https://www.whocc.no/atc_ddd_index/?code=J01GB01&showdescription=no}{J01EB07}), tosufloxacin (\code{TFX}, \href{https://www.whocc.no/atc_ddd_index/?code=J01MA22&showdescription=no}{J01EB08}), trimethoprim (\code{TMP}, \href{https://www.whocc.no/atc_ddd_index/?code=J01EA01&showdescription=no}{J01EE02}), trimethoprim/sulfamethoxazole (\code{SXT}, \href{https://www.whocc.no/atc_ddd_index/?code=J01EE01&showdescription=no}{J01EE05}), troleandomycin (\code{TRL}, \href{https://www.whocc.no/atc_ddd_index/?code=J01FA08&showdescription=no}{J01EE07}), trovafloxacin (\code{TVA}, \href{https://www.whocc.no/atc_ddd_index/?code=J01MA13&showdescription=no}{J01EE03}), vancomycin (\code{VAN}, \href{https://www.whocc.no/atc_ddd_index/?code=J01XA01&showdescription=no}{J01EE04}) } -\section{Interpretation of R and S/I}{ +\section{Interpretation of SIR}{ -In 2019, the European Committee on Antimicrobial Susceptibility Testing (EUCAST) has decided to change the definitions of susceptibility testing categories R and S/I as shown below (\url{https://www.eucast.org/newsiandr/}). +In 2019, the European Committee on Antimicrobial Susceptibility Testing (EUCAST) has decided to change the definitions of susceptibility testing categories S, I, and R as shown below (\url{https://www.eucast.org/newsiandr/}): \itemize{ +\item \strong{S - Susceptible, standard dosing regimen}\cr +A microorganism is categorised as "Susceptible, standard dosing regimen", when there is a high likelihood of therapeutic success using a standard dosing regimen of the agent. +\item \strong{I - Susceptible, increased exposure} \emph{\cr +A microorganism is categorised as "Susceptible, Increased exposure}" when there is a high likelihood of therapeutic success because exposure to the agent is increased by adjusting the dosing regimen or by its concentration at the site of infection. \item \strong{R = Resistant}\cr -A microorganism is categorised as \emph{Resistant} when there is a high likelihood of therapeutic failure even when there is increased exposure. Exposure is a function of how the mode of administration, dose, dosing interval, infusion time, as well as distribution and excretion of the antimicrobial agent will influence the infecting organism at the site of infection. -\item \strong{S = Susceptible}\cr -A microorganism is categorised as \emph{Susceptible, standard dosing regimen}, when there is a high likelihood of therapeutic success using a standard dosing regimen of the agent. -\item \strong{I = Susceptible, Increased exposure}\cr -A microorganism is categorised as \emph{Susceptible, Increased exposure} when there is a high likelihood of therapeutic success because exposure to the agent is increased by adjusting the dosing regimen or by its concentration at the site of infection. +A microorganism is categorised as "Resistant" when there is a high likelihood of therapeutic failure even when there is increased exposure. +\itemize{ +\item \emph{Exposure} is a function of how the mode of administration, dose, dosing interval, infusion time, as well as distribution and excretion of the antimicrobial agent will influence the infecting organism at the site of infection. +} } This AMR package honours this insight. Use \code{\link[=susceptibility]{susceptibility()}} (equal to \code{\link[=proportion_SI]{proportion_SI()}}) to determine antimicrobial susceptibility and \code{\link[=count_susceptible]{count_susceptible()}} (equal to \code{\link[=count_SI]{count_SI()}}) to count susceptible isolates. diff --git a/man/mean_amr_distance.Rd b/man/mean_amr_distance.Rd index 88e166a51..68059981a 100755 --- a/man/mean_amr_distance.Rd +++ b/man/mean_amr_distance.Rd @@ -2,21 +2,21 @@ % Please edit documentation in R/mean_amr_distance.R \name{mean_amr_distance} \alias{mean_amr_distance} -\alias{mean_amr_distance.rsi} +\alias{mean_amr_distance.sir} \alias{mean_amr_distance.data.frame} \alias{amr_distance_from_row} \title{Calculate the Mean AMR Distance} \usage{ mean_amr_distance(x, ...) -\method{mean_amr_distance}{rsi}(x, ..., combine_SI = TRUE) +\method{mean_amr_distance}{sir}(x, ..., combine_SI = TRUE) \method{mean_amr_distance}{data.frame}(x, ..., combine_SI = TRUE) amr_distance_from_row(amr_distance, row) } \arguments{ -\item{x}{a vector of class \link[=as.rsi]{rsi}, \link[=as.mic]{mic} or \link[=as.disk]{disk}, or a \link{data.frame} containing columns of any of these classes} +\item{x}{a vector of class \link[=as.sir]{sir}, \link[=as.mic]{mic} or \link[=as.disk]{disk}, or a \link{data.frame} containing columns of any of these classes} \item{...}{variables to select (supports \link[tidyselect:language]{tidyselect language} such as \code{column1:column4} and \code{where(is.mic)}, and can thus also be \link[=ab_selector]{antibiotic selectors}} @@ -34,7 +34,7 @@ The mean AMR distance is effectively \href{https://en.wikipedia.org/wiki/Standar MIC values (see \code{\link[=as.mic]{as.mic()}}) are transformed with \code{\link[=log2]{log2()}} first; their distance is thus calculated as \code{(log2(x) - mean(log2(x))) / sd(log2(x))}. -R/SI values (see \code{\link[=as.rsi]{as.rsi()}}) are transformed using \code{"S"} = 1, \code{"I"} = 2, and \code{"R"} = 3. If \code{combine_SI} is \code{TRUE} (default), the \code{"I"} will be considered to be 1. +SIR values (see \code{\link[=as.sir]{as.sir()}}) are transformed using \code{"S"} = 1, \code{"I"} = 2, and \code{"R"} = 3. If \code{combine_SI} is \code{TRUE} (default), the \code{"I"} will be considered to be 1. For data sets, the mean AMR distance will be calculated per column, after which the mean per row will be returned, see \emph{Examples}. @@ -46,9 +46,9 @@ Isolates with distances less than 0.01 difference from each other should be cons } \examples{ -rsi <- random_rsi(10) -rsi -mean_amr_distance(rsi) +sir <- random_sir(10) +sir +mean_amr_distance(sir) mic <- random_mic(10) mic @@ -62,7 +62,7 @@ mean_amr_distance(disk) y <- data.frame( id = LETTERS[1:10], - amox = random_rsi(10, ab = "amox", mo = "Escherichia coli"), + amox = random_sir(10, ab = "amox", mo = "Escherichia coli"), cipr = random_disk(10, ab = "cipr", mo = "Escherichia coli"), gent = random_mic(10, ab = "gent", mo = "Escherichia coli"), tobr = random_mic(10, ab = "tobr", mo = "Escherichia coli") diff --git a/man/mo_matching_score.Rd b/man/mo_matching_score.Rd index 73fbcbd87..f659034c5 100755 --- a/man/mo_matching_score.Rd +++ b/man/mo_matching_score.Rd @@ -59,7 +59,7 @@ All matches are sorted descending on their matching score and for all user input \section{Reference Data Publicly Available}{ -All data sets in this \code{AMR} package (about microorganisms, antibiotics, R/SI interpretation, EUCAST rules, etc.) are publicly and freely available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. We also provide tab-separated plain text files that are machine-readable and suitable for input in any software program, such as laboratory information systems. Please visit \href{https://msberends.github.io/AMR/articles/datasets.html}{our website for the download links}. The actual files are of course available on \href{https://github.com/msberends/AMR/tree/main/data-raw}{our GitHub repository}. +All data sets in this \code{AMR} package (about microorganisms, antibiotics, SIR interpretation, EUCAST rules, etc.) are publicly and freely available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. We also provide tab-separated plain text files that are machine-readable and suitable for input in any software program, such as laboratory information systems. Please visit \href{https://msberends.github.io/AMR/articles/datasets.html}{our website for the download links}. The actual files are of course available on \href{https://github.com/msberends/AMR/tree/main/data-raw}{our GitHub repository}. } \examples{ diff --git a/man/mo_property.Rd b/man/mo_property.Rd index fb4c0993c..ec46c967d 100755 --- a/man/mo_property.Rd +++ b/man/mo_property.Rd @@ -345,7 +345,7 @@ This function uses \code{\link[=as.mo]{as.mo()}} internally, which uses an advan \section{Reference Data Publicly Available}{ -All data sets in this \code{AMR} package (about microorganisms, antibiotics, R/SI interpretation, EUCAST rules, etc.) are publicly and freely available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. We also provide tab-separated plain text files that are machine-readable and suitable for input in any software program, such as laboratory information systems. Please visit \href{https://msberends.github.io/AMR/articles/datasets.html}{our website for the download links}. The actual files are of course available on \href{https://github.com/msberends/AMR/tree/main/data-raw}{our GitHub repository}. +All data sets in this \code{AMR} package (about microorganisms, antibiotics, SIR interpretation, EUCAST rules, etc.) are publicly and freely available for download in the following formats: R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. We also provide tab-separated plain text files that are machine-readable and suitable for input in any software program, such as laboratory information systems. Please visit \href{https://msberends.github.io/AMR/articles/datasets.html}{our website for the download links}. The actual files are of course available on \href{https://github.com/msberends/AMR/tree/main/data-raw}{our GitHub repository}. } \examples{ diff --git a/man/pca.Rd b/man/pca.Rd index 4d7fb1247..f6b2c8ab7 100755 --- a/man/pca.Rd +++ b/man/pca.Rd @@ -72,7 +72,7 @@ if (require("dplyr")) { genus = mo_genus(mo) ) \%>\% # and genus as we do here; filter(n() >= 30) \%>\% # filter on only 30 results per group - summarise_if(is.rsi, resistance) # then get resistance of all drugs + summarise_if(is.sir, resistance) # then get resistance of all drugs # now conduct PCA for certain antimicrobial drugs pca_result <- resistance_data \%>\% diff --git a/man/plot.Rd b/man/plot.Rd index e0a1b06c1..3cf7bda30 100755 --- a/man/plot.Rd +++ b/man/plot.Rd @@ -8,10 +8,10 @@ \alias{plot.disk} \alias{autoplot.disk} \alias{fortify.disk} -\alias{plot.rsi} -\alias{autoplot.rsi} -\alias{fortify.rsi} -\title{Plotting for Classes \code{rsi}, \code{mic} and \code{disk}} +\alias{plot.sir} +\alias{autoplot.sir} +\alias{fortify.sir} +\title{Plotting for Classes \code{sir}, \code{mic} and \code{disk}} \usage{ \method{plot}{mic}( x, @@ -21,7 +21,7 @@ main = deparse(substitute(x)), ylab = "Frequency", xlab = "Minimum Inhibitory Concentration (mg/L)", - colours_RSI = c("#ED553B", "#3CAEA3", "#F6D55C"), + colours_SIR = c("#3CAEA3", "#F6D55C", "#ED553B"), language = get_AMR_locale(), expand = TRUE, ... @@ -35,7 +35,7 @@ title = deparse(substitute(object)), ylab = "Frequency", xlab = "Minimum Inhibitory Concentration (mg/L)", - colours_RSI = c("#ED553B", "#3CAEA3", "#F6D55C"), + colours_SIR = c("#3CAEA3", "#F6D55C", "#ED553B"), language = get_AMR_locale(), expand = TRUE, ... @@ -51,7 +51,7 @@ mo = NULL, ab = NULL, guideline = "EUCAST", - colours_RSI = c("#ED553B", "#3CAEA3", "#F6D55C"), + colours_SIR = c("#3CAEA3", "#F6D55C", "#ED553B"), language = get_AMR_locale(), expand = TRUE, ... @@ -65,7 +65,7 @@ ylab = "Frequency", xlab = "Disk diffusion diameter (mm)", guideline = "EUCAST", - colours_RSI = c("#ED553B", "#3CAEA3", "#F6D55C"), + colours_SIR = c("#3CAEA3", "#F6D55C", "#ED553B"), language = get_AMR_locale(), expand = TRUE, ... @@ -73,7 +73,7 @@ \method{fortify}{disk}(object, ...) -\method{plot}{rsi}( +\method{plot}{sir}( x, ylab = "Percentage", xlab = "Antimicrobial Interpretation", @@ -82,20 +82,20 @@ ... ) -\method{autoplot}{rsi}( +\method{autoplot}{sir}( object, title = deparse(substitute(object)), xlab = "Antimicrobial Interpretation", ylab = "Frequency", - colours_RSI = c("#ED553B", "#3CAEA3", "#F6D55C"), + colours_SIR = c("#3CAEA3", "#F6D55C", "#ED553B"), language = get_AMR_locale(), ... ) -\method{fortify}{rsi}(object, ...) +\method{fortify}{sir}(object, ...) } \arguments{ -\item{x, object}{values created with \code{\link[=as.mic]{as.mic()}}, \code{\link[=as.disk]{as.disk()}} or \code{\link[=as.rsi]{as.rsi()}} (or their \verb{random_*} variants, such as \code{\link[=random_mic]{random_mic()}})} +\item{x, object}{values created with \code{\link[=as.mic]{as.mic()}}, \code{\link[=as.disk]{as.disk()}} or \code{\link[=as.sir]{as.sir()}} (or their \verb{random_*} variants, such as \code{\link[=random_mic]{random_mic()}})} \item{mo}{any (vector of) text that can be coerced to a valid microorganism code with \code{\link[=as.mo]{as.mo()}}} @@ -107,7 +107,7 @@ \item{xlab, ylab}{axis title} -\item{colours_RSI}{colours to use for filling in the bars, must be a vector of three values (in the order R, S and I). The default colours are colour-blind friendly.} +\item{colours_SIR}{colours to use for filling in the bars, must be a vector of three values (in the order S, I and R). The default colours are colour-blind friendly.} \item{language}{language to be used to translate 'Susceptible', 'Increased exposure'/'Intermediate' and 'Resistant', defaults to system language (see \code{\link[=get_AMR_locale]{get_AMR_locale()}}) and can be overwritten by setting the option \code{AMR_locale}, e.g. \code{options(AMR_locale = "de")}, see \link{translate}. Use \code{language = NULL} or \code{language = ""} to prevent translation.} @@ -121,7 +121,7 @@ The \code{autoplot()} functions return a \code{\link[ggplot2:ggplot]{ggplot}} mo The \code{fortify()} functions return a \link{data.frame} as an extension for usage in the \code{\link[ggplot2:ggplot]{ggplot2::ggplot()}} function. } \description{ -Functions to plot classes \code{rsi}, \code{mic} and \code{disk}, with support for base \R and \code{ggplot2}. +Functions to plot classes \code{sir}, \code{mic} and \code{disk}, with support for base \R and \code{ggplot2}. } \details{ The interpretation of "I" will be named "Increased exposure" for all EUCAST guidelines since 2019, and will be named "Intermediate" in all other cases. @@ -133,11 +133,11 @@ Simply using \code{"CLSI"} or \code{"EUCAST"} as input will automatically select \examples{ some_mic_values <- random_mic(size = 100) some_disk_values <- random_disk(size = 100, mo = "Escherichia coli", ab = "cipro") -some_rsi_values <- random_rsi(50, prob_RSI = c(0.30, 0.55, 0.05)) +some_sir_values <- random_sir(50, prob_SIR = c(0.55, 0.05, 0.30)) plot(some_mic_values) plot(some_disk_values) -plot(some_rsi_values) +plot(some_sir_values) # when providing the microorganism and antibiotic, colours will show interpretations: plot(some_mic_values, mo = "S. aureus", ab = "ampicillin") @@ -152,7 +152,7 @@ if (require("ggplot2")) { autoplot(some_disk_values, mo = "Escherichia coli", ab = "cipro") } if (require("ggplot2")) { - autoplot(some_rsi_values) + autoplot(some_sir_values) } } } diff --git a/man/proportion.Rd b/man/proportion.Rd index f168b9a0f..419089c8f 100755 --- a/man/proportion.Rd +++ b/man/proportion.Rd @@ -1,18 +1,18 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/proportion.R, R/rsi_df.R +% Please edit documentation in R/proportion.R, R/sir_df.R \name{proportion} \alias{proportion} \alias{resistance} \alias{portion} \alias{susceptibility} -\alias{rsi_confidence_interval} +\alias{sir_confidence_interval} \alias{proportion_R} \alias{proportion_IR} \alias{proportion_I} \alias{proportion_SI} \alias{proportion_S} \alias{proportion_df} -\alias{rsi_df} +\alias{sir_df} \title{Calculate Microbial Resistance} \source{ \strong{M39 Analysis and Presentation of Cumulative Antimicrobial Susceptibility Test Data, 5th Edition}, 2022, \emph{Clinical and Laboratory Standards Institute (CLSI)}. \url{https://clsi.org/standards/products/microbiology/documents/m39/}. @@ -22,7 +22,7 @@ resistance(..., minimum = 30, as_percent = FALSE, only_all_tested = FALSE) susceptibility(..., minimum = 30, as_percent = FALSE, only_all_tested = FALSE) -rsi_confidence_interval( +sir_confidence_interval( ..., ab_result = "R", minimum = 30, @@ -52,7 +52,7 @@ proportion_df( confidence_level = 0.95 ) -rsi_df( +sir_df( data, translate_ab = "name", language = get_AMR_locale(), @@ -63,7 +63,7 @@ rsi_df( ) } \arguments{ -\item{...}{one or more vectors (or columns) with antibiotic interpretations. They will be transformed internally with \code{\link[=as.rsi]{as.rsi()}} if needed. Use multiple columns to calculate (the lack of) co-resistance: the probability where one of two drugs have a resistant or susceptible result. See \emph{Examples}.} +\item{...}{one or more vectors (or columns) with antibiotic interpretations. They will be transformed internally with \code{\link[=as.sir]{as.sir()}} if needed. Use multiple columns to calculate (the lack of) co-resistance: the probability where one of two drugs have a resistant or susceptible result. See \emph{Examples}.} \item{minimum}{the minimum allowed number of available (tested) isolates. Any isolate count lower than \code{minimum} will return \code{NA} with a warning. The default number of \code{30} isolates is advised by the Clinical and Laboratory Standards Institute (CLSI) as best practice, see \emph{Source}.} @@ -71,13 +71,13 @@ rsi_df( \item{only_all_tested}{(for combination therapies, i.e. using more than one variable for \code{...}): a \link{logical} to indicate that isolates must be tested for all antibiotics, see section \emph{Combination Therapy} below} -\item{ab_result}{antibiotic results to test against, must be one of more values of "R", "S", "I"} +\item{ab_result}{antibiotic results to test against, must be one or more values of "S", "I", or "R"} \item{confidence_level}{the confidence level for the returned confidence interval. For the calculation, the number of S or SI isolates, and R isolates are compared with the total number of available isolates with R, S, or I by using \code{\link[=binom.test]{binom.test()}}, i.e., the Clopper-Pearson method.} \item{side}{the side of the confidence interval to return. Defaults to \code{"both"} for a length 2 vector, but can also be (abbreviated as) \code{"min"}/\code{"left"}/\code{"lower"}/\code{"less"} or \code{"max"}/\code{"right"}/\code{"higher"}/\code{"greater"}.} -\item{data}{a \link{data.frame} containing columns with class \code{\link{rsi}} (see \code{\link[=as.rsi]{as.rsi()}})} +\item{data}{a \link{data.frame} containing columns with class \code{\link{sir}} (see \code{\link[=as.sir]{as.sir()}})} \item{translate_ab}{a column name of the \link{antibiotics} data set to translate the antibiotic abbreviations to, using \code{\link[=ab_property]{ab_property()}}} @@ -96,13 +96,13 @@ These functions can be used to calculate the (co-)resistance or susceptibility o \details{ 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()}}. -Use \code{\link[=rsi_confidence_interval]{rsi_confidence_interval()}} to calculate the confidence interval, which relies on \code{\link[=binom.test]{binom.test()}}, i.e., the Clopper-Pearson method. This function returns a vector of length 2 at default for antimicrobial \emph{resistance}. Change the \code{side} argument to "left"/"min" or "right"/"max" to return a single value, and change the \code{ab_result} argument to e.g. \code{c("S", "I")} to test for antimicrobial \emph{susceptibility}, see Examples. +Use \code{\link[=sir_confidence_interval]{sir_confidence_interval()}} to calculate the confidence interval, which relies on \code{\link[=binom.test]{binom.test()}}, i.e., the Clopper-Pearson method. This function returns a vector of length 2 at default for antimicrobial \emph{resistance}. Change the \code{side} argument to "left"/"min" or "right"/"max" to return a single value, and change the \code{ab_result} argument to e.g. \code{c("S", "I")} to test for antimicrobial \emph{susceptibility}, see Examples. \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. These functions are not meant to count isolates, but to calculate the proportion of resistance/susceptibility. Use the \code{\link[=count]{count()}} functions to count isolates. The function \code{\link[=susceptibility]{susceptibility()}} is essentially equal to \code{count_susceptible() / count_all()}. \emph{Low counts can influence the outcome - the \code{proportion} functions may camouflage this, since they only return the proportion (albeit being dependent on the \code{minimum} argument).} -The function \code{\link[=proportion_df]{proportion_df()}} takes any variable from \code{data} that has an \code{\link{rsi}} class (created with \code{\link[=as.rsi]{as.rsi()}}) and calculates the proportions R, I and S. It also supports grouped variables. The function \code{\link[=rsi_df]{rsi_df()}} works exactly like \code{\link[=proportion_df]{proportion_df()}}, but adds the number of isolates. +The function \code{\link[=proportion_df]{proportion_df()}} takes any variable from \code{data} that has an \code{\link{sir}} class (created with \code{\link[=as.sir]{as.sir()}}) and calculates the proportions S, I, and R. It also supports grouped variables. The function \code{\link[=sir_df]{sir_df()}} works exactly like \code{\link[=proportion_df]{proportion_df()}}, but adds the number of isolates. } \section{Combination Therapy}{ @@ -141,16 +141,19 @@ and that, in combination therapies, for \code{only_all_tested = FALSE} applies t Using \code{only_all_tested} has no impact when only using one antibiotic as input. } -\section{Interpretation of R and S/I}{ +\section{Interpretation of SIR}{ -In 2019, the European Committee on Antimicrobial Susceptibility Testing (EUCAST) has decided to change the definitions of susceptibility testing categories R and S/I as shown below (\url{https://www.eucast.org/newsiandr/}). +In 2019, the European Committee on Antimicrobial Susceptibility Testing (EUCAST) has decided to change the definitions of susceptibility testing categories S, I, and R as shown below (\url{https://www.eucast.org/newsiandr/}): \itemize{ +\item \strong{S - Susceptible, standard dosing regimen}\cr +A microorganism is categorised as "Susceptible, standard dosing regimen", when there is a high likelihood of therapeutic success using a standard dosing regimen of the agent. +\item \strong{I - Susceptible, increased exposure} \emph{\cr +A microorganism is categorised as "Susceptible, Increased exposure}" when there is a high likelihood of therapeutic success because exposure to the agent is increased by adjusting the dosing regimen or by its concentration at the site of infection. \item \strong{R = Resistant}\cr -A microorganism is categorised as \emph{Resistant} when there is a high likelihood of therapeutic failure even when there is increased exposure. Exposure is a function of how the mode of administration, dose, dosing interval, infusion time, as well as distribution and excretion of the antimicrobial agent will influence the infecting organism at the site of infection. -\item \strong{S = Susceptible}\cr -A microorganism is categorised as \emph{Susceptible, standard dosing regimen}, when there is a high likelihood of therapeutic success using a standard dosing regimen of the agent. -\item \strong{I = Susceptible, Increased exposure}\cr -A microorganism is categorised as \emph{Susceptible, Increased exposure} when there is a high likelihood of therapeutic success because exposure to the agent is increased by adjusting the dosing regimen or by its concentration at the site of infection. +A microorganism is categorised as "Resistant" when there is a high likelihood of therapeutic failure even when there is increased exposure. +\itemize{ +\item \emph{Exposure} is a function of how the mode of administration, dose, dosing interval, infusion time, as well as distribution and excretion of the antimicrobial agent will influence the infecting organism at the site of infection. +} } This AMR package honours this insight. Use \code{\link[=susceptibility]{susceptibility()}} (equal to \code{\link[=proportion_SI]{proportion_SI()}}) to determine antimicrobial susceptibility and \code{\link[=count_susceptible]{count_susceptible()}} (equal to \code{\link[=count_SI]{count_SI()}}) to count susceptible isolates. @@ -163,14 +166,14 @@ This AMR package honours this insight. Use \code{\link[=susceptibility]{suscepti # base R ------------------------------------------------------------ # determines \%R resistance(example_isolates$AMX) -rsi_confidence_interval(example_isolates$AMX) -rsi_confidence_interval(example_isolates$AMX, +sir_confidence_interval(example_isolates$AMX) +sir_confidence_interval(example_isolates$AMX, confidence_level = 0.975 ) # determines \%S+I: susceptibility(example_isolates$AMX) -rsi_confidence_interval(example_isolates$AMX, +sir_confidence_interval(example_isolates$AMX, ab_result = c("S", "I") ) @@ -188,16 +191,16 @@ if (require("dplyr")) { group_by(ward) \%>\% summarise( r = resistance(CIP), - n = n_rsi(CIP) - ) # n_rsi works like n_distinct in dplyr, see ?n_rsi + n = n_sir(CIP) + ) # n_sir works like n_distinct in dplyr, see ?n_sir } if (require("dplyr")) { example_isolates \%>\% group_by(ward) \%>\% summarise( cipro_R = resistance(CIP), - ci_min = rsi_confidence_interval(CIP, side = "min"), - ci_max = rsi_confidence_interval(CIP, side = "max"), + ci_min = sir_confidence_interval(CIP, side = "min"), + ci_max = sir_confidence_interval(CIP, side = "max"), ) } if (require("dplyr")) { @@ -218,7 +221,7 @@ if (require("dplyr")) { R = resistance(CIP, as_percent = TRUE), SI = susceptibility(CIP, as_percent = TRUE), n1 = count_all(CIP), # the actual total; sum of all three - n2 = n_rsi(CIP), # same - analogous to n_distinct + n2 = n_sir(CIP), # same - analogous to n_distinct total = n() ) # NOT the number of tested isolates! @@ -261,17 +264,17 @@ if (require("dplyr")) { combination_n = count_all(CIP, GEN) ) - # Get proportions S/I/R immediately of all rsi columns + # Get proportions S/I/R immediately of all sir columns example_isolates \%>\% select(AMX, CIP) \%>\% proportion_df(translate = FALSE) # It also supports grouping variables - # (use rsi_df to also include the count) + # (use sir_df to also include the count) example_isolates \%>\% select(ward, AMX, CIP) \%>\% group_by(ward) \%>\% - rsi_df(translate = FALSE) + sir_df(translate = FALSE) } } } diff --git a/man/random.Rd b/man/random.Rd index d5325e9b3..87b7a82fa 100755 --- a/man/random.Rd +++ b/man/random.Rd @@ -4,14 +4,14 @@ \alias{random} \alias{random_mic} \alias{random_disk} -\alias{random_rsi} -\title{Random MIC Values/Disk Zones/RSI Generation} +\alias{random_sir} +\title{Random MIC Values/Disk Zones/SIR Generation} \usage{ random_mic(size = NULL, mo = NULL, ab = NULL, ...) random_disk(size = NULL, mo = NULL, ab = NULL, ...) -random_rsi(size = NULL, prob_RSI = c(0.33, 0.33, 0.33), ...) +random_sir(size = NULL, prob_SIR = c(0.33, 0.33, 0.33), ...) } \arguments{ \item{size}{desired size of the returned vector. If used in a \link{data.frame} call or \code{dplyr} verb, will get the current (group) size if left blank.} @@ -22,7 +22,7 @@ random_rsi(size = NULL, prob_RSI = c(0.33, 0.33, 0.33), ...) \item{...}{ignored, only in place to allow future extensions} -\item{prob_RSI}{a vector of length 3: the probabilities for "R" (1st value), "S" (2nd value) and "I" (3rd value)} +\item{prob_SIR}{a vector of length 3: the probabilities for "S" (1st value), "I" (2nd value) and "R" (3rd value)} } \value{ class \code{mic} for \code{\link[=random_mic]{random_mic()}} (see \code{\link[=as.mic]{as.mic()}}) and class \code{disk} for \code{\link[=random_disk]{random_disk()}} (see \code{\link[=as.disk]{as.disk()}}) @@ -33,12 +33,12 @@ These functions can be used for generating random MIC values and disk diffusion \details{ The base \R function \code{\link[=sample]{sample()}} is used for generating values. -Generated values are based on the EUCAST 2022 guideline as implemented in the \link{rsi_translation} data set. To create specific generated values per bug or drug, set the \code{mo} and/or \code{ab} argument. +Generated values are based on the EUCAST 2022 guideline as implemented in the \link{clinical_breakpoints} data set. To create specific generated values per bug or drug, set the \code{mo} and/or \code{ab} argument. } \examples{ random_mic(25) random_disk(25) -random_rsi(25) +random_sir(25) \donttest{ # make the random generation more realistic by setting a bug and/or drug: diff --git a/man/resistance_predict.Rd b/man/resistance_predict.Rd index e05e3d536..4f253e0bb 100755 --- a/man/resistance_predict.Rd +++ b/man/resistance_predict.Rd @@ -2,9 +2,9 @@ % Please edit documentation in R/resistance_predict.R \name{resistance_predict} \alias{resistance_predict} -\alias{rsi_predict} +\alias{sir_predict} \alias{plot.resistance_predict} -\alias{ggplot_rsi_predict} +\alias{ggplot_sir_predict} \alias{autoplot.resistance_predict} \title{Predict Antimicrobial Resistance} \usage{ @@ -23,7 +23,7 @@ resistance_predict( ... ) -rsi_predict( +sir_predict( x, col_ab, col_date = NULL, @@ -40,7 +40,7 @@ rsi_predict( \method{plot}{resistance_predict}(x, main = paste("Resistance Prediction of", x_name), ...) -ggplot_rsi_predict( +ggplot_sir_predict( x, main = paste("Resistance Prediction of", x_name), ribbon = TRUE, @@ -110,16 +110,19 @@ Valid options for the statistical model (argument \code{model}) are: \item \code{"lin"} or \code{"linear"}: a linear regression model } } -\section{Interpretation of R and S/I}{ +\section{Interpretation of SIR}{ -In 2019, the European Committee on Antimicrobial Susceptibility Testing (EUCAST) has decided to change the definitions of susceptibility testing categories R and S/I as shown below (\url{https://www.eucast.org/newsiandr/}). +In 2019, the European Committee on Antimicrobial Susceptibility Testing (EUCAST) has decided to change the definitions of susceptibility testing categories S, I, and R as shown below (\url{https://www.eucast.org/newsiandr/}): \itemize{ +\item \strong{S - Susceptible, standard dosing regimen}\cr +A microorganism is categorised as "Susceptible, standard dosing regimen", when there is a high likelihood of therapeutic success using a standard dosing regimen of the agent. +\item \strong{I - Susceptible, increased exposure} \emph{\cr +A microorganism is categorised as "Susceptible, Increased exposure}" when there is a high likelihood of therapeutic success because exposure to the agent is increased by adjusting the dosing regimen or by its concentration at the site of infection. \item \strong{R = Resistant}\cr -A microorganism is categorised as \emph{Resistant} when there is a high likelihood of therapeutic failure even when there is increased exposure. Exposure is a function of how the mode of administration, dose, dosing interval, infusion time, as well as distribution and excretion of the antimicrobial agent will influence the infecting organism at the site of infection. -\item \strong{S = Susceptible}\cr -A microorganism is categorised as \emph{Susceptible, standard dosing regimen}, when there is a high likelihood of therapeutic success using a standard dosing regimen of the agent. -\item \strong{I = Susceptible, Increased exposure}\cr -A microorganism is categorised as \emph{Susceptible, Increased exposure} when there is a high likelihood of therapeutic success because exposure to the agent is increased by adjusting the dosing regimen or by its concentration at the site of infection. +A microorganism is categorised as "Resistant" when there is a high likelihood of therapeutic failure even when there is increased exposure. +\itemize{ +\item \emph{Exposure} is a function of how the mode of administration, dose, dosing interval, infusion time, as well as distribution and excretion of the antimicrobial agent will influence the infecting organism at the site of infection. +} } This AMR package honours this insight. Use \code{\link[=susceptibility]{susceptibility()}} (equal to \code{\link[=proportion_SI]{proportion_SI()}}) to determine antimicrobial susceptibility and \code{\link[=count_susceptible]{count_susceptible()}} (equal to \code{\link[=count_SI]{count_SI()}}) to count susceptible isolates. @@ -134,7 +137,7 @@ x <- resistance_predict(example_isolates, plot(x) \donttest{ if (require("ggplot2")) { - ggplot_rsi_predict(x) + ggplot_sir_predict(x) } # using dplyr: diff --git a/vignettes/AMR.Rmd b/vignettes/AMR.Rmd index a394d9c1d..25da5af9a 100755 --- a/vignettes/AMR.Rmd +++ b/vignettes/AMR.Rmd @@ -33,7 +33,7 @@ Conducting AMR data analysis unfortunately requires in-depth knowledge from diff * Good questions (always start with those!) * A thorough understanding of (clinical) epidemiology, to understand the clinical and epidemiological relevance and possible bias of results * A thorough understanding of (clinical) microbiology/infectious diseases, to understand which microorganisms are causal to which infections and the implications of pharmaceutical treatment, as well as understanding intrinsic and acquired microbial resistance -* Experience with data analysis with microbiological tests and their results, to understand the determination and limitations of MIC values and their interpretations to RSI values +* Experience with data analysis with microbiological tests and their results, to understand the determination and limitations of MIC values and their interpretations to SIR values * Availability of the biological taxonomy of microorganisms and probably normalisation factors for pharmaceuticals, such as defined daily doses (DDD) * Available (inter-)national guidelines, and profound methods to apply them @@ -122,7 +122,7 @@ bacteria <- c( ## Put everything together -Using the `sample()` function, we can randomly select items from all objects we defined earlier. To let our fake data reflect reality a bit, we will also approximately define the probabilities of bacteria and the antibiotic results, using the `random_rsi()` function. +Using the `sample()` function, we can randomly select items from all objects we defined earlier. To let our fake data reflect reality a bit, we will also approximately define the probabilities of bacteria and the antibiotic results, using the `random_sir()` function. ```{r merge data} sample_size <- 20000 @@ -142,10 +142,10 @@ data <- data.frame( size = sample_size, replace = TRUE, prob = c(0.50, 0.25, 0.15, 0.10) ), - AMX = random_rsi(sample_size, prob_RSI = c(0.35, 0.60, 0.05)), - AMC = random_rsi(sample_size, prob_RSI = c(0.15, 0.75, 0.10)), - CIP = random_rsi(sample_size, prob_RSI = c(0.20, 0.80, 0.00)), - GEN = random_rsi(sample_size, prob_RSI = c(0.08, 0.92, 0.00)) + AMX = random_sir(sample_size, prob_sir = c(0.35, 0.60, 0.05)), + AMC = random_sir(sample_size, prob_sir = c(0.15, 0.75, 0.10)), + CIP = random_sir(sample_size, prob_sir = c(0.20, 0.80, 0.00)), + GEN = random_sir(sample_size, prob_sir = c(0.08, 0.92, 0.00)) ) ``` @@ -186,14 +186,14 @@ data <- data %>% mutate(bacteria = as.mo(bacteria)) ``` -We also want to transform the antibiotics, because in real life data we don't know if they are really clean. The `as.rsi()` function ensures reliability and reproducibility in these kind of variables. The `is.rsi.eligible()` can check which columns are probably columns with R/SI test results. Using `mutate()` and `across()`, we can apply the transformation to the formal `` class: +We also want to transform the antibiotics, because in real life data we don't know if they are really clean. The `as.sir()` function ensures reliability and reproducibility in these kind of variables. The `is_sir_eligible()` can check which columns are probably columns with SIR test results. Using `mutate()` and `across()`, we can apply the transformation to the formal `` class: ```{r transform abx} -is.rsi.eligible(data) -colnames(data)[is.rsi.eligible(data)] +is_sir_eligible(data) +colnames(data)[is_sir_eligible(data)] data <- data %>% - mutate(across(where(is.rsi.eligible), as.rsi)) + mutate(across(where(is_sir_eligible), as.sir)) ``` Finally, we will apply [EUCAST rules](https://www.eucast.org/expert_rules_and_intrinsic_resistance/) on our antimicrobial results. In Europe, most medical microbiological laboratories already apply these rules. Our package features their latest insights on intrinsic resistance and exceptional phenotypes. Moreover, the `eucast_rules()` function can also apply additional rules, like forcing ampicillin = R when amoxicillin/clavulanic acid = R. @@ -360,14 +360,14 @@ data_1st %>% knitr::kable(align = "c", big.mark = ",") ``` -Of course it would be very convenient to know the number of isolates responsible for the percentages. For that purpose the `n_rsi()` can be used, which works exactly like `n_distinct()` from the `dplyr` package. It counts all isolates available for every group (i.e. values S, I or R): +Of course it would be very convenient to know the number of isolates responsible for the percentages. For that purpose the `n_sir()` can be used, which works exactly like `n_distinct()` from the `dplyr` package. It counts all isolates available for every group (i.e. values S, I or R): ```{r, eval = FALSE} data_1st %>% group_by(hospital) %>% summarise( amoxicillin = resistance(AMX), - available = n_rsi(AMX) + available = n_sir(AMX) ) ``` ```{r, echo = FALSE} @@ -375,7 +375,7 @@ data_1st %>% group_by(hospital) %>% summarise( amoxicillin = resistance(AMX), - available = n_rsi(AMX) + available = n_sir(AMX) ) %>% knitr::kable(align = "c", big.mark = ",") ``` @@ -469,11 +469,11 @@ ggplot(a_data_set) + geom_bar(aes(year)) ``` -The `AMR` package contains functions to extend this `ggplot2` package, for example `geom_rsi()`. It automatically transforms data with `count_df()` or `proportion_df()` and show results in stacked bars. Its simplest and shortest example: +The `AMR` package contains functions to extend this `ggplot2` package, for example `geom_sir()`. It automatically transforms data with `count_df()` or `proportion_df()` and show results in stacked bars. Its simplest and shortest example: ```{r plot 3} ggplot(data_1st) + - geom_rsi(translate_ab = FALSE) + geom_sir(translate_ab = FALSE) ``` Omit the `translate_ab = FALSE` to have the antibiotic codes (AMX, AMC, CIP, GEN) translated to official WHO names (amoxicillin, amoxicillin/clavulanic acid, ciprofloxacin, gentamicin). @@ -484,13 +484,13 @@ If we group on e.g. the `genus` column and add some additional functions from ou # group the data on `genus` ggplot(data_1st %>% group_by(genus)) + # create bars with genus on x axis - # it looks for variables with class `rsi`, - # of which we have 4 (earlier created with `as.rsi`) - geom_rsi(x = "genus") + + # it looks for variables with class `sir`, + # of which we have 4 (earlier created with `as.sir`) + geom_sir(x = "genus") + # split plots on antibiotic - facet_rsi(facet = "antibiotic") + - # set colours to the R/SI interpretations (colour-blind friendly) - scale_rsi_colours() + + facet_sir(facet = "antibiotic") + + # set colours to the SIR interpretations (colour-blind friendly) + scale_sir_colours() + # show percentages on y axis scale_y_percent(breaks = 0:4 * 25) + # turn 90 degrees, to make it bars instead of columns @@ -505,12 +505,12 @@ ggplot(data_1st %>% group_by(genus)) + theme(axis.text.y = element_text(face = "italic")) ``` -To simplify this, we also created the `ggplot_rsi()` function, which combines almost all above functions: +To simplify this, we also created the `ggplot_sir()` function, which combines almost all above functions: ```{r plot 5} data_1st %>% group_by(genus) %>% - ggplot_rsi( + ggplot_sir( x = "genus", facet = "antibiotic", breaks = 0:4 * 25, diff --git a/vignettes/MDR.Rmd b/vignettes/MDR.Rmd index 8fafd561c..b47fc086e 100644 --- a/vignettes/MDR.Rmd +++ b/vignettes/MDR.Rmd @@ -111,16 +111,16 @@ example_isolates %>% For another example, I will create a data set to determine multi-drug resistant TB: ```{r} -# random_rsi() is a helper function to generate +# random_sir() is a helper function to generate # a random vector with values S, I and R my_TB_data <- data.frame( - rifampicin = random_rsi(5000), - isoniazid = random_rsi(5000), - gatifloxacin = random_rsi(5000), - ethambutol = random_rsi(5000), - pyrazinamide = random_rsi(5000), - moxifloxacin = random_rsi(5000), - kanamycin = random_rsi(5000) + rifampicin = random_sir(5000), + isoniazid = random_sir(5000), + gatifloxacin = random_sir(5000), + ethambutol = random_sir(5000), + pyrazinamide = random_sir(5000), + moxifloxacin = random_sir(5000), + kanamycin = random_sir(5000) ) ``` @@ -128,13 +128,13 @@ Because all column names are automatically verified for valid drug names or code ```{r, eval = FALSE} my_TB_data <- data.frame( - RIF = random_rsi(5000), - INH = random_rsi(5000), - GAT = random_rsi(5000), - ETH = random_rsi(5000), - PZA = random_rsi(5000), - MFX = random_rsi(5000), - KAN = random_rsi(5000) + RIF = random_sir(5000), + INH = random_sir(5000), + GAT = random_sir(5000), + ETH = random_sir(5000), + PZA = random_sir(5000), + MFX = random_sir(5000), + KAN = random_sir(5000) ) ``` diff --git a/vignettes/PCA.Rmd b/vignettes/PCA.Rmd index 3f31a5d43..508baba54 100755 --- a/vignettes/PCA.Rmd +++ b/vignettes/PCA.Rmd @@ -44,7 +44,7 @@ resistance_data <- example_isolates %>% order = mo_order(mo), # group on anything, like order genus = mo_genus(mo) ) %>% # and genus as we do here - summarise_if(is.rsi, resistance) %>% # then get resistance of all drugs + summarise_if(is.sir, resistance) %>% # then get resistance of all drugs select( order, genus, AMC, CXM, CTX, CAZ, GEN, TOB, TMP, SXT diff --git a/vignettes/WHONET.Rmd b/vignettes/WHONET.Rmd index b4f38f6d3..2a8e48814 100644 --- a/vignettes/WHONET.Rmd +++ b/vignettes/WHONET.Rmd @@ -48,15 +48,15 @@ library(cleaner) # to create frequency tables We will have to transform some variables to simplify and automate the analysis: * Microorganisms should be transformed to our own microorganism codes (called an `mo`) using [our Catalogue of Life reference data set](https://msberends.github.io/AMR/reference/catalogue_of_life), which contains all ~70,000 microorganisms from the taxonomic kingdoms Bacteria, Fungi and Protozoa. We do the tranformation with `as.mo()`. This function also recognises almost all WHONET abbreviations of microorganisms. -* Antimicrobial results or interpretations have to be clean and valid. In other words, they should only contain values `"S"`, `"I"` or `"R"`. That is exactly where the `as.rsi()` function is for. +* Antimicrobial results or interpretations have to be clean and valid. In other words, they should only contain values `"S"`, `"I"` or `"R"`. That is exactly where the `as.sir()` function is for. ```{r} # transform variables data <- WHONET %>% # get microbial ID based on given organism mutate(mo = as.mo(Organism)) %>% - # transform everything from "AMP_ND10" to "CIP_EE" to the new `rsi` class - mutate_at(vars(AMP_ND10:CIP_EE), as.rsi) + # transform everything from "AMP_ND10" to "CIP_EE" to the new `sir` class + mutate_at(vars(AMP_ND10:CIP_EE), as.sir) ``` No errors or warnings, so all values are transformed succesfully. @@ -77,13 +77,13 @@ data %>% freq(AMC_ND2) ### A first glimpse at results -An easy `ggplot` will already give a lot of information, using the included `ggplot_rsi()` function: +An easy `ggplot` will already give a lot of information, using the included `ggplot_sir()` function: ```{r, eval = FALSE} data %>% group_by(Country) %>% select(Country, AMP_ND2, AMC_ED20, CAZ_ED10, CIP_ED5) %>% - ggplot_rsi(translate_ab = "ab", facet = "Country", datalabels = FALSE) + ggplot_sir(translate_ab = "ab", facet = "Country", datalabels = FALSE) ``` ```{r, echo = FALSE} @@ -91,7 +91,7 @@ data %>% tryCatch(data %>% group_by(Country) %>% select(Country, AMP_ND2, AMC_ED20, CAZ_ED10, CIP_ED5) %>% - ggplot_rsi(translate_ab = "ab", facet = "Country", datalabels = FALSE) %>% + ggplot_sir(translate_ab = "ab", facet = "Country", datalabels = FALSE) %>% print(), error = function(e) base::invisible() ) diff --git a/vignettes/datasets.Rmd b/vignettes/datasets.Rmd index e7ee87ab0..8abb3d354 100644 --- a/vignettes/datasets.Rmd +++ b/vignettes/datasets.Rmd @@ -111,7 +111,7 @@ print_df <- function(x, rows = 6) { } ``` -All reference data (about microorganisms, antibiotics, R/SI interpretation, EUCAST rules, etc.) in this `AMR` package are reliable, up-to-date and freely available. We continually export our data sets to formats for use in R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. We also provide tab-separated text files that are machine-readable and suitable for input in any software program, such as laboratory information systems. +All reference data (about microorganisms, antibiotics, SIR interpretation, EUCAST rules, etc.) in this `AMR` package are reliable, up-to-date and freely available. We continually export our data sets to formats for use in R, MS Excel, Apache Feather, Apache Parquet, SPSS, SAS, and Stata. We also provide tab-separated text files that are machine-readable and suitable for input in any software program, such as laboratory information systems. On this page, we explain how to download them and how the structure of the data sets look like. @@ -209,22 +209,22 @@ antivirals %>% print_df() ``` -## `rsi_translation`: Interpretation from MIC values / disk diameters to R/SI +## `clinical_breakpoints`: Interpretation from MIC values & disk diameters to SIR -`r structure_txt(rsi_translation)` +`r structure_txt(clinical_breakpoints)` -This data set is in R available as `rsi_translation`, after you load the `AMR` package. +This data set is in R available as `clinical_breakpoints`, after you load the `AMR` package. -`r download_txt("rsi_translation")` +`r download_txt("clinical_breakpoints")` ### Source -This data set contains interpretation rules for MIC values and disk diffusion diameters. Included guidelines are CLSI (`r min(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "CLSI")$guideline)))`-`r max(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "CLSI")$guideline)))`) and EUCAST (`r min(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "EUCAST")$guideline)))`-`r max(as.integer(gsub("[^0-9]", "", subset(rsi_translation, guideline %like% "EUCAST")$guideline)))`). +This data set contains interpretation rules for MIC values and disk diffusion diameters. Included guidelines are CLSI (`r min(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "CLSI")$guideline)))`-`r max(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "CLSI")$guideline)))`) and EUCAST (`r min(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "EUCAST")$guideline)))`-`r max(as.integer(gsub("[^0-9]", "", subset(clinical_breakpoints, guideline %like% "EUCAST")$guideline)))`). ### Example content ```{r, echo = FALSE} -rsi_translation %>% +clinical_breakpoints %>% mutate(mo_name = mo_name(mo, language = NULL), .after = mo) %>% mutate(ab_name = ab_name(ab, language = NULL), .after = ab) %>% print_df() diff --git a/vignettes/resistance_predict.Rmd b/vignettes/resistance_predict.Rmd index 97d0cd75d..62244de5a 100755 --- a/vignettes/resistance_predict.Rmd +++ b/vignettes/resistance_predict.Rmd @@ -80,13 +80,13 @@ plot(predict_TZP) This is the fastest way to plot the result. It automatically adds the right axes, error bars, titles, number of available observations and type of model. -We also support the `ggplot2` package with our custom function `ggplot_rsi_predict()` to create more appealing plots: +We also support the `ggplot2` package with our custom function `ggplot_sir_predict()` to create more appealing plots: ```{r} -ggplot_rsi_predict(predict_TZP) +ggplot_sir_predict(predict_TZP) # choose for error bars instead of a ribbon -ggplot_rsi_predict(predict_TZP, ribbon = FALSE) +ggplot_sir_predict(predict_TZP, ribbon = FALSE) ``` ### Choosing the right model @@ -97,7 +97,7 @@ Resistance is not easily predicted; if we look at vancomycin resistance in Gram- example_isolates %>% filter(mo_gramstain(mo, language = NULL) == "Gram-positive") %>% resistance_predict(col_ab = "VAN", year_min = 2010, info = FALSE, model = "binomial") %>% - ggplot_rsi_predict() + ggplot_sir_predict() ``` Vancomycin resistance could be 100% in ten years, but might remain very low. @@ -118,7 +118,7 @@ For the vancomycin resistance in Gram-positive bacteria, a linear model might be example_isolates %>% filter(mo_gramstain(mo, language = NULL) == "Gram-positive") %>% resistance_predict(col_ab = "VAN", year_min = 2010, info = FALSE, model = "linear") %>% - ggplot_rsi_predict() + ggplot_sir_predict() ``` The model itself is also available from the object, as an `attribute`: diff --git a/vignettes/welcome_to_AMR.Rmd b/vignettes/welcome_to_AMR.Rmd index 3b9a9582d..c2d55a090 100644 --- a/vignettes/welcome_to_AMR.Rmd +++ b/vignettes/welcome_to_AMR.Rmd @@ -30,7 +30,7 @@ The `AMR` package is a [free and open-source](https://msberends.github.io/AMR/#c This work was published in the Journal of Statistical Software (Volume 104(3); [DOI 10.18637/jss.v104.i03](https://doi.org/10.18637/jss.v104.i03)) and formed the basis of two PhD theses ([DOI 10.33612/diss.177417131](https://doi.org/10.33612/diss.177417131) and [DOI 10.33612/diss.192486375](https://doi.org/10.33612/diss.192486375)). -After installing this package, R knows `r AMR:::format_included_data_number(AMR::microorganisms)` distinct microbial species and all `r AMR:::format_included_data_number(rbind(AMR::antibiotics[, "atc", drop = FALSE], AMR::antivirals[, "atc", drop = FALSE]))` antibiotic, antimycotic and antiviral drugs by name and code (including ATC, EARS-Net, ASIARS-Net, PubChem, LOINC and SNOMED CT), and knows all about valid R/SI and MIC values. The integral breakpoint guidelines from CLSI and EUCAST are included from the last 10 years. It supports and can read any data format, including WHONET data. +After installing this package, R knows `r AMR:::format_included_data_number(AMR::microorganisms)` distinct microbial species and all `r AMR:::format_included_data_number(rbind(AMR::antibiotics[, "atc", drop = FALSE], AMR::antivirals[, "atc", drop = FALSE]))` antibiotic, antimycotic and antiviral drugs by name and code (including ATC, EARS-Net, ASIARS-Net, PubChem, LOINC and SNOMED CT), and knows all about valid SIR and MIC values. The integral breakpoint guidelines from CLSI and EUCAST are included from the last 10 years. It supports and can read any data format, including WHONET data. The `AMR` package is available in English, Chinese, Danish, Dutch, French, German, Greek, Italian, Japanese, Polish, Portuguese, Russian, Spanish, Swedish, Turkish and Ukrainian. Antimicrobial drug (group) names and colloquial microorganism names are provided in these languages. @@ -52,10 +52,10 @@ This package can be used for: * Applying EUCAST expert rules * Getting SNOMED codes of a microorganism, or getting properties of a microorganism based on a SNOMED code * Getting LOINC codes of an antibiotic, or getting properties of an antibiotic based on a LOINC code - * Machine reading the EUCAST and CLSI guidelines from 2011-2020 to translate MIC values and disk diffusion diameters to R/SI + * Machine reading the EUCAST and CLSI guidelines from 2011-2020 to translate MIC values and disk diffusion diameters to SIR * Principal component analysis for AMR -All reference data sets (about microorganisms, antibiotics, R/SI interpretation, EUCAST rules, etc.) in this `AMR` package are publicly and freely available. We continually export our data sets to formats for use in R, SPSS, SAS, Stata and Excel. We also supply flat files that are machine-readable and suitable for input in any software program, such as laboratory information systems. Please find [all download links on our website](https://msberends.github.io/AMR/articles/datasets.html), which is automatically updated with every code change. +All reference data sets (about microorganisms, antibiotics, SIR interpretation, EUCAST rules, etc.) in this `AMR` package are publicly and freely available. We continually export our data sets to formats for use in R, SPSS, SAS, Stata and Excel. We also supply flat files that are machine-readable and suitable for input in any software program, such as laboratory information systems. Please find [all download links on our website](https://msberends.github.io/AMR/articles/datasets.html), which is automatically updated with every code change. This R package was created for both routine data analysis and academic research at the Faculty of Medical Sciences of the [University of Groningen](https://www.rug.nl), in collaboration with non-profit organisations [Certe Medical Diagnostics and Advice Foundation](https://www.certe.nl) and [University Medical Center Groningen](https://www.umcg.nl), and is being [actively and durably maintained](./news) by two public healthcare organisations in the Netherlands.