1
0
mirror of https://github.com/msberends/AMR.git synced 2024-12-26 07:26:13 +01:00

new ggplot enhancement

This commit is contained in:
dr. M.S. (Matthijs) Berends 2018-08-11 21:30:00 +02:00
parent 4680df1e9c
commit 1ba7d883fe
20 changed files with 312 additions and 151 deletions

View File

@ -2,3 +2,4 @@
^\.Rproj\.user$ ^\.Rproj\.user$
.travis.yml .travis.yml
.zenodo.json .zenodo.json
^cran-comments\.md$

1
.gitignore vendored
View File

@ -12,3 +12,4 @@ inst/doc
*.dll *.dll
vignettes/*.R vignettes/*.R
.DS_Store .DS_Store
^cran-comments\.md$

View File

@ -1,6 +1,6 @@
Package: AMR Package: AMR
Version: 0.2.0.9022 Version: 0.2.0.9023
Date: 2018-08-10 Date: 2018-08-11
Title: Antimicrobial Resistance Analysis Title: Antimicrobial Resistance Analysis
Authors@R: c( Authors@R: c(
person( person(
@ -46,7 +46,7 @@ Description: Functions to simplify the analysis of Antimicrobial Resistance (AMR
on antibiograms according to Leclercq (2013) on antibiograms according to Leclercq (2013)
<doi:10.1111/j.1469-0691.2011.03703.x>. <doi:10.1111/j.1469-0691.2011.03703.x>.
Depends: Depends:
R (>= 3.0.0) R (>= 3.1.0)
Imports: Imports:
backports, backports,
clipr, clipr,
@ -57,19 +57,18 @@ Imports:
Rcpp (>= 0.12.14), Rcpp (>= 0.12.14),
readr, readr,
rvest (>= 0.3.2), rvest (>= 0.3.2),
tibble tibble,
ggplot2
Suggests: Suggests:
testthat (>= 1.0.2), testthat (>= 1.0.2),
covr (>= 3.0.1), covr (>= 3.0.1),
rmarkdown, rmarkdown,
rstudioapi, rstudioapi,
tidyr, tidyr
ggplot2
LinkingTo: Rcpp
VignetteBuilder: knitr VignetteBuilder: knitr
URL: https://github.com/msberends/AMR URL: https://github.com/msberends/AMR
BugReports: https://github.com/msberends/AMR/issues BugReports: https://github.com/msberends/AMR/issues
License: GPL-2 | file LICENSE License: GPL-2 | file LICENSE
Encoding: UTF-8 Encoding: UTF-8
LazyData: true LazyData: true
RoxygenNote: 6.0.1.9000 RoxygenNote: 6.1.0

View File

@ -43,11 +43,14 @@ export(atc_groups)
export(atc_property) export(atc_property)
export(clipboard_export) export(clipboard_export)
export(clipboard_import) export(clipboard_import)
export(facet_rsi)
export(first_isolate) export(first_isolate)
export(freq) export(freq)
export(frequency_tbl) export(frequency_tbl)
export(full_join_microorganisms) export(full_join_microorganisms)
export(g.test) export(g.test)
export(geom_rsi)
export(ggplot_rsi)
export(guess_atc) export(guess_atc)
export(guess_bactid) export(guess_bactid)
export(inner_join_microorganisms) export(inner_join_microorganisms)
@ -68,13 +71,17 @@ export(portion_IR)
export(portion_R) export(portion_R)
export(portion_S) export(portion_S)
export(portion_SI) export(portion_SI)
export(portion_df)
export(ratio) export(ratio)
export(resistance_predict) export(resistance_predict)
export(right_join_microorganisms) export(right_join_microorganisms)
export(rsi) export(rsi)
export(rsi_predict) export(rsi_predict)
export(scale_rsi_colours)
export(scale_y_percent)
export(semi_join_microorganisms) export(semi_join_microorganisms)
export(skewness) export(skewness)
export(theme_rsi)
export(top_freq) export(top_freq)
exportMethods(as.data.frame.bactid) exportMethods(as.data.frame.bactid)
exportMethods(as.data.frame.frequency_tbl) exportMethods(as.data.frame.frequency_tbl)
@ -105,7 +112,6 @@ exportMethods(skewness.default)
exportMethods(skewness.matrix) exportMethods(skewness.matrix)
exportMethods(summary.mic) exportMethods(summary.mic)
exportMethods(summary.rsi) exportMethods(summary.rsi)
importFrom(Rcpp,evalCpp)
importFrom(clipr,read_clip_tbl) importFrom(clipr,read_clip_tbl)
importFrom(clipr,write_clip) importFrom(clipr,write_clip)
importFrom(curl,nslookup) importFrom(curl,nslookup)
@ -114,6 +120,7 @@ importFrom(dplyr,arrange)
importFrom(dplyr,arrange_at) importFrom(dplyr,arrange_at)
importFrom(dplyr,as_tibble) importFrom(dplyr,as_tibble)
importFrom(dplyr,between) importFrom(dplyr,between)
importFrom(dplyr,bind_cols)
importFrom(dplyr,case_when) importFrom(dplyr,case_when)
importFrom(dplyr,desc) importFrom(dplyr,desc)
importFrom(dplyr,filter) importFrom(dplyr,filter)
@ -130,6 +137,7 @@ importFrom(dplyr,row_number)
importFrom(dplyr,select) importFrom(dplyr,select)
importFrom(dplyr,slice) importFrom(dplyr,slice)
importFrom(dplyr,summarise) importFrom(dplyr,summarise)
importFrom(dplyr,summarise_if)
importFrom(dplyr,tibble) importFrom(dplyr,tibble)
importFrom(dplyr,top_n) importFrom(dplyr,top_n)
importFrom(grDevices,boxplot.stats) importFrom(grDevices,boxplot.stats)
@ -161,4 +169,3 @@ importFrom(utils,object.size)
importFrom(utils,read.delim) importFrom(utils,read.delim)
importFrom(utils,write.table) importFrom(utils,write.table)
importFrom(xml2,read_html) importFrom(xml2,read_html)
useDynLib(AMR, .registration = TRUE)

View File

@ -1,12 +1,16 @@
# 0.2.0.90xx (development version) # 0.2.0.90xx (development version)
**Published on CRAN: (unpublished)**
#### New #### New
* **BREAKING**: `rsi_df` was removed in favour of new functions `portion_R`, `portion_IR`, `portion_I`, `portion_SI` and `portion_S` to selectively calculate resistance or susceptibility. These functions use **hybrid evaluation**, which means that calculations are not done in R directly but rather in C++ using the `Rcpp` package, making them 20 to 30 times faster. The function `rsi` still works, but is deprecated. * **BREAKING**: `rsi_df` was removed in favour of new functions `portion_R`, `portion_IR`, `portion_I`, `portion_SI` and `portion_S` to selectively calculate resistance or susceptibility. These functions are 20 to 30 times faster than the old `rsi` function. The old function still works, but is deprecated.
* New function `portion_df` to get all portions of S, I and R of a data set with antibiotic columns
* **BREAKING**: the methodology for determining first weighted isolates was changed. The antibiotics that are compared between isolates (call *key antibiotics*) to include more first isolates (afterwards called first *weighted* isolates) are now as follows: * **BREAKING**: the methodology for determining first weighted isolates was changed. The antibiotics that are compared between isolates (call *key antibiotics*) to include more first isolates (afterwards called first *weighted* isolates) are now as follows:
* Universal: amoxicillin, amoxicillin/clavlanic acid, cefuroxime, piperacillin/tazobactam, ciprofloxacin, trimethoprim/sulfamethoxazole * Universal: amoxicillin, amoxicillin/clavlanic acid, cefuroxime, piperacillin/tazobactam, ciprofloxacin, trimethoprim/sulfamethoxazole
* Gram-positive: vancomycin, teicoplanin, tetracycline, erythromycin, oxacillin, rifampicin * Gram-positive: vancomycin, teicoplanin, tetracycline, erythromycin, oxacillin, rifampicin
* Gram-negative: gentamicin, tobramycin, colistin, cefotaxime, ceftazidime, meropenem * Gram-negative: gentamicin, tobramycin, colistin, cefotaxime, ceftazidime, meropenem
* Support for `ggplot2`
* New functions `geom_rsi`, `facet_rsi`, `scale_y_percent`, `scale_rsi_colours` and `theme_rsi`
* New wrapper function `ggplot_rsi` to apply all above functions on a data set:
* `septic_patients %>% select(tobr, gent) %>% ggplot_rsi` will show portions of S, I and R immediately in a pretty plot
* Determining bacterial ID: * Determining bacterial ID:
* New functions `as.bactid` and `is.bactid` to transform/ look up microbial ID's. * New functions `as.bactid` and `is.bactid` to transform/ look up microbial ID's.
* The existing function `guess_bactid` is now an alias of `as.bactid` * The existing function `guess_bactid` is now an alias of `as.bactid`

View File

@ -1,15 +0,0 @@
# Generated by using Rcpp::compileAttributes() -> do not edit by hand
# Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393
rsi_calc_S <- function(x, include_I) {
.Call(`_AMR_rsi_calc_S`, x, include_I)
}
rsi_calc_I <- function(x) {
.Call(`_AMR_rsi_calc_I`, x)
}
rsi_calc_R <- function(x, include_I) {
.Call(`_AMR_rsi_calc_R`, x, include_I)
}

130
R/ggplot_rsi.R Normal file
View File

@ -0,0 +1,130 @@
# ==================================================================== #
# TITLE #
# Antimicrobial Resistance (AMR) Analysis #
# #
# AUTHORS #
# Berends MS (m.s.berends@umcg.nl), Luz CF (c.f.luz@umcg.nl) #
# #
# LICENCE #
# This program is free software; you can redistribute it and/or modify #
# it under the terms of the GNU General Public License version 2.0, #
# as published by the Free Software Foundation. #
# #
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# ==================================================================== #
#' AMR bar plots with \code{ggplot}
#'
#' Use these functions to create bar plots for antimicrobial resistance analysis. All functions rely on internal \code{\link{ggplot}} functions.
#' @param data a \code{data.frame} with column(s) of class \code{"rsi"} (see \code{\link{as.rsi}})
#' @param position position adjustment of bars, either \code{"stack"} (default) or \code{"dodge"}
#' @param x parameter to show on x axis, either \code{"Antibiotic"} (default) or \code{"Interpretation"}
#' @param facet parameter to split plots by, either \code{"Interpretation"} (default) or \code{"Antibiotic"}
#' @details At default, the names of antibiotics will be shown on the plots using \code{\link{abname}}. This can be set with the option \code{get_antibiotic_names} (a logical value), so change it e.g. to \code{FALSE} with \code{options(get_antibiotic_names = FALSE)}.
#'
#' \strong{The functions}\cr
#' \code{geom_rsi} will take any variable from the data that has an \code{rsi} class (created with \code{\link{as.rsi}}) using \code{\link{portion_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{facet_rsi} creates 2d plots (at default based on S/I/R) using \code{\link{facet_wrap}}.
#'
#' \code{scale_y_percent} transforms the y axis to a 0 to 100% range.
#'
#' \code{scale_rsi_colours} sets colours to the bars: green for S, yellow for I and red for R.
#'
#' \code{theme_rsi} is a \code{\link{theme}} with minimal distraction.
#'
#' \code{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 (\code{\%>\%}). See Examples.
#' @rdname ggplot_rsi
#' @export
#' @examples
#' library(dplyr)
#' library(ggplot2)
#'
#' # get antimicrobial results for drugs against a UTI:
#' ggplot(septic_patients %>% select(amox, nitr, fosf, trim, cipr)) +
#' geom_rsi()
#'
#' # prettify it using some additional functions
#' df <- septic_patients[, c("amox", "nitr", "fosf", "trim", "cipr")]
#' ggplot(df) +
#' geom_rsi(x = "Interpretation") +
#' facet_rsi(facet = "Antibiotic") +
#' scale_y_percent() +
#' scale_rsi_colours() +
#' theme_rsi()
#'
#' # or better yet, simplify this using the wrapper function - a single command:
#' septic_patients %>%
#' select(amox, nitr, fosf, trim, cipr) %>%
#' ggplot_rsi()
#'
#' septic_patients %>%
#' select(amox, nitr, fosf, trim, cipr) %>%
#' ggplot_rsi(x = "Interpretation", facet = "Antibiotic")
ggplot_rsi <- function(data,
x = "Antibiotic",
facet = NULL) {
p <- ggplot2::ggplot(data = data) +
geom_rsi(x = x) +
scale_y_percent() +
scale_rsi_colours() +
theme_rsi()
if (!is.null(facet)) {
p <- p + facet_rsi(facet = facet)
}
p
}
#' @rdname ggplot_rsi
#' @export
geom_rsi <- function(position = "stack", x = c("Antibiotic", "Interpretation")) {
x <- x[1]
if (!x %in% c("Antibiotic", "Interpretation")) {
stop("`x` must be 'Antibiotic' or 'Interpretation'")
}
ggplot2::layer(geom = "bar", stat = "identity", position = position,
mapping = ggplot2::aes_string(x = x, y = "Percentage", fill = "Interpretation"),
data = AMR::portion_df, params = list())
}
#' @rdname ggplot_rsi
#' @export
facet_rsi <- function(facet = c("Interpretation", "Antibiotic")) {
facet <- facet[1]
if (!facet %in% c("Antibiotic", "Interpretation")) {
stop("`facet` must be 'Antibiotic' or 'Interpretation'")
}
ggplot2::facet_wrap(facets = facet, scales = "free")
}
#' @rdname ggplot_rsi
#' @export
scale_y_percent <- function() {
ggplot2::scale_y_continuous(name = "Percentage",
breaks = seq(0, 1, 0.1),
limits = c(0, 1),
labels = percent(seq(0, 1, 0.1)))
}
#' @rdname ggplot_rsi
#' @export
scale_rsi_colours <- function() {
ggplot2::scale_fill_brewer(palette = "RdYlGn")
}
#' @rdname ggplot_rsi
#' @export
theme_rsi <- function() {
theme_minimal() +
theme(panel.grid.major.x = element_blank(),
panel.grid.minor = element_blank(),
panel.grid.major.y = element_line(colour = "grey75"))
}

View File

@ -17,6 +17,14 @@
# ==================================================================== # # ==================================================================== #
globalVariables(c('abname', globalVariables(c('abname',
'Antibiotic',
'Interpretation',
'Percentage',
'bind_rows',
'element_blank',
'element_line',
'theme',
'theme_minimal',
'antibiotic', 'antibiotic',
'antibiotics', 'antibiotics',
'atc', 'atc',

View File

@ -25,8 +25,12 @@
#' @param ab2 like \code{ab}, a vector of antibiotic interpretations. Use this to calculate (the lack of) co-resistance: the probability where one of two drugs have a resistant or susceptible result. See Examples. #' @param ab2 like \code{ab}, a vector of antibiotic interpretations. Use this to calculate (the lack of) co-resistance: the probability where one of two drugs have a resistant or susceptible result. See Examples.
#' @param minimum minimal amount of available isolates. Any number lower than \code{minimum} will return \code{NA}. The default number of \code{30} isolates is advised by the CLSI as best practice, see Source. #' @param minimum minimal amount of available isolates. Any number lower than \code{minimum} will return \code{NA}. The default number of \code{30} isolates is advised by the CLSI as best practice, see Source.
#' @param as_percent logical to indicate whether the output must be returned as percent (text), will else be a double #' @param as_percent logical to indicate whether the output must be returned as percent (text), will else be a double
#' @param data a code{data.frame} containing columns with class \code{rsi} (see \code{\link{as.rsi}})
#' @param translate a logical value to indicate whether antibiotic abbreviations should be translated with \code{\link{abname}}
#' @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!} Use \code{\link{first_isolate}} to determine them in your data set.
#' #'
#' \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 \code{data.frame} will have three rows (for R/I/S) and a column for each variable with class \code{"rsi"}.
#'
#' The old \code{\link{rsi}} function is still available for backwards compatibility but is deprecated. #' The old \code{\link{rsi}} function is still available for backwards compatibility but is deprecated.
#' \if{html}{ #' \if{html}{
#' \cr\cr #' \cr\cr
@ -225,11 +229,11 @@ rsi_calc <- function(type,
} }
if (type == "S") { if (type == "S") {
found <- .Call(`_AMR_rsi_calc_S`, x, include_I) found <- sum(as.integer(x) <= 1 + include_I, na.rm = TRUE)
} else if (type == "I") { } else if (type == "I") {
found <- .Call(`_AMR_rsi_calc_I`, x) found <- sum(as.integer(x) == 2, na.rm = TRUE)
} else if (type == "R") { } else if (type == "R") {
found <- .Call(`_AMR_rsi_calc_R`, x, include_I) found <- sum(as.integer(x) >= 3 - include_I, na.rm = TRUE)
} else { } else {
stop("invalid type") stop("invalid type")
} }
@ -240,3 +244,29 @@ rsi_calc <- function(type,
found / total found / total
} }
} }
#' @rdname portion
#' @importFrom dplyr bind_cols summarise_if mutate
#' @export
portion_df <- function(data, translate = getOption("get_antibiotic_names", TRUE)) {
resS <- bind_cols(data.frame(Interpretation = "S", stringsAsFactors = FALSE),
summarise_if(.tbl = data,
.predicate = is.rsi,
.funs = portion_S))
resI <- bind_cols(data.frame(Interpretation = "I", stringsAsFactors = FALSE),
summarise_if(.tbl = data,
.predicate = is.rsi,
.funs = portion_I))
resR <- bind_cols(data.frame(Interpretation = "R", stringsAsFactors = FALSE),
summarise_if(.tbl = data,
.predicate = is.rsi,
.funs = portion_R))
res <- bind_rows(resS, resI, resR) %>%
mutate(Interpretation = factor(Interpretation, levels = c("R", "I", "S"), ordered = TRUE)) %>%
tidyr::gather(Antibiotic, Percentage, -Interpretation)
if (translate == TRUE) {
res <- res %>% mutate(Antibiotic = abname(Antibiotic, from = "guess", to = "official"))
}
res
}

View File

@ -1,7 +1,3 @@
.onLoad <- function(libname, pkgname) { .onLoad <- function(libname, pkgname) {
backports::import(pkgname) backports::import(pkgname)
} }
#' @importFrom Rcpp evalCpp
#' @useDynLib AMR, .registration = TRUE
NULL

View File

@ -50,8 +50,6 @@ And it contains:
With the `MDRO` function (abbreviation of Multi Drug Resistant Organisms), you can check your isolates for exceptional resistance with country-specific guidelines or EUCAST rules. Currently guidelines for Germany and the Netherlands are supported. Please suggest addition of your own country here: [https://github.com/msberends/AMR/issues/new](https://github.com/msberends/AMR/issues/new?title=New%20guideline%20for%20MDRO&body=%3C--%20Please%20add%20your%20country%20code,%20guideline%20name,%20version%20and%20source%20below%20and%20remove%20this%20line--%3E). With the `MDRO` function (abbreviation of Multi Drug Resistant Organisms), you can check your isolates for exceptional resistance with country-specific guidelines or EUCAST rules. Currently guidelines for Germany and the Netherlands are supported. Please suggest addition of your own country here: [https://github.com/msberends/AMR/issues/new](https://github.com/msberends/AMR/issues/new?title=New%20guideline%20for%20MDRO&body=%3C--%20Please%20add%20your%20country%20code,%20guideline%20name,%20version%20and%20source%20below%20and%20remove%20this%20line--%3E).
The functions to calculate microbial resistance use expressions that are not evaluated by R itself, but by alternative C++ code that is 25 to 30 times faster than R and uses less memory. This is called *hybrid evaluation*.
#### Read all changes and new functions in [NEWS.md](NEWS.md). #### Read all changes and new functions in [NEWS.md](NEWS.md).
## How to get it? ## How to get it?
@ -145,27 +143,21 @@ rsi_data <- as.rsi(c(rep("S", 474), rep("I", 36), rep("R", 370)))
``` ```
These functions also try to coerce valid values. These functions also try to coerce valid values.
Quick overviews when just printing objects: Quick overviews with `summary`:
```r ```r
mic_data summary(rsi_data)
# Class 'mic': 7 isolates # Mode :rsi
# # <NA> :0
# <NA> 0 # Sum S :474
# # Sum IR:406
# <=0.128 1 8 16 >=32 # -Sum R:370
# 1 1 2 2 1 # -Sum I:36
rsi_data summary(mic_data)
# Class 'rsi': 880 isolates # Mode:mic
# # <NA>:0
# <NA>: 0 # Min.:<=0.128
# Sum of S: 474 # Max.:>=32
# Sum of IR: 406
# - Sum of R: 370
# - Sum of I: 36
#
# %S %IR %I %R
# 53.9 46.1 4.1 42.0
``` ```
A plot of `rsi_data`: A plot of `rsi_data`:

View File

@ -7,8 +7,8 @@
\code{\link{antibiotics}} \code{\link{antibiotics}}
} }
\usage{ \usage{
abname(abcode, from = c("guess", "atc", "molis", "umcg"), to = "official", abname(abcode, from = c("guess", "atc", "molis", "umcg"),
textbetween = " + ", tolower = FALSE) to = "official", textbetween = " + ", tolower = FALSE)
} }
\arguments{ \arguments{
\item{abcode}{a code or name, like \code{"AMOX"}, \code{"AMCL"} or \code{"J01CA04"}} \item{abcode}{a code or name, like \code{"AMOX"}, \code{"AMCL"} or \code{"J01CA04"}}

View File

@ -9,10 +9,11 @@ Methodology of this function is based on: \strong{M39 Analysis and Presentation
\usage{ \usage{
first_isolate(tbl, col_date, col_patient_id, col_bactid = NA, first_isolate(tbl, col_date, col_patient_id, col_bactid = NA,
col_testcode = NA, col_specimen = NA, col_icu = NA, col_testcode = NA, col_specimen = NA, col_icu = NA,
col_keyantibiotics = NA, episode_days = 365, testcodes_exclude = "", col_keyantibiotics = NA, episode_days = 365,
icu_exclude = FALSE, filter_specimen = NA, output_logical = TRUE, testcodes_exclude = "", icu_exclude = FALSE, filter_specimen = NA,
type = "keyantibiotics", ignore_I = TRUE, points_threshold = 2, output_logical = TRUE, type = "keyantibiotics", ignore_I = TRUE,
info = TRUE, col_genus = NA, col_species = NA) points_threshold = 2, info = TRUE, col_genus = NA,
col_species = NA)
} }
\arguments{ \arguments{
\item{tbl}{a \code{data.frame} containing isolates.} \item{tbl}{a \code{data.frame} containing isolates.}

View File

@ -7,9 +7,9 @@
\alias{print.frequency_tbl} \alias{print.frequency_tbl}
\title{Frequency table} \title{Frequency table}
\usage{ \usage{
frequency_tbl(x, ..., sort.count = TRUE, nmax = getOption("max.print.freq"), frequency_tbl(x, ..., sort.count = TRUE,
na.rm = TRUE, row.names = TRUE, markdown = FALSE, digits = 2, nmax = getOption("max.print.freq"), na.rm = TRUE, row.names = TRUE,
sep = " ") markdown = FALSE, digits = 2, sep = " ")
freq(x, ..., sort.count = TRUE, nmax = getOption("max.print.freq"), freq(x, ..., sort.count = TRUE, nmax = getOption("max.print.freq"),
na.rm = TRUE, row.names = TRUE, markdown = FALSE, digits = 2, na.rm = TRUE, row.names = TRUE, markdown = FALSE, digits = 2,
@ -17,8 +17,8 @@ freq(x, ..., sort.count = TRUE, nmax = getOption("max.print.freq"),
top_freq(f, n) top_freq(f, n)
\method{print}{frequency_tbl}(x, nmax = getOption("max.print.freq", default = \method{print}{frequency_tbl}(x, nmax = getOption("max.print.freq",
15), ...) default = 15), ...)
} }
\arguments{ \arguments{
\item{x}{vector of any class or a \code{\link{data.frame}}, \code{\link{tibble}} or \code{\link{table}}} \item{x}{vector of any class or a \code{\link{data.frame}}, \code{\link{tibble}} or \code{\link{table}}}

View File

@ -12,7 +12,8 @@ This code is almost identical to \code{\link{chisq.test}}, except that:
} }
} }
\usage{ \usage{
g.test(x, y = NULL, p = rep(1/length(x), length(x)), rescale.p = FALSE) g.test(x, y = NULL, p = rep(1/length(x), length(x)),
rescale.p = FALSE)
} }
\arguments{ \arguments{
\item{x}{a numeric vector or matrix. \code{x} and \code{y} can also \item{x}{a numeric vector or matrix. \code{x} and \code{y} can also

77
man/ggplot_rsi.Rd Normal file
View File

@ -0,0 +1,77 @@
% 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}
\alias{scale_y_percent}
\alias{scale_rsi_colours}
\alias{theme_rsi}
\title{AMR bar plots with \code{ggplot}}
\usage{
ggplot_rsi(data, x = "Antibiotic", facet = NULL)
geom_rsi(position = "stack", x = c("Antibiotic", "Interpretation"))
facet_rsi(facet = c("Interpretation", "Antibiotic"))
scale_y_percent()
scale_rsi_colours()
theme_rsi()
}
\arguments{
\item{data}{a \code{data.frame} with column(s) of class \code{"rsi"} (see \code{\link{as.rsi}})}
\item{x}{parameter to show on x axis, either \code{"Antibiotic"} (default) or \code{"Interpretation"}}
\item{facet}{parameter to split plots by, either \code{"Interpretation"} (default) or \code{"Antibiotic"}}
\item{position}{position adjustment of bars, either \code{"stack"} (default) or \code{"dodge"}}
}
\description{
Use these functions to create bar plots for antimicrobial resistance analysis. All functions rely on internal \code{\link{ggplot}} functions.
}
\details{
At default, the names of antibiotics will be shown on the plots using \code{\link{abname}}. This can be set with the option \code{get_antibiotic_names} (a logical value), so change it e.g. to \code{FALSE} with \code{options(get_antibiotic_names = FALSE)}.
\strong{The functions}\cr
\code{geom_rsi} will take any variable from the data that has an \code{rsi} class (created with \code{\link{as.rsi}}) using \code{\link{portion_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{facet_rsi} creates 2d plots (at default based on S/I/R) using \code{\link{facet_wrap}}.
\code{scale_y_percent} transforms the y axis to a 0 to 100% range.
\code{scale_rsi_colours} sets colours to the bars: green for S, yellow for I and red for R.
\code{theme_rsi} is a \code{\link{theme}} with minimal distraction.
\code{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 (\code{\%>\%}). See Examples.
}
\examples{
library(dplyr)
library(ggplot2)
# get antimicrobial results for drugs against a UTI:
ggplot(septic_patients \%>\% select(amox, nitr, fosf, trim, cipr)) +
geom_rsi()
# prettify it using some additional functions
df <- septic_patients[, c("amox", "nitr", "fosf", "trim", "cipr")]
ggplot(df) +
geom_rsi(x = "Interpretation") +
facet_rsi(facet = "Antibiotic") +
scale_y_percent() +
scale_rsi_colours() +
theme_rsi()
# or better yet, simplify this using the wrapper function - a single command:
septic_patients \%>\%
select(amox, nitr, fosf, trim, cipr) \%>\%
ggplot_rsi()
septic_patients \%>\%
select(amox, nitr, fosf, trim, cipr) \%>\%
ggplot_rsi(x = "Interpretation", facet = "Antibiotic")
}

View File

@ -7,6 +7,7 @@
\alias{portion_I} \alias{portion_I}
\alias{portion_SI} \alias{portion_SI}
\alias{portion_S} \alias{portion_S}
\alias{portion_df}
\title{Calculate resistance of isolates} \title{Calculate resistance of isolates}
\source{ \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/}. \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/}.
@ -21,6 +22,8 @@ portion_I(ab1, minimum = 30, as_percent = FALSE)
portion_SI(ab1, ab2 = NULL, minimum = 30, as_percent = FALSE) portion_SI(ab1, ab2 = NULL, minimum = 30, as_percent = FALSE)
portion_S(ab1, ab2 = NULL, minimum = 30, as_percent = FALSE) portion_S(ab1, ab2 = NULL, minimum = 30, as_percent = FALSE)
portion_df(data, translate = getOption("get_antibiotic_names", TRUE))
} }
\arguments{ \arguments{
\item{ab1}{vector of antibiotic interpretations, they will be transformed internally with \code{\link{as.rsi}} if needed} \item{ab1}{vector of antibiotic interpretations, they will be transformed internally with \code{\link{as.rsi}} if needed}
@ -30,6 +33,10 @@ portion_S(ab1, ab2 = NULL, minimum = 30, as_percent = FALSE)
\item{minimum}{minimal amount of available isolates. Any number lower than \code{minimum} will return \code{NA}. The default number of \code{30} isolates is advised by the CLSI as best practice, see Source.} \item{minimum}{minimal amount of available isolates. Any number lower than \code{minimum} will return \code{NA}. The default number of \code{30} isolates is advised by the CLSI as best practice, see Source.}
\item{as_percent}{logical to indicate whether the output must be returned as percent (text), will else be a double} \item{as_percent}{logical to indicate whether the output must be returned as percent (text), will else be a double}
\item{data}{a code{data.frame} containing columns with class \code{rsi} (see \code{\link{as.rsi}})}
\item{translate}{a logical value to indicate whether antibiotic abbreviations should be translated with \code{\link{abname}}}
} }
\value{ \value{
Double or, when \code{as_percent = TRUE}, a character. Double or, when \code{as_percent = TRUE}, a character.
@ -42,6 +49,8 @@ These functions can be used to calculate the (co-)resistance of microbial isolat
\details{ \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. \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.
\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 \code{data.frame} will have three rows (for R/I/S) and a column for each variable with class \code{"rsi"}.
The old \code{\link{rsi}} function is still available for backwards compatibility but is deprecated. The old \code{\link{rsi}} function is still available for backwards compatibility but is deprecated.
\if{html}{ \if{html}{
\cr\cr \cr\cr

View File

@ -5,9 +5,10 @@
\alias{rsi_predict} \alias{rsi_predict}
\title{Predict antimicrobial resistance} \title{Predict antimicrobial resistance}
\usage{ \usage{
resistance_predict(tbl, col_ab, col_date, year_min = NULL, year_max = NULL, resistance_predict(tbl, col_ab, col_date, year_min = NULL,
year_every = 1, minimum = 30, model = "binomial", I_as_R = TRUE, year_max = NULL, year_every = 1, minimum = 30,
preserve_measurements = TRUE, info = TRUE) model = "binomial", I_as_R = TRUE, preserve_measurements = TRUE,
info = TRUE)
rsi_predict(tbl, col_ab, col_date, year_min = NULL, year_max = NULL, rsi_predict(tbl, col_ab, col_date, year_min = NULL, year_max = NULL,
year_every = 1, minimum = 30, model = "binomial", I_as_R = TRUE, year_every = 1, minimum = 30, model = "binomial", I_as_R = TRUE,

View File

@ -1,54 +0,0 @@
// Generated by using Rcpp::compileAttributes() -> do not edit by hand
// Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393
#include <Rcpp.h>
using namespace Rcpp;
// rsi_calc_S
int rsi_calc_S(DoubleVector x, bool include_I);
RcppExport SEXP _AMR_rsi_calc_S(SEXP xSEXP, SEXP include_ISEXP) {
BEGIN_RCPP
Rcpp::RObject rcpp_result_gen;
Rcpp::RNGScope rcpp_rngScope_gen;
Rcpp::traits::input_parameter< DoubleVector >::type x(xSEXP);
Rcpp::traits::input_parameter< bool >::type include_I(include_ISEXP);
rcpp_result_gen = Rcpp::wrap(rsi_calc_S(x, include_I));
return rcpp_result_gen;
END_RCPP
}
// rsi_calc_I
int rsi_calc_I(DoubleVector x);
RcppExport SEXP _AMR_rsi_calc_I(SEXP xSEXP) {
BEGIN_RCPP
Rcpp::RObject rcpp_result_gen;
Rcpp::RNGScope rcpp_rngScope_gen;
Rcpp::traits::input_parameter< DoubleVector >::type x(xSEXP);
rcpp_result_gen = Rcpp::wrap(rsi_calc_I(x));
return rcpp_result_gen;
END_RCPP
}
// rsi_calc_R
int rsi_calc_R(DoubleVector x, bool include_I);
RcppExport SEXP _AMR_rsi_calc_R(SEXP xSEXP, SEXP include_ISEXP) {
BEGIN_RCPP
Rcpp::RObject rcpp_result_gen;
Rcpp::RNGScope rcpp_rngScope_gen;
Rcpp::traits::input_parameter< DoubleVector >::type x(xSEXP);
Rcpp::traits::input_parameter< bool >::type include_I(include_ISEXP);
rcpp_result_gen = Rcpp::wrap(rsi_calc_R(x, include_I));
return rcpp_result_gen;
END_RCPP
}
static const R_CallMethodDef CallEntries[] = {
{"_AMR_rsi_calc_S", (DL_FUNC) &_AMR_rsi_calc_S, 2},
{"_AMR_rsi_calc_I", (DL_FUNC) &_AMR_rsi_calc_I, 1},
{"_AMR_rsi_calc_R", (DL_FUNC) &_AMR_rsi_calc_R, 2},
{NULL, NULL, 0}
};
RcppExport void R_init_AMR(DllInfo *dll) {
R_registerRoutines(dll, NULL, CallEntries, NULL, NULL);
R_useDynamicSymbols(dll, FALSE);
}

View File

@ -1,27 +0,0 @@
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
int rsi_calc_S(DoubleVector x, bool include_I) {
return count_if(x.begin(),
x.end(),
bind2nd(std::less_equal<double>(),
1 + include_I));
}
// [[Rcpp::export]]
int rsi_calc_I(DoubleVector x) {
return count_if(x.begin(),
x.end(),
bind2nd(std::equal_to<double>(),
2));
}
// [[Rcpp::export]]
int rsi_calc_R(DoubleVector x, bool include_I) {
return count_if(x.begin(),
x.end(),
bind2nd(std::greater_equal<double>(),
3 - include_I));
}