From 9c39c35f8607aee1e117b52db0908660369b09d5 Mon Sep 17 00:00:00 2001
From: "Matthijs S. Berends"
Date: Sun, 16 Jun 2019 21:42:40 +0200
Subject: [PATCH] (v0.7.0.9010) mo_synonyms, plot/barplot fixes
---
.gitlab-ci.yml | 10 +-
DESCRIPTION | 4 +-
NAMESPACE | 1 +
NEWS.md | 26 +-
R/count.R | 2 +-
R/mic.R | 48 +-
R/misc.R | 11 +-
R/mo_property.R | 15 +-
R/portion.R | 2 +-
R/rsi.R | 60 +-
docs/LICENSE-text.html | 2 +-
docs/articles/AMR.html | 659 +++++++++---------
.../AMR_files/figure-html/plot 1-1.png | Bin 36059 -> 35984 bytes
.../AMR_files/figure-html/plot 3-1.png | Bin 19232 -> 18980 bytes
.../AMR_files/figure-html/plot 4-1.png | Bin 70011 -> 69923 bytes
.../AMR_files/figure-html/plot 5-1.png | Bin 43345 -> 43344 bytes
docs/articles/index.html | 2 +-
docs/authors.html | 2 +-
docs/index.html | 2 +-
docs/news/index.html | 36 +-
docs/reference/AMR-deprecated.html | 9 +-
docs/reference/AMR.html | 9 +-
docs/reference/WHOCC.html | 9 +-
docs/reference/WHONET.html | 9 +-
docs/reference/ab_property.html | 9 +-
docs/reference/age.html | 9 +-
docs/reference/age_groups.html | 9 +-
docs/reference/antibiotics.html | 2 +-
docs/reference/as.ab.html | 9 +-
docs/reference/as.atc.html | 9 +-
docs/reference/as.disk.html | 9 +-
docs/reference/as.mic.html | 9 +-
docs/reference/as.mo.html | 9 +-
docs/reference/as.rsi.html | 9 +-
docs/reference/atc_online.html | 9 +-
docs/reference/availability.html | 9 +-
docs/reference/catalogue_of_life.html | 2 +-
docs/reference/catalogue_of_life_version.html | 2 +-
docs/reference/count.html | 2 +-
docs/reference/eucast_rules.html | 9 +-
docs/reference/extended-functions.html | 9 +-
docs/reference/filter_ab_class.html | 9 +-
docs/reference/first_isolate.html | 9 +-
docs/reference/freq.html | 9 +-
docs/reference/g.test.html | 9 +-
docs/reference/ggplot_rsi.html | 2 +-
docs/reference/guess_ab_col.html | 9 +-
docs/reference/index.html | 4 +-
docs/reference/join.html | 9 +-
docs/reference/key_antibiotics.html | 2 +-
docs/reference/kurtosis.html | 9 +-
docs/reference/like.html | 9 +-
docs/reference/mdro.html | 9 +-
docs/reference/microorganisms.codes.html | 9 +-
docs/reference/microorganisms.html | 2 +-
docs/reference/microorganisms.old.html | 9 +-
docs/reference/mo_property.html | 5 +-
docs/reference/mo_source.html | 9 +-
docs/reference/p.symbol.html | 9 +-
docs/reference/portion.html | 2 +-
docs/reference/read.4D.html | 9 +-
docs/reference/resistance_predict.html | 9 +-
docs/reference/rsi_translation.html | 9 +-
docs/reference/septic_patients.html | 9 +-
docs/reference/skewness.html | 9 +-
docs/reference/translate.html | 9 +-
git_merge.sh | 6 +-
man/count.Rd | 2 +-
man/mo_property.Rd | 4 +
man/portion.Rd | 2 +-
tests/testthat/test-mo_property.R | 92 +--
vignettes/AMR.Rmd | 60 +-
72 files changed, 595 insertions(+), 802 deletions(-)
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 7cf67639..9593a551 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -20,7 +20,7 @@
# ==================================================================== #
# to check with R-Hub:
-# rhub::check_for_cran(devtools::build(args = c('--no-build-vignettes')))
+# chck <- rhub::check_for_cran(devtools::build(args = c('--no-build-vignettes')))
stages:
- build
@@ -124,18 +124,10 @@ coverage:
pages:
stage: deploy
when: always
- #cache:
- # key: "$CI_COMMIT_REF_SLUG"
- # paths:
- # - installed_deps/
only:
- master
script:
- mv docs public
- # install missing and outdated packages
- #- Rscript -e 'source(".gitlab-ci.R"); gl_update_pkg_all(repos = "https://cran.rstudio.com", quiet = TRUE, install_pkgdown = TRUE)'
- #- Rscript -e "devtools::install(build = TRUE, upgrade = FALSE)"
- #- R -e "pkgdown::build_site(examples = FALSE, lazy = TRUE, override = list(destination = 'public'))"
artifacts:
paths:
- public
diff --git a/DESCRIPTION b/DESCRIPTION
index 46650a03..1c5d092e 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -1,6 +1,6 @@
Package: AMR
-Version: 0.7.0.9009
-Date: 2019-06-13
+Version: 0.7.0.9010
+Date: 2019-06-16
Title: Antimicrobial Resistance Analysis
Authors@R: c(
person(
diff --git a/NAMESPACE b/NAMESPACE
index 043ce300..42610ec1 100755
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -154,6 +154,7 @@ export(mo_renamed)
export(mo_shortname)
export(mo_species)
export(mo_subspecies)
+export(mo_synonyms)
export(mo_taxonomy)
export(mo_type)
export(mo_uncertainties)
diff --git a/NEWS.md b/NEWS.md
index 700f8233..57ef0325 100755
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,7 +1,7 @@
-# AMR 0.7.0.9009
+# AMR 0.7.0.9010
#### New
-* Function `rsi_df()` to transform a `data.frame` to a data set containing only the microbial interpretation (S, I, R), the antibiotic, the percentage of S/I/R and the number of available isolates. This is a convenient combinations of existing functions `count_df()` and `portion_df()` to immediately show resistance percentages and number of available isolates:
+* Function `rsi_df()` to transform a `data.frame` to a data set containing only the microbial interpretation (S, I, R), the antibiotic, the percentage of S/I/R and the number of available isolates. This is a convenient combination of the existing functions `count_df()` and `portion_df()` to immediately show resistance percentages and number of available isolates:
```r
septic_patients %>%
select(AMX, CIP) %>%
@@ -12,14 +12,31 @@
# 3 Ciprofloxacin SI 0.8381831 1181
# 4 Ciprofloxacin R 0.1618169 228
```
-* Support for all scientifically published pathotypes of *E. coli* to date. Supported are: AIEC (Adherent-Invasive *E. coli*), ATEC (Atypical Entero-pathogenic *E. coli*), DAEC (Diffusely Adhering *E. coli*), EAEC (Entero-Aggresive *E. coli*), EHEC (Entero-Haemorrhagic *E. coli*), EIEC (Entero-Invasive *E. coli*), EPEC (Entero-Pathogenic *E. coli*), ETEC (Entero-Toxigenic *E. coli*), NMEC (Neonatal Meningitis‐causing *E. coli*), STEC (Shiga-toxin producing *E. coli*) and UPEC (Uropathogenic *E. coli*). All these lead to the microbial ID of *E. coli*:
+* Support for all scientifically published pathotypes of *E. coli* to date. Supported are:
+
+ * AIEC (Adherent-Invasive *E. coli*)
+ * ATEC (Atypical Entero-pathogenic *E. coli*)
+ * DAEC (Diffusely Adhering *E. coli*)
+ * EAEC (Entero-Aggresive *E. coli*)
+ * EHEC (Entero-Haemorrhagic *E. coli*)
+ * EIEC (Entero-Invasive *E. coli*)
+ * EPEC (Entero-Pathogenic *E. coli*)
+ * ETEC (Entero-Toxigenic *E. coli*)
+ * NMEC (Neonatal Meningitis‐causing *E. coli*)
+ * STEC (Shiga-toxin producing *E. coli*)
+ * UPEC (Uropathogenic *E. coli*)
+
+ All these lead to the microbial ID of *E. coli*:
```r
as.mo("UPEC")
# B_ESCHR_COL
- mo_fullname("UPEC")
+ mo_name("UPEC")
# "Escherichia coli"
+ mo_gramstain("EHEC")
+ # "Gram-negative"
```
* Function `mo_info()` as an analogy to `ab_info()`. The `mo_info()` prints a list with the full taxonomy, authors, and the URL to the online database of a microorganism
+* Function `mo_synonyms()` to get all previously accepted taxonomic names of a microorganism
#### Changed
* Column names of output `count_df()` and `portion_df()` are now lowercase
@@ -36,6 +53,7 @@
* Removed antibiotic code `PVM1` from the `antibiotics` data set as this was a duplicate of `PME`
* Fixed bug where not all old taxonomic named would not be printed when using a vector as input for `as.mo()`
* Manually added *Trichomonas vaginalis* from the kingdom of Protozoa, which is missing from the Catalogue of Life
+* Small improvements to `plot()` and `barplot()` for MIC and RSI classes
#### Other
* Fixed a note thrown by CRAN tests
diff --git a/R/count.R b/R/count.R
index 7c275b11..9fd8a69b 100755
--- a/R/count.R
+++ b/R/count.R
@@ -33,7 +33,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 add the percentage of S, I and R.
+#' The function \code{rsi_df} works exactly like \code{count_df}, but adds the percentage of S, I and R.
#' @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
diff --git a/R/mic.R b/R/mic.R
index ea71c3da..0ef5206f 100755
--- a/R/mic.R
+++ b/R/mic.R
@@ -242,34 +242,38 @@ summary.mic <- function(object, ...) {
#' @exportMethod plot.mic
#' @export
-#' @importFrom dplyr %>% group_by summarise
-#' @importFrom graphics plot text
+#' @importFrom graphics barplot axis
#' @noRd
-plot.mic <- function(x, ...) {
- x_name <- deparse(substitute(x))
- create_barplot_mic(x, x_name, ...)
+plot.mic <- function(x,
+ main = paste('MIC values of', deparse(substitute(x))),
+ ylab = 'Frequency',
+ xlab = 'MIC value',
+ axes = FALSE,
+ ...) {
+ barplot(table(droplevels.factor(x)),
+ ylab = ylab,
+ xlab = xlab,
+ axes = axes,
+ main = main,
+ ...)
+ axis(2, seq(0, max(table(droplevels.factor(x)))))
}
#' @exportMethod barplot.mic
#' @export
#' @importFrom graphics barplot axis
#' @noRd
-barplot.mic <- function(height, ...) {
- x_name <- deparse(substitute(height))
- create_barplot_mic(height, x_name, ...)
-}
-
-#' @importFrom graphics barplot axis
-#' @importFrom dplyr %>% group_by summarise
-create_barplot_mic <- function(x, x_name, ...) {
- data <- data.frame(mic = droplevels(x), cnt = 1) %>%
- group_by(mic) %>%
- summarise(cnt = sum(cnt))
- barplot(table(droplevels.factor(x)),
- ylab = 'Frequency',
- xlab = 'MIC value',
- main = paste('MIC values of', x_name),
- axes = FALSE,
+barplot.mic <- function(height,
+ main = paste('MIC values of', deparse(substitute(height))),
+ ylab = 'Frequency',
+ xlab = 'MIC value',
+ axes = FALSE,
+ ...) {
+ barplot(table(droplevels.factor(height)),
+ ylab = ylab,
+ xlab = xlab,
+ axes = axes,
+ main = main,
...)
- axis(2, seq(0, max(data$cnt)))
+ axis(2, seq(0, max(table(droplevels.factor(height)))))
}
diff --git a/R/misc.R b/R/misc.R
index f1ace71b..3e5f150c 100755
--- a/R/misc.R
+++ b/R/misc.R
@@ -307,5 +307,14 @@ translate_AMR <- function(from, language = get_locale(), only_unknown = FALSE) {
}
"%or%" <- function(x, y) {
- ifelse(!is.na(x), x, ifelse(!is.na(y), y, NA))
+ if (is.null(x) | is.null(y)) {
+ if (is.null(x)) {
+ return(y)
+ } else {
+ return(x)
+ }
+ }
+ ifelse(!is.na(x),
+ x,
+ ifelse(!is.na(y), y, NA))
}
diff --git a/R/mo_property.R b/R/mo_property.R
index 69b95e83..e02bdae8 100755
--- a/R/mo_property.R
+++ b/R/mo_property.R
@@ -73,6 +73,7 @@
#' mo_type("E. coli") # "Bacteria" (equal to kingdom, but may be translated)
#' mo_rank("E. coli") # "species"
#' mo_url("E. coli") # get the direct url to the online database entry
+#' mo_synonyms("E. coli") # get previously accepted taxonomic names
#'
#' ## scientific reference
#' mo_ref("E. coli") # "Castellani et al., 1919"
@@ -312,12 +313,24 @@ mo_taxonomy <- function(x, language = get_locale(), ...) {
subspecies = mo_subspecies(x, language = language))
}
+#' @rdname mo_property
+#' @export
+mo_synonyms <- function(x, ...) {
+ x <- AMR::as.mo(x, ...)
+ col_id <- AMR::microorganisms[which(AMR::microorganisms$mo == x), "col_id"]
+ if (is.na(col_id) | !col_id %in% AMR::microorganisms.old$col_id_new) {
+ return(NULL)
+ }
+ sort(AMR::microorganisms.old[which(AMR::microorganisms.old$col_id_new == col_id), "fullname"])
+}
+
#' @rdname mo_property
#' @export
mo_info <- function(x, language = get_locale(), ...) {
x <- AMR::as.mo(x, ...)
c(mo_taxonomy(x, language = language),
- list(url = unname(mo_url(x, open = FALSE)),
+ list(synonyms = mo_synonyms(x),
+ url = unname(mo_url(x, open = FALSE)),
ref = mo_ref(x)))
}
diff --git a/R/portion.R b/R/portion.R
index 9bf11ab4..3474b52a 100755
--- a/R/portion.R
+++ b/R/portion.R
@@ -40,7 +40,7 @@
#'
#' 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 add the number of isolates.
+#' 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
diff --git a/R/rsi.R b/R/rsi.R
index c0f83de4..2b749987 100755
--- a/R/rsi.R
+++ b/R/rsi.R
@@ -387,9 +387,14 @@ summary.rsi <- function(object, ...) {
#' @importFrom dplyr %>% group_by summarise filter mutate if_else n_distinct
#' @importFrom graphics plot text
#' @noRd
-plot.rsi <- function(x, ...) {
- x_name <- deparse(substitute(x))
-
+plot.rsi <- function(x,
+ lwd = 2,
+ ylim = NULL,
+ ylab = 'Percentage',
+ xlab = 'Antimicrobial Interpretation',
+ main = paste('Susceptibility Analysis of', deparse(substitute(x))),
+ axes = FALSE,
+ ...) {
suppressWarnings(
data <- data.frame(x = x,
y = 1,
@@ -415,13 +420,12 @@ plot.rsi <- function(x, ...) {
plot(x = data$x,
y = data$s,
- lwd = 2,
- col = c('green', 'orange', 'red'),
+ lwd = lwd,
ylim = c(0, ymax),
- ylab = 'Percentage',
- xlab = 'Antimicrobial Interpretation',
- main = paste('Susceptibility Analysis of', x_name),
- axes = FALSE,
+ ylab = ylab,
+ xlab = xlab,
+ main = main,
+ axes = axes,
...)
# x axis
axis(side = 1, at = 1:n_distinct(data$x), labels = levels(data$x), lwd = 0)
@@ -439,24 +443,32 @@ plot.rsi <- function(x, ...) {
#' @importFrom dplyr %>% group_by summarise
#' @importFrom graphics barplot axis
#' @noRd
-barplot.rsi <- function(height, ...) {
- x <- height
- x_name <- deparse(substitute(height))
+barplot.rsi <- function(height,
+ col = c('green3', 'orange2', 'red3'),
+ xlab = ifelse(beside, 'Antimicrobial Interpretation', ''),
+ main = paste('Susceptibility Analysis of', deparse(substitute(height))),
+ ylab = 'Frequency',
+ beside = TRUE,
+ axes = beside,
+ ...) {
- suppressWarnings(
- data <- data.frame(rsi = x, cnt = 1) %>%
- group_by(rsi) %>%
- summarise(cnt = sum(cnt)) %>%
- droplevels()
- )
+ if (axes == TRUE) {
+ par(mar = c(5, 4, 4, 2) + 0.1)
+ } else {
+ par(mar = c(2, 4, 4, 2) + 0.1)
+ }
- barplot(table(x),
- col = c('green3', 'orange2', 'red3'),
- xlab = 'Antimicrobial Interpretation',
- main = paste('Susceptibility Analysis of', x_name),
- ylab = 'Frequency',
+ barplot(as.matrix(table(height)),
+ col = col,
+ xlab = xlab,
+ main = main,
+ ylab = ylab,
+ beside = beside,
axes = FALSE,
...)
# y axis, 0-100%
- axis(side = 2, at = seq(0, max(data$cnt) + max(data$cnt) * 1.1, by = 25))
+ axis(side = 2, at = seq(0, max(table(height)) + max(table(height)) * 1.1, by = 25))
+ if (axes == TRUE && beside == TRUE) {
+ axis(side = 1, labels = levels(height), at = c(1, 2, 3) + 0.5, lwd = 0)
+ }
}
diff --git a/docs/LICENSE-text.html b/docs/LICENSE-text.html
index 134750b1..49765907 100644
--- a/docs/LICENSE-text.html
+++ b/docs/LICENSE-text.html
@@ -78,7 +78,7 @@
AMR (for R)
- 0.7.0.9009
+ 0.7.0.9010
diff --git a/docs/articles/AMR.html b/docs/articles/AMR.html
index 32705737..139af9fb 100644
--- a/docs/articles/AMR.html
+++ b/docs/articles/AMR.html
@@ -40,7 +40,7 @@
AMR (for R)
- 0.7.0.9000
+ 0.7.0.9009
@@ -125,13 +125,6 @@
Create frequency tables
-
-
-
-
- Use the G-test
-
-
@@ -199,7 +192,7 @@
How to conduct AMR analysis
Matthijs S. Berends
- 07 June 2019
+ 15 June 2019
AMR.Rmd
@@ -208,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 07 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 15 June 2019.
Introduction
@@ -224,21 +217,21 @@
-2019-06-07 |
+2019-06-15 |
abcd |
Escherichia coli |
S |
S |
-2019-06-07 |
+2019-06-15 |
abcd |
Escherichia coli |
S |
R |
-2019-06-07 |
+2019-06-15 |
efgh |
Escherichia coli |
R |
@@ -278,7 +271,7 @@
Dates
-
Let’s pretend that our data consists of blood cultures isolates from 1 January 2010 until 1 January 2018.
+
Let’s pretend that our data consists of blood cultures isolates from between 1 January 2010 and 1 January 2018.
This dates
object now contains all days in our date range.
Using the left_join()
function from the dplyr
package, we can ‘map’ the gender to the patient ID using the patients_table
object we created earlier:
-
The resulting data set contains 5,000 blood culture isolates. With the head()
function we can preview the first 6 values of this data set:
+
The resulting data set contains 20,000 blood culture isolates. With the head()
function we can preview the first 6 values of this data set:
-2010-01-26 |
-S3 |
-Hospital B |
-Escherichia coli |
-R |
-I |
-R |
-S |
-F |
-
-
-2010-08-26 |
-G7 |
-Hospital D |
-Escherichia coli |
-R |
-S |
-S |
-S |
-M |
-
-
-2016-05-04 |
-B8 |
+2010-06-23 |
+R10 |
Hospital A |
-Escherichia coli |
-S |
-S |
-R |
-S |
-M |
-
-
-2016-11-19 |
-E10 |
-Hospital D |
Streptococcus pneumoniae |
S |
S |
S |
S |
-M |
-
-
-2013-07-13 |
-G3 |
-Hospital A |
-Escherichia coli |
-R |
-S |
-S |
-S |
-M |
+F |
-2017-05-23 |
-V3 |
-Hospital C |
-Staphylococcus aureus |
+2016-04-09 |
+R1 |
+Hospital D |
+Klebsiella pneumoniae |
S |
S |
S |
S |
F |
+
+2017-01-27 |
+U10 |
+Hospital A |
+Streptococcus pneumoniae |
+R |
+S |
+R |
+S |
+F |
+
+
+2017-05-23 |
+C4 |
+Hospital B |
+Klebsiella pneumoniae |
+R |
+S |
+R |
+S |
+M |
+
+
+2015-03-27 |
+W3 |
+Hospital B |
+Escherichia coli |
+S |
+S |
+S |
+S |
+F |
+
+
+2014-06-14 |
+L5 |
+Hospital A |
+Escherichia coli |
+S |
+S |
+S |
+S |
+M |
+
Now, let’s start the cleaning and the analysis!
@@ -418,9 +411,9 @@
#
# Item Count Percent Cum. Count Cum. Percent
# --- ----- ------- -------- ----------- -------------
-# 1 M 10,368 51.8% 10,368 51.8%
-# 2 F 9,632 48.2% 20,000 100.0%
-
So, we can draw at least two conclusions immediately. From a data scientist perspective, the data looks clean: only values M
and F
. From a researcher perspective: there are slightly more men. Nothing we didn’t already know.
+# 1 M 10,341 51.7% 10,341 51.7%
+# 2 F 9,659 48.3% 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:
@@ -437,8 +430,8 @@
# EUCAST Clinical Breakpoints (v9.0, 2019)
# Aerococcus sanguinicola (no new changes)
# Aerococcus urinae (no new changes)
-
# Anaerobic Gram negatives (no new changes)
-
# Anaerobic Gram positives (no new changes)
+
# Anaerobic Gram-negatives (no new changes)
+
# Anaerobic Gram-positives (no new changes)
# Campylobacter coli (no new changes)
# Campylobacter jejuni (no new changes)
# Enterobacteriales (Order) (no new changes)
@@ -449,14 +442,14 @@
# Pasteurella multocida (no new changes)
# Staphylococcus (no new changes)
# Streptococcus groups A, B, C, G (no new changes)
-
# Streptococcus pneumoniae (1,496 new changes)
+
# Streptococcus pneumoniae (1,478 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,276 new changes)
+
# Table 01: Intrinsic resistance in Enterobacteriaceae (1,340 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,809 new changes)
+
# Table 04: Intrinsic resistance in Gram-positive bacteria (2,785 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)
@@ -464,24 +457,24 @@
# Table 13: Interpretive rules for quinolones (no new changes)
#
# Other rules
-
# Non-EUCAST: amoxicillin/clav acid = S where ampicillin = S (2,244 new changes)
-
# Non-EUCAST: ampicillin = R where amoxicillin/clav acid = R (111 new changes)
+
# Non-EUCAST: amoxicillin/clav acid = S where ampicillin = S (2,164 new changes)
+
# Non-EUCAST: ampicillin = R where amoxicillin/clav acid = R (105 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,565 out of 20,000 rows, making a total of 7,936 edits
+
# EUCAST rules affected 6,519 out of 20,000 rows, making a total of 7,872 edits
# => added 0 test results
#
-
# => changed 7,936 test results
-
# - 116 test results changed from S to I
-
# - 4,801 test results changed from S to R
-
# - 1,059 test results changed from I to S
-
# - 347 test results changed from I to R
-
# - 1,596 test results changed from R to S
-
# - 17 test results changed from R to I
+
# => changed 7,872 test results
+
# - 122 test results changed from S to I
+
# - 4,775 test results changed from S to R
+
# - 1,060 test results changed from I to S
+
# - 316 test results changed from I to R
+
# - 1,581 test results changed from R to S
+
# - 18 test results changed from R to I
# --------------------------------------------------------------------------
#
# Use verbose = TRUE to get a data.frame with all specified edits instead.
@@ -509,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,692 first isolates (28.5% of total)
-So only 28.5% is suitable for resistance analysis! We can now filter on it with the filter()
function, also from the dplyr
package:
+# => Found 5,652 first isolates (28.3% of total)
+So only 28.3% 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:
@@ -520,7 +513,7 @@
First weighted isolates
-
We made a slight twist to the CLSI algorithm, to take into account the antimicrobial susceptibility profile. Imagine this data, 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 V3, sorted on date:
1 |
-2010-01-16 |
-V9 |
+2010-01-06 |
+V3 |
B_ESCHR_COL |
S |
S |
S |
-S |
+R |
TRUE |
2 |
-2010-02-23 |
-V9 |
+2010-07-24 |
+V3 |
B_ESCHR_COL |
-S |
+R |
S |
S |
S |
@@ -558,10 +551,10 @@
3 |
-2010-04-05 |
-V9 |
+2010-07-26 |
+V3 |
B_ESCHR_COL |
-S |
+R |
S |
S |
S |
@@ -569,19 +562,19 @@
4 |
-2010-04-28 |
-V9 |
+2011-05-06 |
+V3 |
B_ESCHR_COL |
+R |
S |
S |
S |
-S |
-FALSE |
+TRUE |
5 |
-2010-05-20 |
-V9 |
+2011-06-04 |
+V3 |
B_ESCHR_COL |
S |
S |
@@ -591,41 +584,41 @@
6 |
-2010-07-07 |
-V9 |
+2011-07-22 |
+V3 |
B_ESCHR_COL |
S |
S |
+S |
+S |
+FALSE |
+
+
+7 |
+2011-08-15 |
+V3 |
+B_ESCHR_COL |
+I |
+I |
+S |
+R |
+FALSE |
+
+
+8 |
+2011-09-20 |
+V3 |
+B_ESCHR_COL |
+R |
+S |
R |
S |
FALSE |
-7 |
-2010-09-11 |
-V9 |
-B_ESCHR_COL |
-S |
-S |
-S |
-S |
-FALSE |
-
-
-8 |
-2010-09-19 |
-V9 |
-B_ESCHR_COL |
-S |
-S |
-S |
-S |
-FALSE |
-
-
9 |
-2010-10-07 |
-V9 |
+2012-03-26 |
+V3 |
B_ESCHR_COL |
S |
S |
@@ -635,18 +628,18 @@
10 |
-2011-01-14 |
-V9 |
+2012-06-01 |
+V3 |
B_ESCHR_COL |
R |
+I |
S |
S |
-S |
-FALSE |
+TRUE |
-
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 3 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,202 first weighted isolates (76.0% of total)
1 |
-2010-01-16 |
-V9 |
+2010-01-06 |
+V3 |
B_ESCHR_COL |
S |
S |
S |
-S |
+R |
TRUE |
TRUE |
2 |
-2010-02-23 |
-V9 |
+2010-07-24 |
+V3 |
B_ESCHR_COL |
-S |
+R |
S |
S |
S |
FALSE |
-FALSE |
+TRUE |
3 |
-2010-04-05 |
-V9 |
+2010-07-26 |
+V3 |
B_ESCHR_COL |
-S |
+R |
S |
S |
S |
@@ -710,95 +703,95 @@
4 |
-2010-04-28 |
-V9 |
+2011-05-06 |
+V3 |
B_ESCHR_COL |
+R |
S |
S |
S |
-S |
-FALSE |
-FALSE |
+TRUE |
+TRUE |
5 |
-2010-05-20 |
-V9 |
+2011-06-04 |
+V3 |
B_ESCHR_COL |
S |
S |
S |
S |
FALSE |
-FALSE |
-
-
-6 |
-2010-07-07 |
-V9 |
-B_ESCHR_COL |
-S |
-S |
-R |
-S |
-FALSE |
TRUE |
-
-7 |
-2010-09-11 |
-V9 |
+
+6 |
+2011-07-22 |
+V3 |
B_ESCHR_COL |
S |
S |
S |
S |
FALSE |
+FALSE |
+
+
+7 |
+2011-08-15 |
+V3 |
+B_ESCHR_COL |
+I |
+I |
+S |
+R |
+FALSE |
TRUE |
8 |
-2010-09-19 |
-V9 |
+2011-09-20 |
+V3 |
B_ESCHR_COL |
+R |
S |
-S |
-S |
+R |
S |
FALSE |
-FALSE |
+TRUE |
9 |
-2010-10-07 |
-V9 |
+2012-03-26 |
+V3 |
B_ESCHR_COL |
S |
S |
S |
S |
FALSE |
-FALSE |
-
-
-10 |
-2011-01-14 |
-V9 |
-B_ESCHR_COL |
-R |
-S |
-S |
-S |
-FALSE |
+TRUE |
+
+
+10 |
+2012-06-01 |
+V3 |
+B_ESCHR_COL |
+R |
+I |
+S |
+S |
+TRUE |
TRUE |
-Instead of 1, now 4 isolates are flagged. In total, 75.4% 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.
+Instead of 3, now 8 isolates are flagged. In total, 76% of all isolates are marked ‘first weighted’ - 47.7% 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,072 isolates for analysis.
+So we end up with 15,202 isolates for analysis.
We can remove unneeded columns:
@@ -806,7 +799,6 @@
-1 |
-2010-01-26 |
-S3 |
-Hospital B |
-B_ESCHR_COL |
-R |
-I |
-R |
+2010-06-23 |
+R10 |
+Hospital A |
+B_STRPT_PNE |
S |
+S |
+S |
+R |
F |
-Gram negative |
-Escherichia |
-coli |
+Gram-positive |
+Streptococcus |
+pneumoniae |
TRUE |
-2 |
-2010-08-26 |
-G7 |
+2016-04-09 |
+R1 |
Hospital D |
-B_ESCHR_COL |
+B_KLBSL_PNE |
R |
S |
S |
S |
-M |
-Gram negative |
-Escherichia |
-coli |
-TRUE |
-
-
-3 |
-2016-05-04 |
-B8 |
-Hospital A |
-B_ESCHR_COL |
-S |
-S |
-R |
-S |
-M |
-Gram negative |
-Escherichia |
-coli |
-TRUE |
-
-
-5 |
-2013-07-13 |
-G3 |
-Hospital A |
-B_ESCHR_COL |
-R |
-S |
-S |
-S |
-M |
-Gram negative |
-Escherichia |
-coli |
-TRUE |
-
-
-8 |
-2016-11-20 |
-Y6 |
-Hospital A |
-B_ESCHR_COL |
-S |
-S |
-R |
-S |
F |
-Gram negative |
-Escherichia |
-coli |
+Gram-negative |
+Klebsiella |
+pneumoniae |
+TRUE |
+
+
+2017-01-27 |
+U10 |
+Hospital A |
+B_STRPT_PNE |
+R |
+R |
+R |
+R |
+F |
+Gram-positive |
+Streptococcus |
+pneumoniae |
TRUE |
-10 |
-2015-11-03 |
-W8 |
+2017-05-23 |
+C4 |
+Hospital B |
+B_KLBSL_PNE |
+R |
+S |
+R |
+S |
+M |
+Gram-negative |
+Klebsiella |
+pneumoniae |
+TRUE |
+
+
+2015-03-27 |
+W3 |
Hospital B |
B_ESCHR_COL |
S |
@@ -913,7 +884,22 @@
S |
S |
F |
-Gram negative |
+Gram-negative |
+Escherichia |
+coli |
+TRUE |
+
+
+2014-06-14 |
+L5 |
+Hospital A |
+B_ESCHR_COL |
+S |
+S |
+S |
+S |
+M |
+Gram-negative |
Escherichia |
coli |
TRUE |
@@ -935,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,072 x 13)
+Frequency table of genus
and species
from data_1st
(15,202 x 13)
Columns: 2
-Length: 15,072 (of which NA: 0 = 0.00%)
+Length: 15,202 (of which NA: 0 = 0.00%)
Unique: 4
Shortest: 16
Longest: 24
@@ -954,33 +940,33 @@ Longest: 24
1 |
Escherichia coli |
-7,451 |
-49.4% |
-7,451 |
-49.4% |
+7,485 |
+49.2% |
+7,485 |
+49.2% |
2 |
Staphylococcus aureus |
-3,713 |
-24.6% |
-11,164 |
-74.1% |
+3,758 |
+24.7% |
+11,243 |
+74.0% |
3 |
Streptococcus pneumoniae |
-2,367 |
-15.7% |
-13,531 |
-89.8% |
+2,371 |
+15.6% |
+13,614 |
+89.6% |
4 |
Klebsiella pneumoniae |
-1,541 |
-10.2% |
-15,072 |
+1,588 |
+10.4% |
+15,202 |
100.0% |
@@ -991,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.4678332
Or can be used in conjuction with group_by()
and summarise()
, both from the dplyr
package:
@@ -1034,23 +1020,23 @@ Longest: 24
Hospital A |
-0.4472198 |
-4604 |
+0.4688237 |
+4667 |
Hospital B |
-0.4684564 |
-5215 |
+0.4693374 |
+5267 |
Hospital C |
-0.4662494 |
-2237 |
+0.4641460 |
+2301 |
Hospital D |
-0.4704907 |
-3016 |
+0.4664644 |
+2967 |
@@ -1070,27 +1056,27 @@ Longest: 24
Escherichia |
-0.9256476 |
-0.8916924 |
-0.9938263 |
+0.9249165 |
+0.8956580 |
+0.9929192 |
Klebsiella |
-0.8208955 |
-0.8974692 |
-0.9883193 |
+0.8413098 |
+0.8992443 |
+0.9911839 |
Staphylococcus |
-0.9237813 |
-0.9165096 |
-0.9929976 |
+0.9169771 |
+0.9161788 |
+0.9949441 |
Streptococcus |
-0.6138572 |
+0.6280051 |
0.0000000 |
-0.6138572 |
+0.6280051 |
@@ -1100,10 +1086,10 @@ Longest: 24
summarise("1. Amoxi/clav" = portion_SI(AMC),
"2. Gentamicin" = portion_SI(GEN),
"3. Amoxi/clav + genta" = portion_SI(AMC, GEN)) %>%
-
tidyr::gather("Antibiotic", "S", -genus) %>%
+
tidyr::gather("antibiotic", "S", -genus) %>%
ggplot(aes(x = genus,
y = S,
-
fill = Antibiotic)) +
+
fill = antibiotic)) +
geom_col(position = "dodge2")
@@ -1127,7 +1113,7 @@ Longest: 24
-Omit the translate_ab = FALSE
to have the antibiotic codes (AMX, AMC, CIP, GEN) translated to official WHO names (amoxicillin, amoxicillin and betalactamase inhibitor, ciprofloxacin, gentamicin).
+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).
If we group on e.g. the genus
column and add some additional functions from our package, we can create this:
# group the data on `genus`
ggplot(data_1st %>% group_by(genus)) +
@@ -1136,7 +1122,7 @@ Longest: 24
# of which we have 4 (earlier created with `as.rsi`)
geom_rsi(x = "genus") +
# split plots on antibiotic
- facet_rsi(facet = "Antibiotic") +
+ facet_rsi(facet = "antibiotic") +
# make R red, I yellow and S green
scale_rsi_colours() +
# show percentages on y axis
@@ -1154,7 +1140,7 @@ Longest: 24
@@ -1164,48 +1150,35 @@ Longest: 24
Independence test
The next example uses the included septic_patients
, which is an anonymised data set containing 2,000 microbial blood culture isolates with their full antibiograms found in septic patients in 4 different hospitals in the Netherlands, between 2001 and 2017. It is true, genuine data. This data.frame
can be used to practice AMR analysis.
-We will compare the resistance to fosfomycin (column FOS
) in hospital A and D. The input for the final fisher.test()
will be this:
-
-
-
-
-IR |
-25 |
-77 |
-
-
-S |
-24 |
-33 |
-
-
-
-We can transform the data and apply the test in only a couple of lines:
-
+We can apply the test now with:
+
+As can be seen, the p value is 0.031, which means that the fosfomycin resistances found in hospital A and D are really different.
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 cdba2c03d6337180a4c01cf14995f7205257ebd1..7779e67f5f33237b8c291f09061f0f0bab25910b 100644
GIT binary patch
literal 35984
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