From 156d55089565ea66d14fa6d17a75c1116015bde2 Mon Sep 17 00:00:00 2001
From: "Matthijs S. Berends"
Date: Mon, 1 Jul 2019 14:03:15 +0200
Subject: [PATCH] (v0.7.1.9005) new rsi calculations, atc class removal
---
DESCRIPTION | 4 +-
NAMESPACE | 1 -
NEWS.md | 35 +-
R/count.R | 76 +--
R/mo.R | 110 ++--
R/mo_property.R | 46 +-
R/portion.R | 130 +++--
R/rsi.R | 6 +-
R/rsi_calc.R | 80 ++-
docs/LICENSE-text.html | 2 +-
docs/articles/AMR.html | 531 +++++++++---------
.../AMR_files/figure-html/plot 1-1.png | Bin 35967 -> 35905 bytes
.../AMR_files/figure-html/plot 3-1.png | Bin 18239 -> 18280 bytes
.../AMR_files/figure-html/plot 4-1.png | Bin 69957 -> 69952 bytes
.../AMR_files/figure-html/plot 5-1.png | Bin 43402 -> 43399 bytes
docs/articles/EUCAST.html | 4 +-
docs/articles/MDR.html | 58 +-
docs/articles/SPSS.html | 7 +-
docs/articles/WHONET.html | 4 +-
docs/articles/benchmarks.html | 72 +--
.../figure-html/unnamed-chunk-5-1.png | Bin 26497 -> 26580 bytes
docs/articles/freq.html | 4 +-
docs/articles/index.html | 2 +-
docs/articles/resistance_predict.html | 4 +-
docs/authors.html | 2 +-
docs/index.html | 2 +-
docs/news/index.html | 341 ++++++-----
docs/reference/AMR-deprecated.html | 2 +-
docs/reference/AMR.html | 2 +-
docs/reference/WHOCC.html | 2 +-
docs/reference/WHONET.html | 2 +-
docs/reference/ab_property.html | 2 +-
docs/reference/age.html | 2 +-
docs/reference/age_groups.html | 2 +-
docs/reference/antibiotics.html | 2 +-
docs/reference/as.ab.html | 2 +-
docs/reference/as.disk.html | 2 +-
docs/reference/as.mic.html | 2 +-
docs/reference/as.mo.html | 11 +-
docs/reference/as.rsi.html | 7 +-
docs/reference/atc_online.html | 2 +-
docs/reference/availability.html | 2 +-
docs/reference/catalogue_of_life.html | 2 +-
docs/reference/catalogue_of_life_version.html | 2 +-
docs/reference/count.html | 85 ++-
docs/reference/eucast_rules.html | 2 +-
docs/reference/extended-functions.html | 2 +-
docs/reference/filter_ab_class.html | 2 +-
docs/reference/first_isolate.html | 2 +-
docs/reference/freq.html | 2 +-
docs/reference/g.test.html | 2 +-
docs/reference/ggplot_rsi.html | 2 +-
docs/reference/guess_ab_col.html | 2 +-
docs/reference/index.html | 2 +-
docs/reference/join.html | 2 +-
docs/reference/key_antibiotics.html | 2 +-
docs/reference/kurtosis.html | 2 +-
docs/reference/like.html | 2 +-
docs/reference/mdro.html | 2 +-
docs/reference/microorganisms.codes.html | 2 +-
docs/reference/microorganisms.html | 2 +-
docs/reference/microorganisms.old.html | 2 +-
docs/reference/mo_property.html | 2 +-
docs/reference/mo_source.html | 2 +-
docs/reference/p.symbol.html | 2 +-
docs/reference/portion.html | 115 ++--
docs/reference/read.4D.html | 2 +-
docs/reference/resistance_predict.html | 2 +-
docs/reference/rsi_translation.html | 2 +-
docs/reference/septic_patients.html | 2 +-
docs/reference/skewness.html | 2 +-
docs/reference/translate.html | 2 +-
man/as.mo.Rd | 9 +-
man/as.rsi.Rd | 6 +-
man/count.Rd | 84 ++-
man/portion.Rd | 114 ++--
tests/testthat/test-count.R | 20 +-
tests/testthat/test-portion.R | 26 +-
78 files changed, 1169 insertions(+), 911 deletions(-)
diff --git a/DESCRIPTION b/DESCRIPTION
index 8cc41304..9e8cfbb5 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -1,6 +1,6 @@
Package: AMR
-Version: 0.7.1.9004
-Date: 2019-06-27
+Version: 0.7.1.9005
+Date: 2019-07-01
Title: Antimicrobial Resistance Analysis
Authors@R: c(
person(
diff --git a/NAMESPACE b/NAMESPACE
index 6963dd4b..e233f55e 100755
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -224,7 +224,6 @@ importFrom(crayon,black)
importFrom(crayon,blue)
importFrom(crayon,bold)
importFrom(crayon,green)
-importFrom(crayon,has_color)
importFrom(crayon,italic)
importFrom(crayon,magenta)
importFrom(crayon,red)
diff --git a/NEWS.md b/NEWS.md
index 48bdda46..ce8e8189 100755
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,11 +1,42 @@
-# AMR 0.7.1.9004
+# AMR 0.7.1.9005
+
+### New
+* Additional way to calculate co-resistance, i.e. when using multiple antibiotics as input for `portion_*` functions or `count_*` functions. This can be used to determine the empiric susceptibily of a combination therapy. A new parameter `only_all_tested` replaces the old `also_single_tested` and can be used to select one of the two methods to count isolates and calculate portions. The difference can be seen in this example table (which is also on the `portion` and `count` help pages), where the %SI is being determined:
+
+ ```r
+ # -------------------------------------------------------------------------
+ # only_all_tested = FALSE only_all_tested = TRUE
+ # Antibiotic Antibiotic ----------------------- -----------------------
+ # A B include as include as include as include as
+ # numerator denominator numerator denominator
+ # ---------- ---------- ---------- ----------- ---------- -----------
+ # S S X X X X
+ # I S X X X X
+ # R S X X X X
+ # not tested S X X - -
+ # S I X X X X
+ # I I X X X X
+ # R I X X X X
+ # not tested I X X - -
+ # S R X X X X
+ # I R X X X X
+ # R R - X - X
+ # not tested R - - - -
+ # S not tested X X - -
+ # I not tested X X - -
+ # R not tested - - - -
+ # not tested not tested - - - -
+ # -------------------------------------------------------------------------
+ ```
+
+ Since this is a major change, usage of the old `also_single_tested` will throw an informative error that it has been replaced by `only_all_tested`.
### Changed
* Removed class `atc` - using `as.atc()` is now deprecated in favour of `ab_atc()` and this will return a character, not the `atc` class anymore
* Removed deprecated functions `abname()`, `ab_official()`, `atc_name()`, `atc_official()`, `atc_property()`, `atc_tradenames()`, `atc_trivial_nl()`
* Fix and speed improvement for `mo_shortname()`
* Fix for `as.mo()` where misspelled input would not be understood
-* Fix for `also_single_tested` parameter in `count_*` functions
+* Fix for using `mo_*` functions where the coercion uncertainties and failures would not be available through `mo_uncertainties()` and `mo_failures()` anymore
# AMR 0.7.1
diff --git a/R/count.R b/R/count.R
index 641e31c2..0a03d22e 100755
--- a/R/count.R
+++ b/R/count.R
@@ -34,6 +34,7 @@
#' The function \code{count_df} takes any variable from \code{data} that has an \code{"rsi"} class (created with \code{\link{as.rsi}}) and counts the amounts of S, I and R. The resulting \emph{tidy data} (see Source) \code{data.frame} will have three rows (S/I/R) and a column for each variable with class \code{"rsi"}.
#'
#' The function \code{rsi_df} works exactly like \code{count_df}, but adds the percentage of S, I and R.
+#' @inheritSection portion Combination therapy
#' @source Wickham H. \strong{Tidy Data.} The Journal of Statistical Software, vol. 59, 2014. \url{http://vita.had.co.nz/papers/tidy-data.html}
#' @seealso \code{\link{portion}_*} to calculate microbial resistance and susceptibility.
#' @keywords resistance susceptibility rsi antibiotics isolate isolates
@@ -61,8 +62,8 @@
#' # Since n_rsi counts available isolates, you can
#' # calculate back to count e.g. non-susceptible isolates.
#' # This results in the same:
-#' count_IR(septic_patients$AMX)
-#' portion_IR(septic_patients$AMX) * n_rsi(septic_patients$AMX)
+#' count_SI(septic_patients$AMX)
+#' portion_SI(septic_patients$AMX) * n_rsi(septic_patients$AMX)
#'
#' library(dplyr)
#' septic_patients %>%
@@ -76,17 +77,17 @@
#'
#' # Count co-resistance between amoxicillin/clav acid and gentamicin,
#' # so we can see that combination therapy does a lot more than mono therapy.
-#' # Please mind that `portion_S` calculates percentages right away instead.
-#' count_S(septic_patients$AMC) # S = 1342 (71.4%)
-#' count_all(septic_patients$AMC) # n = 1879
+#' # Please mind that `portion_SI` calculates percentages right away instead.
+#' count_SI(septic_patients$AMC) # 1433
+#' count_all(septic_patients$AMC) # 1879
#'
-#' count_S(septic_patients$GEN) # S = 1372 (74.0%)
-#' count_all(septic_patients$GEN) # n = 1855
+#' count_SI(septic_patients$GEN) # 1399
+#' count_all(septic_patients$GEN) # 1855
#'
#' with(septic_patients,
-#' count_S(AMC, GEN)) # S = 1660 (92.3%)
-#' with(septic_patients, # n = 1798
-#' n_rsi(AMC, GEN))
+#' count_SI(AMC, GEN)) # 1764
+#' with(septic_patients,
+#' n_rsi(AMC, GEN)) # 1936
#'
#' # Get portions S/I/R immediately of all rsi columns
#' septic_patients %>%
@@ -99,71 +100,56 @@
#' group_by(hospital_id) %>%
#' count_df(translate = FALSE)
#'
-count_R <- function(..., also_single_tested = FALSE) {
+count_R <- function(..., only_all_tested = FALSE) {
rsi_calc(...,
- type = "R",
- include_I = FALSE,
- minimum = 0,
- as_percent = FALSE,
- also_single_tested = also_single_tested,
+ ab_result = "R",
+ only_all_tested = only_all_tested,
only_count = TRUE)
}
#' @rdname count
#' @export
-count_IR <- function(..., also_single_tested = FALSE) {
+count_IR <- function(..., only_all_tested = FALSE) {
rsi_calc(...,
- type = "R",
- include_I = TRUE,
- minimum = 0,
- as_percent = FALSE,
- also_single_tested = also_single_tested,
+ ab_result = c("I", "R"),
+ only_all_tested = only_all_tested,
only_count = TRUE)
}
#' @rdname count
#' @export
-count_I <- function(..., also_single_tested = FALSE) {
+count_I <- function(..., only_all_tested = FALSE) {
rsi_calc(...,
- type = "I",
- include_I = FALSE,
- minimum = 0,
- as_percent = FALSE,
- also_single_tested = also_single_tested,
+ ab_result = "I",
+ only_all_tested = only_all_tested,
only_count = TRUE)
}
#' @rdname count
#' @export
-count_SI <- function(..., also_single_tested = FALSE) {
+count_SI <- function(..., only_all_tested = FALSE) {
rsi_calc(...,
- type = "S",
- include_I = TRUE,
- minimum = 0,
- as_percent = FALSE,
- also_single_tested = also_single_tested,
+ ab_result = c("S", "I"),
+ only_all_tested = only_all_tested,
only_count = TRUE)
}
#' @rdname count
#' @export
-count_S <- function(..., also_single_tested = FALSE) {
+count_S <- function(..., only_all_tested = FALSE) {
rsi_calc(...,
- type = "S",
- include_I = FALSE,
- minimum = 0,
- as_percent = FALSE,
- also_single_tested = also_single_tested,
+ ab_result = "S",
+ only_all_tested = only_all_tested,
only_count = TRUE)
}
#' @rdname count
#' @export
-count_all <- function(..., also_single_tested = FALSE) {
- res_SI <- count_SI(..., also_single_tested = also_single_tested)
- # only print warnings once, if needed
- res_R <- suppressWarnings(count_R(..., also_single_tested = also_single_tested))
- res_SI + res_R
+count_all <- function(..., only_all_tested = FALSE) {
+ rsi_calc(...,
+ ab_result = c("S", "I", "R"),
+ only_all_tested = only_all_tested,
+ only_count = TRUE)
}
#' @rdname count
diff --git a/R/mo.R b/R/mo.R
index b1f5fbf3..605a6cc0 100755
--- a/R/mo.R
+++ b/R/mo.R
@@ -87,12 +87,9 @@
#' \strong{Uncertain results} \cr
#' The algorithm can additionally use three different levels of uncertainty to guess valid results. The default is \code{allow_uncertain = TRUE}, which is equal to uncertainty level 2. Using \code{allow_uncertain = FALSE} will skip all of these additional rules:
#' \itemize{
-#' \item{(uncertainty level 1): It tries to look for only matching genera}
-#' \item{(uncertainty level 1): It tries to look for previously accepted (but now invalid) taxonomic names}
-#' \item{(uncertainty level 2): It strips off values between brackets and the brackets itself, and re-evaluates the input with all previous rules}
-#' \item{(uncertainty level 2): It strips off words from the end one by one and re-evaluates the input with all previous rules}
-#' \item{(uncertainty level 3): It strips off words from the start one by one and re-evaluates the input with all previous rules}
-#' \item{(uncertainty level 3): It tries any part of the name}
+#' \item{(uncertainty level 1): It tries to look for only matching genera, previously accepted (but now invalid) taxonomic names and misspelled input}
+#' \item{(uncertainty level 2): It removed parts between brackets, strips off words from the end one by one and re-evaluates the input with all previous rules}
+#' \item{(uncertainty level 3): It strips off words from the start one by one and tries any part of the name}
#' }
#'
#' You can also use e.g. \code{as.mo(..., allow_uncertain = 1)} to only allow up to level 1 uncertainty.
@@ -281,7 +278,7 @@ is.mo <- function(x) {
#' @importFrom dplyr %>% pull left_join n_distinct progress_estimated filter distinct
#' @importFrom data.table data.table as.data.table setkey
-#' @importFrom crayon magenta red blue silver italic has_color
+#' @importFrom crayon magenta red blue silver italic
# param property a column name of AMR::microorganisms
# param initial_search logical - is FALSE when coming from uncertain tries, which uses exec_as.mo internally too
# param force_mo_history logical - whether found result must be saved with set_mo_history (default FALSE on non-interactive sessions)
@@ -486,7 +483,7 @@ exec_as.mo <- function(x,
# remove genus as first word
x <- gsub("^Genus ", "", x)
# allow characters that resemble others
- if (uncertainty_level >= 2) {
+ if (initial_search == FALSE) {
x <- tolower(x)
x <- gsub("[iy]+", "[iy]+", x)
x <- gsub("(c|k|q|qu|s|z|x|ks)+", "(c|k|q|qu|s|z|x|ks)+", x)
@@ -768,31 +765,24 @@ exec_as.mo <- function(x,
}
next
}
- if (grepl("[sS]almonella [A-Z][a-z]+ ?.*", x_backup_without_spp[i], ignore.case = FALSE)) {
+ if (x_backup_without_spp[i] %like% "salmonella [a-z]+ ?.*") {
if (x_backup_without_spp[i] %like% "Salmonella group") {
# Salmonella Group A to Z, just return S. species for now
x[i] <- microorganismsDT[mo == 'B_SLMNL', ..property][[1]][1L]
if (initial_search == TRUE) {
set_mo_history(x_backup[i], get_mo_code(x[i], property), 0, force = force_mo_history)
}
- options(mo_renamed = c(getOption("mo_renamed"),
- magenta(paste0("NOTE: ",
- italic("Salmonella"), " ", trimws(gsub("Salmonella", "", x_backup_without_spp[i])),
- " was considered ",
- italic("Salmonella species"),
- " (B_SLMNL)"))))
- } else {
+ } else if (grepl("[sS]almonella [A-Z][a-z]+ ?.*", x_backup_without_spp[i], ignore.case = FALSE)) {
# Salmonella with capital letter species like "Salmonella Goettingen" - they're all S. enterica
x[i] <- microorganismsDT[mo == 'B_SLMNL_ENT', ..property][[1]][1L]
if (initial_search == TRUE) {
set_mo_history(x_backup[i], get_mo_code(x[i], property), 0, force = force_mo_history)
}
- options(mo_renamed = c(getOption("mo_renamed"),
- magenta(paste0("NOTE: ",
- italic("Salmonella"), " ", trimws(gsub("Salmonella", "", x_backup_without_spp[i])),
- " was considered a subspecies of ",
- italic("Salmonella enterica"),
- " (B_SLMNL_ENT)"))))
+ uncertainties <- rbind(uncertainties,
+ data.frame(uncertainty = 1,
+ input = x_backup_without_spp[i],
+ fullname = microorganismsDT[mo == "B_SLMNL_ENT", fullname][[1]],
+ mo = "B_SLMNL_ENT"))
}
next
}
@@ -1041,9 +1031,27 @@ exec_as.mo <- function(x,
}
return(x)
}
+
+ # (2) Try with misspelled input ----
+ # just rerun with initial_search = FALSE will used the extensive regex part above
+ found <- suppressMessages(suppressWarnings(exec_as.mo(a.x_backup, initial_search = FALSE, allow_uncertain = FALSE)))
+ if (!empty_result(found)) {
+ found_result <- found
+ found <- microorganismsDT[mo == found, ..property][[1]]
+ uncertainties <<- rbind(uncertainties,
+ data.frame(uncertainty = 1,
+ input = a.x_backup,
+ fullname = microorganismsDT[mo == found_result[1L], fullname][[1]],
+ mo = found_result[1L]))
+ if (initial_search == TRUE) {
+ set_mo_history(a.x_backup, get_mo_code(found[1L], property), 1, force = force_mo_history)
+ }
+ return(found[1L])
+ }
}
if (uncertainty_level >= 2) {
+
# (3) look for genus only, part of name ----
if (nchar(g.x_backup_without_spp) > 4 & !b.x_trimmed %like% " ") {
if (!grepl("^[A-Z][a-z]+", b.x_trimmed, ignore.case = FALSE)) {
@@ -1286,10 +1294,11 @@ exec_as.mo <- function(x,
post_Becker <- c("argensis", "caeli", "cornubiensis", "edaphicus")
if (any(x %in% MOs_staph[species %in% post_Becker, ..property][[1]])) {
- warning("Becker ", italic("et al."), " (2014, 2019) does not contain species named after their publication: ",
+ warning("Becker ", italic("et al."), " (2014, 2019) does not contain these species named after their publication: ",
italic(paste("S.",
sort(mo_species(unique(x[x %in% MOs_staph[species %in% post_Becker, ..property][[1]]]))),
collapse = ", ")),
+ ".",
call. = FALSE,
immediate. = TRUE)
}
@@ -1352,15 +1361,7 @@ exec_as.mo <- function(x,
}
if (length(mo_renamed()) > 0) {
- if (has_color()) {
- notes <- getOption("mo_renamed")
- } else {
- notes <- mo_renamed()
- }
- notes <- sort(notes)
- for (i in 1:length(notes)) {
- base::message(blue(paste("NOTE:", notes[i])))
- }
+ print(mo_renamed())
}
x
@@ -1387,9 +1388,14 @@ was_renamed <- function(name_old, name_new, ref_old = "", ref_new = "", mo = "")
} else {
mo <- ""
}
- msg <- paste0(italic(name_old), ref_old, " was renamed ", italic(name_new), ref_new, mo)
- msg <- gsub("et al.", italic("et al."), msg)
- options(mo_renamed = c(getOption("mo_renamed"), sort(msg)))
+ old_values <- paste0(italic(name_old), ref_old)
+ old_values <- gsub("et al.", italic("et al."), old_values)
+ new_values <- paste0(italic(name_new), ref_new, mo)
+ new_values <- gsub("et al.", italic("et al."), new_values)
+
+ names(new_values) <- old_values
+ total <- c(getOption("mo_renamed"), new_values)
+ options(mo_renamed = total[order(names(total))])
}
#' @exportMethod print.mo
@@ -1451,6 +1457,9 @@ mo_failures <- function() {
#' @importFrom crayon italic
#' @export
mo_uncertainties <- function() {
+ if (is.null(getOption("mo_uncertainties"))) {
+ return(NULL)
+ }
structure(.Data = as.data.frame(getOption("mo_uncertainties"), stringsAsFactors = FALSE),
class = c("mo_uncertainties", "data.frame"))
}
@@ -1463,8 +1472,8 @@ print.mo_uncertainties <- function(x, ...) {
if (NROW(x) == 0) {
return(NULL)
}
- cat(paste0(bold(nrow(x), "unique result(s) guessed with uncertainty:"),
- "\n(1 = ", green("renamed"),
+ cat(paste0(bold(nr2char(nrow(x)), paste0("unique result", ifelse(nrow(x) > 1, "s", ""), " guessed with uncertainty:")),
+ "\n(1 = ", green("renamed/misspelled"),
", 2 = ", yellow("uncertain"),
", 3 = ", red("very uncertain"), ")\n"))
@@ -1489,10 +1498,18 @@ print.mo_uncertainties <- function(x, ...) {
}
#' @rdname as.mo
+#' @importFrom crayon strip_style
#' @export
mo_renamed <- function() {
- structure(.Data = strip_style(gsub("was renamed", "->", getOption("mo_renamed"), fixed = TRUE)),
- class = c("mo_renamed", "character"))
+ items <- getOption("mo_renamed")
+ if (is.null(items)) {
+ return(NULL)
+ }
+
+ items <- strip_style(items)
+ names(items) <- strip_style(names(items))
+ structure(.Data = items,
+ class = c("mo_renamed", "character"))
}
#' @exportMethod print.mo_renamed
@@ -1500,7 +1517,8 @@ mo_renamed <- function() {
#' @export
#' @noRd
print.mo_renamed <- function(x, ...) {
- cat(blue(paste(getOption("mo_renamed"), collapse = "\n")))
+ items <- getOption("mo_renamed")
+ base::message(blue(paste("NOTE:", names(items), "was renamed", items, collapse = "\n"), collapse = "\n"))
}
nr2char <- function(x) {
@@ -1540,3 +1558,15 @@ translate_allow_uncertain <- function(allow_uncertain) {
}
allow_uncertain
}
+
+get_mo_failures_uncertainties_renamed <- function() {
+ list(failures = getOption("mo_failures"),
+ uncertainties = getOption("mo_uncertainties"),
+ renamed = getOption("mo_renamed"))
+}
+
+load_mo_failures_uncertainties_renamed <- function(metadata) {
+ options("mo_failures" = metadata$failures)
+ options("mo_uncertainties" = metadata$uncertainties)
+ options("mo_renamed" = metadata$renamed)
+}
diff --git a/R/mo_property.R b/R/mo_property.R
index 4dfac1fd..8e72cabe 100755
--- a/R/mo_property.R
+++ b/R/mo_property.R
@@ -148,7 +148,9 @@ mo_fullname <- mo_name
#' @importFrom dplyr %>% mutate pull
#' @export
mo_shortname <- function(x, language = get_locale(), ...) {
- x.mo <- as.mo(x, ...)
+ x.mo <- AMR::as.mo(x, ...)
+ metadata <- get_mo_failures_uncertainties_renamed()
+
# get first char of genus and complete species in English
shortnames <- paste0(substr(mo_genus(x.mo, language = NULL), 1, 1), ". ", mo_species(x.mo, language = NULL))
@@ -158,6 +160,7 @@ mo_shortname <- function(x, language = get_locale(), ...) {
# exceptions for Streptococci
shortnames[shortnames %like% "S. group [ABCDFGHK]"] <- paste0("G", gsub("S. group ([ABCDFGHK])", "\\1", shortnames[shortnames %like% "S. group [ABCDFGHK]"]), "S")
+ load_mo_failures_uncertainties_renamed(metadata)
translate_AMR(shortnames, language = language, only_unknown = FALSE)
}
@@ -218,8 +221,10 @@ mo_type <- function(x, language = get_locale(), ...) {
#' @rdname mo_property
#' @export
mo_gramstain <- function(x, language = get_locale(), ...) {
- x.mo <- as.mo(x, ...)
- x.phylum <- mo_phylum(x.mo, language = NULL)
+ x.mo <- AMR::as.mo(x, ...)
+ metadata <- get_mo_failures_uncertainties_renamed()
+
+ x.phylum <- mo_phylum(x.mo)
# DETERMINE GRAM STAIN FOR BACTERIA
# Source: https://itis.gov/servlet/SingleRpt/SingleRpt?search_topic=TSN&search_value=956097
# It says this:
@@ -232,13 +237,15 @@ mo_gramstain <- function(x, language = get_locale(), ...) {
# Phylum Tenericutes (Murray, 1984)
x <- NA_character_
# make all bacteria Gram negative
- x[mo_kingdom(x.mo, language = NULL) == "Bacteria"] <- "Gram-negative"
+ x[mo_kingdom(x.mo) == "Bacteria"] <- "Gram-negative"
# overwrite these phyla with Gram positive
x[x.phylum %in% c("Actinobacteria",
"Chloroflexi",
"Firmicutes",
"Tenericutes")
| x.mo == "B_GRAMP"] <- "Gram-positive"
+
+ load_mo_failures_uncertainties_renamed(metadata)
translate_AMR(x, language = language, only_unknown = FALSE)
}
@@ -276,7 +283,9 @@ mo_rank <- function(x, ...) {
#' @export
mo_taxonomy <- function(x, language = get_locale(), ...) {
x <- AMR::as.mo(x, ...)
- base::list(kingdom = AMR::mo_kingdom(x, language = language),
+ metadata <- get_mo_failures_uncertainties_renamed()
+
+ result <- base::list(kingdom = AMR::mo_kingdom(x, language = language),
phylum = AMR::mo_phylum(x, language = language),
class = AMR::mo_class(x, language = language),
order = AMR::mo_order(x, language = language),
@@ -284,12 +293,17 @@ mo_taxonomy <- function(x, language = get_locale(), ...) {
genus = AMR::mo_genus(x, language = language),
species = AMR::mo_species(x, language = language),
subspecies = AMR::mo_subspecies(x, language = language))
+
+ load_mo_failures_uncertainties_renamed(metadata)
+ result
}
#' @rdname mo_property
#' @export
mo_synonyms <- function(x, ...) {
- x <- as.mo(x, ...)
+ x <- AMR::as.mo(x, ...)
+ metadata <- get_mo_failures_uncertainties_renamed()
+
IDs <- AMR::mo_property(x = x, property = "col_id", language = NULL)
syns <- lapply(IDs, function(col_id) {
res <- sort(AMR::microorganisms.old[which(AMR::microorganisms.old$col_id_new == col_id), "fullname"])
@@ -301,16 +315,21 @@ mo_synonyms <- function(x, ...) {
})
if (length(syns) > 1) {
names(syns) <- mo_fullname(x)
- syns
+ result <- syns
} else {
- unlist(syns)
+ result <- unlist(syns)
}
+
+ load_mo_failures_uncertainties_renamed(metadata)
+ result
}
#' @rdname mo_property
#' @export
mo_info <- function(x, language = get_locale(), ...) {
x <- AMR::as.mo(x, ...)
+ metadata <- get_mo_failures_uncertainties_renamed()
+
info <- lapply(x, function(y)
c(mo_taxonomy(y, language = language),
list(synonyms = mo_synonyms(y),
@@ -318,10 +337,13 @@ mo_info <- function(x, language = get_locale(), ...) {
ref = mo_ref(y))))
if (length(info) > 1) {
names(info) <- mo_fullname(x)
- info
+ result <- info
} else {
- info[[1L]]
+ result <- info[[1L]]
}
+
+ load_mo_failures_uncertainties_renamed(metadata)
+ result
}
#' @rdname mo_property
@@ -330,6 +352,8 @@ mo_info <- function(x, language = get_locale(), ...) {
#' @export
mo_url <- function(x, open = FALSE, ...) {
mo <- AMR::as.mo(x = x, ... = ...)
+ metadata <- get_mo_failures_uncertainties_renamed()
+
df <- data.frame(mo, stringsAsFactors = FALSE) %>%
left_join(select(AMR::microorganisms, mo, source, species_id), by = "mo") %>%
mutate(url = case_when(source == "CoL" ~
@@ -347,6 +371,8 @@ mo_url <- function(x, open = FALSE, ...) {
}
browseURL(u[1L])
}
+
+ load_mo_failures_uncertainties_renamed(metadata)
u
}
diff --git a/R/portion.R b/R/portion.R
index 18e2d00c..6599fec0 100755
--- a/R/portion.R
+++ b/R/portion.R
@@ -27,36 +27,61 @@
#' @param ... one or more vectors (or columns) with antibiotic interpretations. They will be transformed internally with \code{\link{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 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 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 \code{0.123456} will then be returned as \code{"12.3\%"}.
-#' @param also_single_tested a logical to indicate whether for combination therapies also observations should be included where not all antibiotics were tested, but at least one of the tested antibiotics contains a target interpretation (e.g. S in case of \code{portion_S} and R in case of \code{portion_R}). \strong{This could lead to selection bias.}
+#' @param only_all_tested (for combination therapies, i.e. using more than one variable for \code{...}) a logical to indicate that isolates must be tested for all antibiotics, see section \emph{Combination therapy} below
#' @param data a \code{data.frame} containing columns with class \code{rsi} (see \code{\link{as.rsi}})
#' @param translate_ab a column name of the \code{\link{antibiotics}} data set to translate the antibiotic abbreviations to, using \code{\link{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). This used to be the parameter \code{combine_IR}, but this now follows the redefinition by EUCAST about the interpretion of I (increased exposure) in 2019, see section 'Interpretation of S, I and R' below. Default is \code{TRUE}.
#' @param combine_IR a logical to indicate whether all values of I and R must be merged into one, so the output only consists of S vs. I+R (susceptible vs. non-susceptible). This is outdated, see parameter \code{combine_SI}.
#' @inheritSection as.rsi Interpretation of S, I and R
-#' @details \strong{Remember that you should filter your table to let it contain only first isolates!} Use \code{\link{first_isolate}} to determine them in your data set.
+#' @details \strong{Remember that you should filter your table to let it contain only first isolates!} This is needed to exclude duplicates and to reduce selection bias. Use \code{\link{first_isolate}} to determine them in your data set.
#'
#' These functions are not meant to count isolates, but to calculate the portion of resistance/susceptibility. Use the \code{\link[AMR]{count}} functions to count isolates. \emph{Low counts can infuence the outcome - these \code{portion} functions may camouflage this, since they only return the portion albeit being dependent on the \code{minimum} parameter.}
#'
#' The function \code{portion_df} takes any variable from \code{data} that has an \code{"rsi"} class (created with \code{\link{as.rsi}}) and calculates the portions R, I and S. The resulting \emph{tidy data} (see Source) \code{data.frame} will have three rows (S/I/R) and a column for each group and each variable with class \code{"rsi"}.
#'
#' The function \code{rsi_df} works exactly like \code{portion_df}, but adds the number of isolates.
-#' \if{html}{
-# (created with https://www.latex4technics.com/)
-#' \cr\cr
-#' To calculate the probability (\emph{p}) of susceptibility of one antibiotic, we use this formula:
-#' \out{}\figure{combi_therapy_2.png}\out{
}
-#' To calculate the probability (\emph{p}) of susceptibility of more antibiotics (i.e. combination therapy), we need to check whether one of them has a susceptible result (as numerator) and count all cases where all antibiotics were tested (as denominator). \cr
-#' \cr
-#' For two antibiotics:
-#' \out{}\figure{combi_therapy_2.png}\out{
}
-#' \cr
-#' For three antibiotics:
-#' \out{}\figure{combi_therapy_2.png}\out{
}
-#' \cr
-#' And so on.
+#' @section Combination therapy:
+#' When using more than one variable for \code{...} (= combination therapy)), use \code{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, Antibiotic A and Antibiotic B, about how \code{portion_SI} works to calculate the \%SI:
+#'
+#' \preformatted{
+#' -------------------------------------------------------------------------
+#' only_all_tested = FALSE only_all_tested = TRUE
+#' Antibiotic Antibiotic ----------------------- -----------------------
+#' A B include as include as include as include as
+#' numerator denominator numerator denominator
+#' ---------- ---------- ---------- ----------- ---------- -----------
+#' S S X X X X
+#' I S X X X X
+#' R S X X X X
+#' not tested S X X - -
+#' S I X X X X
+#' I I X X X X
+#' R I X X X X
+#' not tested I X X - -
+#' S R X X X X
+#' I R X X X X
+#' R R - X - X
+#' not tested R - - - -
+#' S not tested X X - -
+#' I not tested X X - -
+#' R not tested - - - -
+#' not tested not tested - - - -
+#' -------------------------------------------------------------------------
#' }
#'
+#' Please note that for \code{only_all_tested = TRUE} applies that:
+#' \preformatted{
+#' count_S() + count_I() + count_R() == count_all()
+#' portion_S() + portion_I() + portion_R() == 1
+#' }
+#' and that for \code{only_all_tested = FALSE} applies that:
+#' \preformatted{
+#' count_S() + count_I() + count_R() >= count_all()
+#' portion_S() + portion_I() + portion_R() >= 1
+#' }
+#'
+#' Using \code{only_all_tested} has no impact when only using one antibiotic as input.
#' @source \strong{M39 Analysis and Presentation of Cumulative Antimicrobial Susceptibility Test Data, 4th Edition}, 2014, \emph{Clinical and Laboratory Standards Institute (CLSI)}. \url{https://clsi.org/standards/products/microbiology/documents/m39/}.
#'
#' Wickham H. \strong{Tidy Data.} The Journal of Statistical Software, vol. 59, 2014. \url{http://vita.had.co.nz/papers/tidy-data.html}
@@ -89,7 +114,7 @@
#'
#' septic_patients %>%
#' group_by(hospital_id) %>%
-#' summarise(p = portion_S(CIP),
+#' summarise(p = portion_SI(CIP),
#' n = n_rsi(CIP)) # n_rsi works like n_distinct in dplyr
#'
#' septic_patients %>%
@@ -103,32 +128,38 @@
#'
#' # Calculate co-resistance between amoxicillin/clav acid and gentamicin,
#' # so we can see that combination therapy does a lot more than mono therapy:
-#' septic_patients %>% portion_S(AMC) # S = 71.4%
-#' septic_patients %>% count_all(AMC) # n = 1879
+#' septic_patients %>% portion_SI(AMC) # %SI = 76.3%
+#' septic_patients %>% count_all(AMC) # n = 1879
#'
-#' septic_patients %>% portion_S(GEN) # S = 74.0%
-#' septic_patients %>% count_all(GEN) # n = 1855
+#' septic_patients %>% portion_SI(GEN) # %SI = 75.4%
+#' septic_patients %>% count_all(GEN) # n = 1855
#'
-#' septic_patients %>% portion_S(AMC, GEN) # S = 92.3%
-#' septic_patients %>% count_all(AMC, GEN) # n = 1798
+#' septic_patients %>% portion_SI(AMC, GEN) # %SI = 94.1%
+#' septic_patients %>% count_all(AMC, GEN) # n = 1939
#'
-#' # Using `also_single_tested` can be useful ...
+#'
+#' # See Details on how `only_all_tested` works. Example:
#' septic_patients %>%
-#' portion_S(AMC, GEN,
-#' also_single_tested = TRUE) # S = 92.6%
-#' # ... but can also lead to selection bias - the data only has 2,000 rows:
+#' summarise(numerator = count_SI(AMC, GEN),
+#' denominator = count_all(AMC, GEN),
+#' portion = portion_SI(AMC, GEN))
+#' # numerator denominator portion
+#' # 1764 1936 0.9408
#' septic_patients %>%
-#' count_all(AMC, GEN,
-#' also_single_tested = TRUE) # n = 2555
+#' summarise(numerator = count_SI(AMC, GEN, only_all_tested = TRUE),
+#' denominator = count_all(AMC, GEN, only_all_tested = TRUE),
+#' portion = portion_SI(AMC, GEN, only_all_tested = TRUE))
+#' # numerator denominator portion
+#' # 1687 1798 0.9383
#'
#'
#' septic_patients %>%
#' group_by(hospital_id) %>%
-#' summarise(cipro_p = portion_S(CIP, as_percent = TRUE),
+#' summarise(cipro_p = portion_SI(CIP, as_percent = TRUE),
#' cipro_n = count_all(CIP),
-#' genta_p = portion_S(GEN, as_percent = TRUE),
+#' genta_p = portion_SI(GEN, as_percent = TRUE),
#' genta_n = count_all(GEN),
-#' combination_p = portion_S(CIP, GEN, as_percent = TRUE),
+#' combination_p = portion_SI(CIP, GEN, as_percent = TRUE),
#' combination_n = count_all(CIP, GEN))
#'
#' # Get portions S/I/R immediately of all rsi columns
@@ -155,13 +186,12 @@
portion_R <- function(...,
minimum = 30,
as_percent = FALSE,
- also_single_tested = FALSE) {
+ only_all_tested = FALSE) {
rsi_calc(...,
- type = "R",
- include_I = FALSE,
+ ab_result = "R",
minimum = minimum,
as_percent = as_percent,
- also_single_tested = also_single_tested,
+ only_all_tested = only_all_tested,
only_count = FALSE)
}
@@ -170,13 +200,12 @@ portion_R <- function(...,
portion_IR <- function(...,
minimum = 30,
as_percent = FALSE,
- also_single_tested = FALSE) {
+ only_all_tested = FALSE) {
rsi_calc(...,
- type = "R",
- include_I = TRUE,
+ ab_result = c("I", "R"),
minimum = minimum,
as_percent = as_percent,
- also_single_tested = also_single_tested,
+ only_all_tested = only_all_tested,
only_count = FALSE)
}
@@ -185,13 +214,12 @@ portion_IR <- function(...,
portion_I <- function(...,
minimum = 30,
as_percent = FALSE,
- also_single_tested = FALSE) {
+ only_all_tested = FALSE) {
rsi_calc(...,
- type = "I",
- include_I = FALSE,
+ ab_result = "I",
minimum = minimum,
as_percent = as_percent,
- also_single_tested = also_single_tested,
+ only_all_tested = only_all_tested,
only_count = FALSE)
}
@@ -200,13 +228,12 @@ portion_I <- function(...,
portion_SI <- function(...,
minimum = 30,
as_percent = FALSE,
- also_single_tested = FALSE) {
+ only_all_tested = FALSE) {
rsi_calc(...,
- type = "S",
- include_I = TRUE,
+ ab_result = c("S", "I"),
minimum = minimum,
as_percent = as_percent,
- also_single_tested = also_single_tested,
+ only_all_tested = only_all_tested,
only_count = FALSE)
}
@@ -215,13 +242,12 @@ portion_SI <- function(...,
portion_S <- function(...,
minimum = 30,
as_percent = FALSE,
- also_single_tested = FALSE) {
+ only_all_tested = FALSE) {
rsi_calc(...,
- type = "S",
- include_I = FALSE,
+ ab_result = "S",
minimum = minimum,
as_percent = as_percent,
- also_single_tested = also_single_tested,
+ only_all_tested = only_all_tested,
only_count = FALSE)
}
diff --git a/R/rsi.R b/R/rsi.R
index 694db988..3abec415 100755
--- a/R/rsi.R
+++ b/R/rsi.R
@@ -36,7 +36,7 @@
#'
#' The function \code{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} parameter.
#' @section Interpretation of S, I and R:
-#' In 2019, EUCAST has decided to change the definitions of susceptibility testing categories S, I and R as shown below. Results of several consultations on the new definitions are available on the EUCAST website under "Consultations".
+#' In 2019, EUCAST has decided to change the definitions of susceptibility testing categories S, I and R as shown below (\url{http://www.eucast.org/newsiandr/}). Results of several consultations on the new definitions are available on the EUCAST website under "Consultations".
#'
#' \itemize{
#' \item{\strong{S} - }{Susceptible, standard dosing regimen: 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.}
@@ -46,9 +46,7 @@
#'
#' 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.
#'
-#' Source: \url{http://www.eucast.org/newsiandr/}.
-#'
-#' \strong{This AMR package honours this new insight.}
+#' This AMR package honours this new insight. Use \code{\link{portion_SI}} to determine antimicrobial susceptibility and \code{\link{count_SI}} to count susceptible isolates.
#' @return Ordered factor with new class \code{rsi}
#' @keywords rsi
#' @export
diff --git a/R/rsi_calc.R b/R/rsi_calc.R
index 19960479..74e2151f 100755
--- a/R/rsi_calc.R
+++ b/R/rsi_calc.R
@@ -38,30 +38,29 @@ dots2vars <- function(...) {
#' @importFrom dplyr %>% pull all_vars any_vars filter_all funs mutate_all
rsi_calc <- function(...,
- type,
- include_I,
- minimum,
- as_percent,
- also_single_tested,
- only_count) {
+ ab_result,
+ minimum = 0,
+ as_percent = FALSE,
+ only_all_tested = FALSE,
+ only_count = FALSE) {
data_vars <- dots2vars(...)
- if (!is.logical(include_I)) {
- stop('`include_I` must be logical', call. = FALSE)
- }
if (!is.numeric(minimum)) {
stop('`minimum` must be numeric', call. = FALSE)
}
if (!is.logical(as_percent)) {
stop('`as_percent` must be logical', call. = FALSE)
}
- if (!is.logical(also_single_tested)) {
- stop('`also_single_tested` must be logical', call. = FALSE)
+ if (!is.logical(only_all_tested)) {
+ stop('`only_all_tested` must be logical', call. = FALSE)
}
dots_df <- ...elt(1) # it needs this evaluation
dots <- base::eval(base::substitute(base::alist(...)))
+ if ("also_single_tested" %in% names(dots)) {
+ stop("`also_single_tested` was replaced by `only_all_tested`. Please read Details in the help page (`?portion`) as this may have a considerable impact on your analysis.", call. = FALSE)
+ }
ndots <- length(dots)
if ("data.frame" %in% class(dots_df)) {
@@ -99,8 +98,7 @@ rsi_calc <- function(...,
print_warning <- FALSE
- type_trans <- as.integer(as.rsi(type))
- type_others <- base::setdiff(1:3, type_trans)
+ ab_result <- as.rsi(ab_result)
if (is.data.frame(x)) {
rsi_integrity_check <- character(0)
@@ -108,43 +106,38 @@ rsi_calc <- function(...,
# check integrity of columns: force rsi class
if (!is.rsi(x %>% pull(i))) {
rsi_integrity_check <- c(rsi_integrity_check, x %>% pull(i) %>% as.character())
- x[, i] <- suppressWarnings(as.rsi(x[, i])) # warning will be given later
+ x[, i] <- suppressWarnings(x %>% pull(i) %>% as.rsi()) # warning will be given later
print_warning <- TRUE
}
- x[, i] <- x %>% pull(i) %>% as.integer()
+ #x[, i] <- x %>% pull(i)
}
if (length(rsi_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)
}
- if (include_I == TRUE) {
- x <- x %>% mutate_all(funs(ifelse(. == 2, type_trans, .)))
- }
-
- if (also_single_tested == TRUE) {
- # THE CHANCE THAT AT LEAST ONE RESULT IS type
- found <- x %>% filter_all(any_vars(. == type_trans)) %>% nrow()
- # THE CHANCE THAT AT LEAST ONE RESULT IS type OR ALL ARE TESTED
- total <- found + x %>% filter_all(all_vars(. %in% type_others)) %>% nrow()
+ # THE CHANCE THAT AT LEAST ONE RESULT IS ab_result
+ #numerator <- x %>% filter_all(any_vars(. %in% ab_result)) %>% nrow()
+ if (only_all_tested == TRUE) {
+ # THE NUMBER OF ISOLATES WHERE *ALL* ABx ARE S/I/R
+ x_filtered <- x %>% filter_all(all_vars(!is.na(.)))
+ numerator <- x_filtered %>% filter_all(any_vars(. %in% ab_result)) %>% nrow()
+ denominator <- x_filtered %>% nrow()
} else {
- x <- apply(X = x,
- MARGIN = 1,
- FUN = min)
- found <- sum(as.integer(x) == type_trans, na.rm = TRUE)
- total <- length(x) - sum(is.na(x))
+ # THE NUMBER OF ISOLATES WHERE *ANY* ABx IS S/I/R
+ other_values <- base::setdiff(c(NA, levels(ab_result)), ab_result)
+ other_values_filter <- base::apply(x, 1, function(y) { base::all(y %in% other_values) & base::any(is.na(y)) })
+ numerator <- x %>% filter_all(any_vars(. %in% ab_result)) %>% nrow()
+ denominator <- x %>% filter(!other_values_filter) %>% nrow()
}
} else {
+ # x is not a data.frame
if (!is.rsi(x)) {
x <- as.rsi(x)
print_warning <- TRUE
}
- x <- as.integer(x)
- if (include_I == TRUE) {
- x[x == 2] <- type_trans
- }
- found <- sum(x == type_trans, na.rm = TRUE)
- total <- length(x) - sum(is.na(x))
+ numerator <- sum(x %in% ab_result, na.rm = TRUE)
+ denominator <- sum(x %in% levels(ab_result), na.rm = TRUE)
}
if (print_warning == TRUE) {
@@ -153,20 +146,23 @@ rsi_calc <- function(...,
}
if (only_count == TRUE) {
- return(found)
+ return(numerator)
}
- if (total < minimum) {
- warning("Introducing NA: only ", total, " results available for ", data_vars, " (minimum set to ", minimum, ").", call. = FALSE)
- result <- NA
+ if (denominator < minimum) {
+ if (data_vars != "") {
+ data_vars <- paste(" for", data_vars)
+ }
+ warning("Introducing NA: only ", denominator, " results available", data_vars, " (minimum set to ", minimum, ").", call. = FALSE)
+ fraction <- NA
} else {
- result <- found / total
+ fraction <- numerator / denominator
}
if (as_percent == TRUE) {
- percent(result, force_zero = TRUE)
+ percent(fraction, force_zero = TRUE)
} else {
- result
+ fraction
}
}
diff --git a/docs/LICENSE-text.html b/docs/LICENSE-text.html
index 370609a0..8a234d0d 100644
--- a/docs/LICENSE-text.html
+++ b/docs/LICENSE-text.html
@@ -78,7 +78,7 @@
AMR (for R)
- 0.7.1.9004
+ 0.7.1.9005
diff --git a/docs/articles/AMR.html b/docs/articles/AMR.html
index 6496de6a..a4c0afd1 100644
--- a/docs/articles/AMR.html
+++ b/docs/articles/AMR.html
@@ -40,7 +40,7 @@
AMR (for R)
- 0.7.1.9003
+ 0.7.1.9005
@@ -192,7 +192,7 @@
How to conduct AMR analysis
Matthijs S. Berends
- 23 June 2019
+ 01 July 2019
AMR.Rmd
@@ -201,7 +201,7 @@
-Note: values on this page will change with every website update since they are based on randomly created values and the page was written in R Markdown. However, the methodology remains unchanged. This page was generated on 23 June 2019.
+Note: values on this page will change with every website update since they are based on randomly created values and the page was written in R Markdown. However, the methodology remains unchanged. This page was generated on 01 July 2019.
Introduction
@@ -217,21 +217,21 @@
-2019-06-23 |
+2019-07-01 |
abcd |
Escherichia coli |
S |
S |
-2019-06-23 |
+2019-07-01 |
abcd |
Escherichia coli |
S |
R |
-2019-06-23 |
+2019-07-01 |
efgh |
Escherichia coli |
R |
@@ -327,69 +327,69 @@
-2017-10-01 |
-O3 |
+2011-09-06 |
+Z5 |
Hospital B |
Escherichia coli |
R |
-R |
+S |
S |
S |
F |
-2011-03-09 |
-U5 |
-Hospital B |
-Staphylococcus aureus |
+2015-03-21 |
+E7 |
+Hospital C |
+Escherichia coli |
+R |
+I |
S |
S |
+M |
+
+
+2010-08-11 |
+X6 |
+Hospital C |
+Escherichia coli |
S |
S |
+R |
+S |
F |
-
-2011-03-26 |
-N5 |
-Hospital A |
-Escherichia coli |
+
+2012-06-16 |
+E10 |
+Hospital D |
+Staphylococcus aureus |
+R |
S |
S |
S |
+M |
+
+
+2016-12-29 |
+J3 |
+Hospital C |
+Escherichia coli |
+R |
+S |
+S |
S |
M |
-2013-03-11 |
-O1 |
-Hospital A |
-Escherichia coli |
+2010-04-09 |
+Q3 |
+Hospital B |
+Streptococcus pneumoniae |
R |
S |
-R |
-R |
-F |
-
-
-2016-05-24 |
-V5 |
-Hospital D |
-Staphylococcus aureus |
S |
S |
-S |
-S |
-F |
-
-
-2016-09-21 |
-Z8 |
-Hospital A |
-Klebsiella pneumoniae |
-S |
-S |
-R |
-S |
F |
@@ -411,8 +411,8 @@
#
# Item Count Percent Cum. Count Cum. Percent
# --- ----- ------- -------- ----------- -------------
-# 1 M 10,366 51.8% 10,366 51.8%
-# 2 F 9,634 48.2% 20,000 100.0%
+# 1 M 10,408 52.0% 10,408 52.0%
+# 2 F 9,592 48.0% 20,000 100.0%
So, we can draw at least two conclusions immediately. From a data scientists perspective, the data looks clean: only values M
and F
. From a researchers perspective: there are slightly more men. Nothing we didn’t already know.
The data is already quite clean, but we still need to transform some variables. The bacteria
column now consists of text, and we want to add more variables based on microbial IDs later on. So, we will transform this column to valid IDs. The mutate()
function of the dplyr
package makes this really easy:
data <- data %>%
@@ -442,14 +442,14 @@
# Pasteurella multocida (no new changes)
# Staphylococcus (no new changes)
# Streptococcus groups A, B, C, G (no new changes)
-# Streptococcus pneumoniae (1,453 new changes)
+# Streptococcus pneumoniae (1,443 new changes)
# Viridans group streptococci (no new changes)
#
# EUCAST Expert Rules, Intrinsic Resistance and Exceptional Phenotypes (v3.1, 2016)
-# Table 01: Intrinsic resistance in Enterobacteriaceae (1,298 new changes)
+# Table 01: Intrinsic resistance in Enterobacteriaceae (1,332 new changes)
# Table 02: Intrinsic resistance in non-fermentative Gram-negative bacteria (no new changes)
# Table 03: Intrinsic resistance in other Gram-negative bacteria (no new changes)
-# Table 04: Intrinsic resistance in Gram-positive bacteria (2,747 new changes)
+# Table 04: Intrinsic resistance in Gram-positive bacteria (2,723 new changes)
# Table 08: Interpretive rules for B-lactam agents and Gram-positive cocci (no new changes)
# Table 09: Interpretive rules for B-lactam agents and Gram-negative rods (no new changes)
# Table 11: Interpretive rules for macrolides, lincosamides, and streptogramins (no new changes)
@@ -457,24 +457,24 @@
# Table 13: Interpretive rules for quinolones (no new changes)
#
# Other rules
-# Non-EUCAST: amoxicillin/clav acid = S where ampicillin = S (2,176 new changes)
-# Non-EUCAST: ampicillin = R where amoxicillin/clav acid = R (121 new changes)
+# Non-EUCAST: amoxicillin/clav acid = S where ampicillin = S (2,213 new changes)
+# Non-EUCAST: ampicillin = R where amoxicillin/clav acid = R (127 new changes)
# Non-EUCAST: piperacillin = R where piperacillin/tazobactam = R (no new changes)
# Non-EUCAST: piperacillin/tazobactam = S where piperacillin = S (no new changes)
# Non-EUCAST: trimethoprim = R where trimethoprim/sulfa = R (no new changes)
# Non-EUCAST: trimethoprim/sulfa = S where trimethoprim = S (no new changes)
#
# --------------------------------------------------------------------------
-# EUCAST rules affected 6,468 out of 20,000 rows, making a total of 7,795 edits
+# EUCAST rules affected 6,513 out of 20,000 rows, making a total of 7,838 edits
# => added 0 test results
#
-# => changed 7,795 test results
-# - 107 test results changed from S to I
-# - 4,725 test results changed from S to R
-# - 1,040 test results changed from I to S
-# - 329 test results changed from I to R
-# - 1,579 test results changed from R to S
-# - 15 test results changed from R to I
+# => changed 7,838 test results
+# - 115 test results changed from S to I
+# - 4,719 test results changed from S to R
+# - 1,077 test results changed from I to S
+# - 335 test results changed from I to R
+# - 1,573 test results changed from R to S
+# - 19 test results changed from R to I
# --------------------------------------------------------------------------
#
# Use verbose = TRUE to get a data.frame with all specified edits instead.
@@ -502,8 +502,8 @@
# NOTE: Using column `bacteria` as input for `col_mo`.
# NOTE: Using column `date` as input for `col_date`.
# NOTE: Using column `patient_id` as input for `col_patient_id`.
-
# => Found 5,644 first isolates (28.2% of total)
-So only 28.2% is suitable for resistance analysis! We can now filter on it with the filter()
function, also from the dplyr
package:
+# => Found 5,719 first isolates (28.6% of total)
+So only 28.6% is suitable for resistance analysis! We can now filter on it with the filter()
function, also from the dplyr
package:
For future use, the above two syntaxes can be shortened with the filter_first_isolate()
function:
@@ -513,7 +513,7 @@
First weighted isolates
-
We made a slight twist to the CLSI algorithm, to take into account the antimicrobial susceptibility profile. Have a look at all isolates of patient M3, sorted on date:
+
We made a slight twist to the CLSI algorithm, to take into account the antimicrobial susceptibility profile. Have a look at all isolates of patient S7, sorted on date:
1 |
-2010-01-24 |
-M3 |
-B_ESCHR_COL |
-S |
-S |
-R |
-S |
-TRUE |
-
-
-2 |
-2010-03-17 |
-M3 |
-B_ESCHR_COL |
-S |
-S |
-S |
-S |
-FALSE |
-
-
-3 |
-2010-04-12 |
-M3 |
-B_ESCHR_COL |
-S |
-S |
-R |
-S |
-FALSE |
-
-
-4 |
-2010-05-20 |
-M3 |
-B_ESCHR_COL |
-S |
-S |
-R |
-S |
-FALSE |
-
-
-5 |
-2010-06-08 |
-M3 |
-B_ESCHR_COL |
-S |
-S |
-R |
-S |
-FALSE |
-
-
-6 |
-2010-06-20 |
-M3 |
+2010-01-28 |
+S7 |
B_ESCHR_COL |
R |
I |
S |
S |
+TRUE |
+
+
+2 |
+2010-02-07 |
+S7 |
+B_ESCHR_COL |
+S |
+S |
+S |
+R |
FALSE |
+3 |
+2010-03-16 |
+S7 |
+B_ESCHR_COL |
+R |
+S |
+S |
+S |
+FALSE |
+
+
+4 |
+2010-10-09 |
+S7 |
+B_ESCHR_COL |
+S |
+S |
+S |
+S |
+FALSE |
+
+
+5 |
+2011-01-25 |
+S7 |
+B_ESCHR_COL |
+R |
+S |
+S |
+S |
+FALSE |
+
+
+6 |
+2011-02-16 |
+S7 |
+B_ESCHR_COL |
+S |
+S |
+S |
+S |
+TRUE |
+
+
7 |
-2010-09-18 |
-M3 |
+2011-02-24 |
+S7 |
B_ESCHR_COL |
S |
S |
@@ -606,10 +606,10 @@
8 |
-2010-10-08 |
-M3 |
+2011-03-30 |
+S7 |
B_ESCHR_COL |
-S |
+R |
S |
R |
S |
@@ -617,19 +617,19 @@
9 |
-2010-11-05 |
-M3 |
+2011-04-25 |
+S7 |
B_ESCHR_COL |
S |
S |
S |
-S |
+R |
FALSE |
10 |
-2010-12-23 |
-M3 |
+2011-05-06 |
+S7 |
B_ESCHR_COL |
S |
S |
@@ -639,7 +639,7 @@
-
Only 1 isolates are marked as ‘first’ according to CLSI guideline. But when reviewing the antibiogram, it is obvious that some isolates are absolutely different strains and should be included too. This is why we weigh isolates, based on their antibiogram. The key_antibiotics()
function adds a vector with 18 key antibiotics: 6 broad spectrum ones, 6 small spectrum for Gram negatives and 6 small spectrum for Gram positives. These can be defined by the user.
+
Only 2 isolates are marked as ‘first’ according to CLSI guideline. But when reviewing the antibiogram, it is obvious that some isolates are absolutely different strains and should be included too. This is why we weigh isolates, based on their antibiogram. The key_antibiotics()
function adds a vector with 18 key antibiotics: 6 broad spectrum ones, 6 small spectrum for Gram negatives and 6 small spectrum for Gram positives. These can be defined by the user.
If a column exists with a name like ‘key(…)ab’ the first_isolate()
function will automatically use it and determine the first weighted isolates. Mind the NOTEs in below output:
+
# => Found 15,097 first weighted isolates (75.5% of total)
1 |
-2010-01-24 |
-M3 |
+2010-01-28 |
+S7 |
B_ESCHR_COL |
-S |
-S |
R |
+I |
+S |
S |
TRUE |
TRUE |
2 |
-2010-03-17 |
-M3 |
+2010-02-07 |
+S7 |
B_ESCHR_COL |
S |
S |
S |
-S |
+R |
FALSE |
TRUE |
3 |
-2010-04-12 |
-M3 |
+2010-03-16 |
+S7 |
B_ESCHR_COL |
-S |
-S |
R |
S |
+S |
+S |
FALSE |
TRUE |
4 |
-2010-05-20 |
-M3 |
+2010-10-09 |
+S7 |
B_ESCHR_COL |
S |
S |
-R |
+S |
S |
FALSE |
-FALSE |
+TRUE |
5 |
-2010-06-08 |
-M3 |
+2011-01-25 |
+S7 |
B_ESCHR_COL |
-S |
-S |
R |
S |
+S |
+S |
FALSE |
-FALSE |
+TRUE |
6 |
-2010-06-20 |
-M3 |
+2011-02-16 |
+S7 |
B_ESCHR_COL |
-R |
-I |
S |
S |
-FALSE |
+S |
+S |
+TRUE |
TRUE |
7 |
-2010-09-18 |
-M3 |
+2011-02-24 |
+S7 |
B_ESCHR_COL |
S |
S |
S |
S |
FALSE |
-TRUE |
+FALSE |
8 |
-2010-10-08 |
-M3 |
+2011-03-30 |
+S7 |
B_ESCHR_COL |
-S |
+R |
S |
R |
S |
@@ -763,8 +763,20 @@
9 |
-2010-11-05 |
-M3 |
+2011-04-25 |
+S7 |
+B_ESCHR_COL |
+S |
+S |
+S |
+R |
+FALSE |
+TRUE |
+
+
+10 |
+2011-05-06 |
+S7 |
B_ESCHR_COL |
S |
S |
@@ -773,25 +785,13 @@
FALSE |
TRUE |
-
-10 |
-2010-12-23 |
-M3 |
-B_ESCHR_COL |
-S |
-S |
-S |
-S |
-FALSE |
-FALSE |
-
-Instead of 1, now 7 isolates are flagged. In total, 75.4% of all isolates are marked ‘first weighted’ - 47.2% more than when using the CLSI guideline. In real life, this novel algorithm will yield 5-10% more isolates than the classic CLSI guideline.
+Instead of 2, now 9 isolates are flagged. In total, 75.5% of all isolates are marked ‘first weighted’ - 46.9% more than when using the CLSI guideline. In real life, this novel algorithm will yield 5-10% more isolates than the classic CLSI guideline.
As with filter_first_isolate()
, there’s a shortcut for this new algorithm too:
-So we end up with 15,080 isolates for analysis.
+So we end up with 15,097 isolates for analysis.
We can remove unneeded columns:
@@ -799,7 +799,6 @@
-1 |
-2017-10-01 |
-O3 |
+2011-09-06 |
+Z5 |
Hospital B |
B_ESCHR_COL |
R |
-R |
+S |
S |
S |
F |
@@ -832,62 +830,58 @@
TRUE |
-4 |
-2013-03-11 |
-O1 |
-Hospital A |
+2015-03-21 |
+E7 |
+Hospital C |
B_ESCHR_COL |
R |
+I |
S |
-R |
-R |
-F |
+S |
+M |
Gram-negative |
Escherichia |
coli |
TRUE |
-5 |
-2016-05-24 |
-V5 |
-Hospital D |
-B_STPHY_AUR |
-S |
+2010-08-11 |
+X6 |
+Hospital C |
+B_ESCHR_COL |
S |
S |
+R |
S |
F |
+Gram-negative |
+Escherichia |
+coli |
+TRUE |
+
+
+2012-06-16 |
+E10 |
+Hospital D |
+B_STPHY_AUR |
+R |
+S |
+S |
+S |
+M |
Gram-positive |
Staphylococcus |
aureus |
TRUE |
-
-6 |
-2016-09-21 |
-Z8 |
-Hospital A |
-B_KLBSL_PNE |
-R |
-S |
-R |
-S |
-F |
-Gram-negative |
-Klebsiella |
-pneumoniae |
-TRUE |
-
-7 |
-2010-09-19 |
-H3 |
+2016-12-29 |
+J3 |
Hospital C |
B_ESCHR_COL |
R |
S |
-R |
+S |
S |
M |
Gram-negative |
@@ -896,19 +890,18 @@
TRUE |
-8 |
-2015-04-27 |
-C9 |
-Hospital C |
-B_ESCHR_COL |
+2010-04-09 |
+Q3 |
+Hospital B |
+B_STRPT_PNE |
+R |
+R |
S |
-S |
-S |
-S |
-M |
-Gram-negative |
-Escherichia |
-coli |
+R |
+F |
+Gram-positive |
+Streptococcus |
+pneumoniae |
TRUE |
@@ -928,9 +921,9 @@
Or can be used like the dplyr
way, which is easier readable:
-Frequency table of genus
and species
from data_1st
(15,080 x 13)
+Frequency table of genus
and species
from data_1st
(15,097 x 13)
Columns: 2
-Length: 15,080 (of which NA: 0 = 0.00%)
+Length: 15,097 (of which NA: 0 = 0.00%)
Unique: 4
Shortest: 16
Longest: 24
@@ -947,33 +940,33 @@ Longest: 24
1 |
Escherichia coli |
-7,414 |
-49.2% |
-7,414 |
-49.2% |
+7,483 |
+49.6% |
+7,483 |
+49.6% |
2 |
Staphylococcus aureus |
-3,787 |
-25.1% |
-11,201 |
-74.3% |
+3,673 |
+24.3% |
+11,156 |
+73.9% |
3 |
Streptococcus pneumoniae |
-2,319 |
-15.4% |
-13,520 |
-89.7% |
+2,306 |
+15.3% |
+13,462 |
+89.2% |
4 |
Klebsiella pneumoniae |
-1,560 |
-10.3% |
-15,080 |
+1,635 |
+10.8% |
+15,097 |
100.0% |
@@ -984,7 +977,7 @@ Longest: 24
Resistance percentages
The functions portion_S()
, portion_SI()
, portion_I()
, portion_IR()
and portion_R()
can be used to determine the portion of a specific antimicrobial outcome. As per the EUCAST guideline of 2019, we calculate resistance as the portion of R (portion_R()
) and susceptibility as the portion of S and I (portion_SI()
). These functions can be used on their own:
+# [1] 0.4738027
Or can be used in conjuction with group_by()
and summarise()
, both from the dplyr
package:
@@ -1027,23 +1020,23 @@ Longest: 24
Hospital A |
-0.4658016 |
-4547 |
+0.4810406 |
+4536 |
Hospital B |
-0.4614653 |
-5255 |
+0.4714259 |
+5267 |
Hospital C |
-0.4744526 |
-2329 |
+0.4625113 |
+2214 |
Hospital D |
-0.4686334 |
-2949 |
+0.4753247 |
+3080 |
@@ -1063,27 +1056,27 @@ Longest: 24
Escherichia |
-0.9219045 |
-0.8950634 |
-0.9950094 |
+0.9256982 |
+0.8929574 |
+0.9951891 |
Klebsiella |
-0.8153846 |
-0.8935897 |
-0.9865385 |
+0.8214067 |
+0.9033639 |
+0.9865443 |
Staphylococcus |
-0.9176129 |
-0.9144442 |
-0.9949828 |
+0.9229513 |
+0.9224068 |
+0.9937381 |
Streptococcus |
-0.6196636 |
+0.6153513 |
0.0000000 |
-0.6196636 |
+0.6153513 |
diff --git a/docs/articles/AMR_files/figure-html/plot 1-1.png b/docs/articles/AMR_files/figure-html/plot 1-1.png
index 33eec1ad492d6d606e3e3ed9d06276981d508aa4..97295b95938319ec3e7bc63cd708f9477594963b 100644
GIT binary patch
literal 35905
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
literal 35967
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
z