mirror of
https://github.com/msberends/AMR.git
synced 2025-01-13 23:31:38 +01:00
rsi family for resistance analysis
This commit is contained in:
parent
227121af3d
commit
ae2433a020
@ -1,6 +1,6 @@
|
|||||||
Package: AMR
|
Package: AMR
|
||||||
Version: 0.2.0.9020
|
Version: 0.2.0.9021
|
||||||
Date: 2018-08-02
|
Date: 2018-08-03
|
||||||
Title: Antimicrobial Resistance Analysis
|
Title: Antimicrobial Resistance Analysis
|
||||||
Authors@R: c(
|
Authors@R: c(
|
||||||
person(
|
person(
|
||||||
|
11
NAMESPACE
11
NAMESPACE
@ -31,12 +31,8 @@ export("%like%")
|
|||||||
export(BRMO)
|
export(BRMO)
|
||||||
export(EUCAST_exceptional_phenotypes)
|
export(EUCAST_exceptional_phenotypes)
|
||||||
export(EUCAST_rules)
|
export(EUCAST_rules)
|
||||||
export(IR)
|
|
||||||
export(MDRO)
|
export(MDRO)
|
||||||
export(MRGN)
|
export(MRGN)
|
||||||
export(R)
|
|
||||||
export(S)
|
|
||||||
export(SI)
|
|
||||||
export(abname)
|
export(abname)
|
||||||
export(anti_join_microorganisms)
|
export(anti_join_microorganisms)
|
||||||
export(as.bactid)
|
export(as.bactid)
|
||||||
@ -55,6 +51,7 @@ export(g.test)
|
|||||||
export(guess_atc)
|
export(guess_atc)
|
||||||
export(guess_bactid)
|
export(guess_bactid)
|
||||||
export(inner_join_microorganisms)
|
export(inner_join_microorganisms)
|
||||||
|
export(intermediate)
|
||||||
export(interpretive_reading)
|
export(interpretive_reading)
|
||||||
export(is.bactid)
|
export(is.bactid)
|
||||||
export(is.mic)
|
export(is.mic)
|
||||||
@ -72,6 +69,12 @@ export(resistance)
|
|||||||
export(resistance_predict)
|
export(resistance_predict)
|
||||||
export(right_join_microorganisms)
|
export(right_join_microorganisms)
|
||||||
export(rsi)
|
export(rsi)
|
||||||
|
export(rsi_I)
|
||||||
|
export(rsi_IR)
|
||||||
|
export(rsi_R)
|
||||||
|
export(rsi_S)
|
||||||
|
export(rsi_SI)
|
||||||
|
export(rsi_n)
|
||||||
export(rsi_predict)
|
export(rsi_predict)
|
||||||
export(semi_join_microorganisms)
|
export(semi_join_microorganisms)
|
||||||
export(skewness)
|
export(skewness)
|
||||||
|
2
NEWS.md
2
NEWS.md
@ -2,7 +2,7 @@
|
|||||||
**Published on CRAN: (unpublished)**
|
**Published on CRAN: (unpublished)**
|
||||||
|
|
||||||
#### New
|
#### New
|
||||||
* **BREAKING**: `rsi_df` was removed in favour of new functions `R`, `IR`, `SI` and `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 `rsi_R`, `rsi_IR`, `rsi_I`, `rsi_SI` and `rsi_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. The function `n_rsi` is accompanied by `rsi_n`.
|
||||||
* **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
|
||||||
|
@ -5,6 +5,10 @@ rsi_calc_S <- function(x, include_I) {
|
|||||||
.Call(`_AMR_rsi_calc_S`, 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) {
|
rsi_calc_R <- function(x, include_I) {
|
||||||
.Call(`_AMR_rsi_calc_R`, x, include_I)
|
.Call(`_AMR_rsi_calc_R`, x, include_I)
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#' @param Becker a logical to indicate whether \emph{Staphylococci} should be categorised into Coagulase Negative \emph{Staphylococci} ("CoNS") and Coagulase Positive \emph{Staphylococci} ("CoPS") instead of their own species, according to Karsten Becker \emph{et al.} [1]. This excludes \emph{Staphylococcus aureus} at default, use \code{Becker = "all"} to also categorise \emph{S. aureus} as "CoPS".
|
#' @param Becker a logical to indicate whether \emph{Staphylococci} should be categorised into Coagulase Negative \emph{Staphylococci} ("CoNS") and Coagulase Positive \emph{Staphylococci} ("CoPS") instead of their own species, according to Karsten Becker \emph{et al.} [1]. This excludes \emph{Staphylococcus aureus} at default, use \code{Becker = "all"} to also categorise \emph{S. aureus} as "CoPS".
|
||||||
#' @param Lancefield a logical to indicate whether beta-haemolytic \emph{Streptococci} should be categorised into Lancefield groups instead of their own species, according to Rebecca C. Lancefield [2]. These \emph{Streptococci} will be categorised in their first group, i.e. \emph{Streptococcus dysgalactiae} will be group C, although officially it was also categorised into groups G and L. Groups D and E will be ignored, since they are \emph{Enterococci}.
|
#' @param Lancefield a logical to indicate whether beta-haemolytic \emph{Streptococci} should be categorised into Lancefield groups instead of their own species, according to Rebecca C. Lancefield [2]. These \emph{Streptococci} will be categorised in their first group, i.e. \emph{Streptococcus dysgalactiae} will be group C, although officially it was also categorised into groups G and L. Groups D and E will be ignored, since they are \emph{Enterococci}.
|
||||||
#' @rdname as.bactid
|
#' @rdname as.bactid
|
||||||
|
#' @keywords bactid Becker becker Lancefield lancefield guess
|
||||||
#' @details \code{guess_bactid} is an alias of \code{as.bactid}.
|
#' @details \code{guess_bactid} is an alias of \code{as.bactid}.
|
||||||
#'
|
#'
|
||||||
#' Some exceptions have been built in to get more logical results, based on prevalence of human pathogens. These are:
|
#' Some exceptions have been built in to get more logical results, based on prevalence of human pathogens. These are:
|
||||||
|
@ -18,20 +18,17 @@
|
|||||||
|
|
||||||
#' Calculate resistance of isolates
|
#' Calculate resistance of isolates
|
||||||
#'
|
#'
|
||||||
#' These functions can be used to calculate the (co-)resistance of microbial isolates (i.e. percentage S, SI, IR or R). All functions can be used in \code{dplyr}s \code{\link[dplyr]{summarise}} and support grouped variables, see \emph{Examples}. \cr\cr
|
#' These functions can be used to calculate the (co-)resistance of microbial isolates (i.e. percentage S, SI, I, IR or R). All functions can be used in \code{dplyr}s \code{\link[dplyr]{summarise}} and support grouped variables, see \emph{Examples}. \cr\cr
|
||||||
#' \code{R} and \code{IR} can be used to calculate resistance, \code{S} and \code{SI} can be used to calculate susceptibility.\cr
|
#' \code{rsi_R} and \code{rsi_IR} can be used to calculate resistance, \code{rsi_S} and \code{rsi_SI} can be used to calculate susceptibility.\cr
|
||||||
#' \code{n_rsi} counts all cases where antimicrobial interpretations are available.
|
#' \code{rsi_n} counts all cases where antimicrobial interpretations are available.
|
||||||
#' @param ab1 vector of antibiotic interpretations, they will be transformed internally with \code{\link{as.rsi}}
|
#' @param ab1 vector of antibiotic interpretations, they will be transformed internally with \code{\link{as.rsi}}
|
||||||
#' @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 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 susceptible result. See Examples.
|
||||||
#' @param include_I logical to indicate whether antimicrobial interpretations of "I" should be included
|
#' @param include_I logical to indicate whether antimicrobial interpretations of "I" should be included
|
||||||
#' @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 interpretation antimicrobial interpretation
|
|
||||||
#' @param info \emph{DEPRECATED} calculate the amount of available isolates and print it, like \code{n = 423}
|
|
||||||
#' @param warning \emph{DEPRECATED} show a warning when the available amount of isolates is below \code{minimum}
|
|
||||||
#' @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.
|
||||||
#'
|
#'
|
||||||
#' The functions \code{resistance} and \code{susceptibility} are wrappers around \code{IR} and \code{S}, respectively. All functions except \code{rsi} use hybrid evaluation (i.e. using C++), which makes these functions 20-30 times faster than the old \code{rsi} function. This latter function is still available for backwards compatibility but is deprecated.
|
#' The functions \code{resistance} and \code{susceptibility} are wrappers around \code{rsi_IR} and \code{rsi_S}, respectively. All functions use hybrid evaluation (i.e. using C++), which makes these functions 20-30 times faster than the old \code{\link{rsi}} function. This latter function is still available for backwards compatibility but is deprecated.
|
||||||
#' \if{html}{
|
#' \if{html}{
|
||||||
#' \cr\cr
|
#' \cr\cr
|
||||||
#' To calculate the probability (\emph{p}) of susceptibility of one antibiotic, we use this formula:
|
#' To calculate the probability (\emph{p}) of susceptibility of one antibiotic, we use this formula:
|
||||||
@ -47,48 +44,57 @@
|
|||||||
#' @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/}.
|
#' @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/}.
|
||||||
#' @keywords resistance susceptibility rsi_df rsi antibiotics isolate isolates
|
#' @keywords resistance susceptibility rsi_df rsi antibiotics isolate isolates
|
||||||
#' @return Double or, when \code{as_percent = TRUE}, a character.
|
#' @return Double or, when \code{as_percent = TRUE}, a character.
|
||||||
#' @rdname resistance
|
#' @rdname rsi_IR
|
||||||
|
#' @name rsi_IR
|
||||||
#' @export
|
#' @export
|
||||||
#' @examples
|
#' @examples
|
||||||
#' # Calculate resistance
|
#' # Calculate resistance
|
||||||
#' R(septic_patients$amox)
|
#' rsi_R(septic_patients$amox)
|
||||||
#' IR(septic_patients$amox)
|
#' rsi_IR(septic_patients$amox)
|
||||||
#'
|
#'
|
||||||
#' # Or susceptibility
|
#' # Or susceptibility
|
||||||
#' S(septic_patients$amox)
|
#' rsi_S(septic_patients$amox)
|
||||||
#' SI(septic_patients$amox)
|
#' rsi_SI(septic_patients$amox)
|
||||||
#'
|
#'
|
||||||
#' # Since n_rsi counts available isolates (and is used as denominator),
|
#' # Since n_rsi counts available isolates (and is used as denominator),
|
||||||
#' # you can calculate back to e.g. count resistant isolates:
|
#' # you can calculate back to e.g. count resistant isolates:
|
||||||
#' IR(septic_patients$amox) * n_rsi(septic_patients$amox)
|
#' rsi_IR(septic_patients$amox) * n_rsi(septic_patients$amox)
|
||||||
#'
|
#'
|
||||||
#' library(dplyr)
|
#' library(dplyr)
|
||||||
#' septic_patients %>%
|
#' septic_patients %>%
|
||||||
#' group_by(hospital_id) %>%
|
#' group_by(hospital_id) %>%
|
||||||
#' summarise(p = S(cipr),
|
#' summarise(p = rsi_S(cipr),
|
||||||
#' n = n_rsi(cipr)) # n_rsi works like n_distinct in dplyr
|
#' n = rsi_n(cipr)) # n_rsi works like n_distinct in dplyr
|
||||||
#'
|
|
||||||
#' # Calculate co-resistance between amoxicillin/clav acid and gentamicin,
|
|
||||||
#' # so we can see that combination therapy does a lot more than mono therapy:
|
|
||||||
#' S(septic_patients$amcl) # p = 67.3%
|
|
||||||
#' n_rsi(septic_patients$amcl) # n = 1570
|
|
||||||
#'
|
|
||||||
#' S(septic_patients$gent) # p = 74.0%
|
|
||||||
#' n_rsi(septic_patients$gent) # n = 1842
|
|
||||||
#'
|
|
||||||
#' with(septic_patients,
|
|
||||||
#' S(amcl, gent)) # p = 92.1%
|
|
||||||
#' with(septic_patients,
|
|
||||||
#' n_rsi(amcl, gent)) # n = 1504
|
|
||||||
#'
|
#'
|
||||||
#' septic_patients %>%
|
#' septic_patients %>%
|
||||||
#' group_by(hospital_id) %>%
|
#' group_by(hospital_id) %>%
|
||||||
#' summarise(cipro_p = S(cipr, as_percent = TRUE),
|
#' summarise(R = rsi_R(cipr, as_percent = TRUE),
|
||||||
#' cipro_n = n_rsi(cipr),
|
#' I = rsi_I(cipr, as_percent = TRUE),
|
||||||
#' genta_p = S(gent, as_percent = TRUE),
|
#' S = rsi_S(cipr, as_percent = TRUE),
|
||||||
#' genta_n = n_rsi(gent),
|
#' n = rsi_n(cipr), # also: n_rsi, works like n_distinct in dplyr
|
||||||
#' combination_p = S(cipr, gent, as_percent = TRUE),
|
#' total = n()) # this is the length, NOT the amount of tested isolates
|
||||||
#' combination_n = n_rsi(cipr, gent))
|
#'
|
||||||
|
#' # Calculate co-resistance between amoxicillin/clav acid and gentamicin,
|
||||||
|
#' # so we can see that combination therapy does a lot more than mono therapy:
|
||||||
|
#' rsi_S(septic_patients$amcl) # S = 67.3%
|
||||||
|
#' rsi_n(septic_patients$amcl) # n = 1570
|
||||||
|
#'
|
||||||
|
#' rsi_S(septic_patients$gent) # S = 74.0%
|
||||||
|
#' rsi_n(septic_patients$gent) # n = 1842
|
||||||
|
#'
|
||||||
|
#' with(septic_patients,
|
||||||
|
#' rsi_S(amcl, gent)) # S = 92.1%
|
||||||
|
#' with(septic_patients, # n = 1504
|
||||||
|
#' rsi_n(amcl, gent))
|
||||||
|
#'
|
||||||
|
#' septic_patients %>%
|
||||||
|
#' group_by(hospital_id) %>%
|
||||||
|
#' summarise(cipro_p = rsi_S(cipr, as_percent = TRUE),
|
||||||
|
#' cipro_n = rsi_n(cipr),
|
||||||
|
#' genta_p = rsi_S(gent, as_percent = TRUE),
|
||||||
|
#' genta_n = rsi_n(gent),
|
||||||
|
#' combination_p = rsi_S(cipr, gent, as_percent = TRUE),
|
||||||
|
#' combination_n = rsi_n(cipr, gent))
|
||||||
#'
|
#'
|
||||||
#' \dontrun{
|
#' \dontrun{
|
||||||
#'
|
#'
|
||||||
@ -96,28 +102,42 @@
|
|||||||
#' my_table %>%
|
#' my_table %>%
|
||||||
#' filter(first_isolate == TRUE,
|
#' filter(first_isolate == TRUE,
|
||||||
#' genus == "Helicobacter") %>%
|
#' genus == "Helicobacter") %>%
|
||||||
#' summarise(p = S(amox, metr), # amoxicillin with metronidazole
|
#' summarise(p = rsi_S(amox, metr), # amoxicillin with metronidazole
|
||||||
#' n = n_rsi(amox, metr))
|
#' n = rsi_n(amox, metr))
|
||||||
#' }
|
#' }
|
||||||
#' @rdname resistance
|
rsi_R <- function(ab1,
|
||||||
#' @name resistance
|
|
||||||
#' @export
|
|
||||||
#' @rdname resistance
|
|
||||||
#' @export
|
|
||||||
S <- function(ab1,
|
|
||||||
ab2 = NULL,
|
|
||||||
minimum = 30,
|
minimum = 30,
|
||||||
as_percent = FALSE) {
|
as_percent = FALSE) {
|
||||||
susceptibility(ab1 = ab1,
|
resistance(ab1 = ab1,
|
||||||
ab2 = ab2,
|
|
||||||
include_I = FALSE,
|
include_I = FALSE,
|
||||||
minimum = minimum,
|
minimum = minimum,
|
||||||
as_percent = as_percent)
|
as_percent = as_percent)
|
||||||
}
|
}
|
||||||
|
|
||||||
#' @rdname resistance
|
#' @rdname rsi_IR
|
||||||
#' @export
|
#' @export
|
||||||
SI <- function(ab1,
|
rsi_IR <- function(ab1,
|
||||||
|
minimum = 30,
|
||||||
|
as_percent = FALSE) {
|
||||||
|
resistance(ab1 = ab1,
|
||||||
|
include_I = TRUE,
|
||||||
|
minimum = minimum,
|
||||||
|
as_percent = as_percent)
|
||||||
|
}
|
||||||
|
|
||||||
|
#' @rdname rsi_IR
|
||||||
|
#' @export
|
||||||
|
rsi_I <- function(ab1,
|
||||||
|
minimum = 30,
|
||||||
|
as_percent = FALSE) {
|
||||||
|
intermediate(ab1 = ab1,
|
||||||
|
minimum = minimum,
|
||||||
|
as_percent = as_percent)
|
||||||
|
}
|
||||||
|
|
||||||
|
#' @rdname rsi_IR
|
||||||
|
#' @export
|
||||||
|
rsi_SI <- function(ab1,
|
||||||
ab2 = NULL,
|
ab2 = NULL,
|
||||||
minimum = 30,
|
minimum = 30,
|
||||||
as_percent = FALSE) {
|
as_percent = FALSE) {
|
||||||
@ -128,51 +148,20 @@ SI <- function(ab1,
|
|||||||
as_percent = as_percent)
|
as_percent = as_percent)
|
||||||
}
|
}
|
||||||
|
|
||||||
#' @rdname resistance
|
#' @rdname rsi_IR
|
||||||
#' @export
|
#' @export
|
||||||
IR <- function(ab1,
|
rsi_S <- function(ab1,
|
||||||
|
ab2 = NULL,
|
||||||
minimum = 30,
|
minimum = 30,
|
||||||
as_percent = FALSE) {
|
as_percent = FALSE) {
|
||||||
resistance(ab1 = ab1,
|
susceptibility(ab1 = ab1,
|
||||||
include_I = TRUE,
|
ab2 = ab2,
|
||||||
minimum = minimum,
|
|
||||||
as_percent = as_percent)
|
|
||||||
}
|
|
||||||
|
|
||||||
#' @rdname resistance
|
|
||||||
#' @export
|
|
||||||
R <- function(ab1,
|
|
||||||
minimum = 30,
|
|
||||||
as_percent = FALSE) {
|
|
||||||
resistance(ab1 = ab1,
|
|
||||||
include_I = FALSE,
|
include_I = FALSE,
|
||||||
minimum = minimum,
|
minimum = minimum,
|
||||||
as_percent = as_percent)
|
as_percent = as_percent)
|
||||||
}
|
}
|
||||||
|
|
||||||
#' @rdname resistance
|
#' @rdname rsi_IR
|
||||||
#' @export
|
|
||||||
n_rsi <- function(ab1, ab2 = NULL) {
|
|
||||||
if (NCOL(ab1) > 1) {
|
|
||||||
stop('`ab` must be a vector of antimicrobial interpretations', call. = FALSE)
|
|
||||||
}
|
|
||||||
if (!is.rsi(ab1)) {
|
|
||||||
ab1 <- as.rsi(ab1)
|
|
||||||
}
|
|
||||||
if (!is.null(ab2)) {
|
|
||||||
if (NCOL(ab2) > 1) {
|
|
||||||
stop('`ab2` must be a vector of antimicrobial interpretations', call. = FALSE)
|
|
||||||
}
|
|
||||||
if (!is.rsi(ab2)) {
|
|
||||||
ab2 <- as.rsi(ab2)
|
|
||||||
}
|
|
||||||
sum(!is.na(ab1) & !is.na(ab2))
|
|
||||||
} else {
|
|
||||||
sum(!is.na(ab1))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#' @rdname resistance
|
|
||||||
#' @export
|
#' @export
|
||||||
resistance <- function(ab1,
|
resistance <- function(ab1,
|
||||||
include_I = TRUE,
|
include_I = TRUE,
|
||||||
@ -214,7 +203,45 @@ resistance <- function(ab1,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#' @rdname resistance
|
#' @rdname rsi_IR
|
||||||
|
#' @export
|
||||||
|
intermediate <- function(ab1,
|
||||||
|
minimum = 30,
|
||||||
|
as_percent = FALSE) {
|
||||||
|
|
||||||
|
if (NCOL(ab1) > 1) {
|
||||||
|
stop('`ab1` must be a vector of antimicrobial interpretations', 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)
|
||||||
|
}
|
||||||
|
|
||||||
|
# ab_name <- deparse(substitute(ab))
|
||||||
|
|
||||||
|
if (!is.rsi(ab1)) {
|
||||||
|
x <- as.rsi(ab1)
|
||||||
|
warning("Increase speed by transforming to class `rsi` on beforehand: df %>% mutate_at(vars(col10:col20), as.rsi)")
|
||||||
|
} else {
|
||||||
|
x <- ab1
|
||||||
|
}
|
||||||
|
total <- length(x) - sum(is.na(x)) # faster than C++
|
||||||
|
if (total < minimum) {
|
||||||
|
# warning("Too few isolates available for ", ab_name, ": ", total, " < ", minimum, "; returning NA.", call. = FALSE)
|
||||||
|
return(NA)
|
||||||
|
}
|
||||||
|
found <- .Call(`_AMR_rsi_calc_I`, x)
|
||||||
|
|
||||||
|
if (as_percent == TRUE) {
|
||||||
|
percent(found / total, force_zero = TRUE)
|
||||||
|
} else {
|
||||||
|
found / total
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#' @rdname rsi_IR
|
||||||
#' @export
|
#' @export
|
||||||
susceptibility <- function(ab1,
|
susceptibility <- function(ab1,
|
||||||
ab2 = NULL,
|
ab2 = NULL,
|
||||||
@ -275,7 +302,37 @@ susceptibility <- function(ab1,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#' @rdname resistance
|
#' @rdname rsi_IR
|
||||||
|
#' @export
|
||||||
|
rsi_n <- function(ab1, ab2 = NULL) {
|
||||||
|
if (NCOL(ab1) > 1) {
|
||||||
|
stop('`ab` must be a vector of antimicrobial interpretations', call. = FALSE)
|
||||||
|
}
|
||||||
|
if (!is.rsi(ab1)) {
|
||||||
|
ab1 <- as.rsi(ab1)
|
||||||
|
}
|
||||||
|
if (!is.null(ab2)) {
|
||||||
|
if (NCOL(ab2) > 1) {
|
||||||
|
stop('`ab2` must be a vector of antimicrobial interpretations', call. = FALSE)
|
||||||
|
}
|
||||||
|
if (!is.rsi(ab2)) {
|
||||||
|
ab2 <- as.rsi(ab2)
|
||||||
|
}
|
||||||
|
sum(!is.na(ab1) & !is.na(ab2))
|
||||||
|
} else {
|
||||||
|
sum(!is.na(ab1))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#' @rdname rsi_IR
|
||||||
|
#' @export
|
||||||
|
n_rsi <- rsi_n
|
||||||
|
|
||||||
|
#' @inherit resistance
|
||||||
|
#' @description This function is deprecated. Use \code{\link{rsi_IR}} instead.
|
||||||
|
#' @param info calculate the amount of available isolates and print it, like \code{n = 423}
|
||||||
|
#' @param warning show a warning when the available amount of isolates is below \code{minimum}
|
||||||
|
#' @param interpretation antimicrobial interpretation
|
||||||
#' @export
|
#' @export
|
||||||
rsi <- function(ab1,
|
rsi <- function(ab1,
|
||||||
ab2 = NA,
|
ab2 = NA,
|
22
README.md
22
README.md
@ -28,7 +28,7 @@ Erwin E.A. Hassing<sup>2</sup>,
|
|||||||
This R package contains functions to make **microbiological, epidemiological data analysis easier**. It allows the use of some new classes to work with MIC values and antimicrobial interpretations (i.e. values S, I and R).
|
This R package contains functions to make **microbiological, epidemiological data analysis easier**. It allows the use of some new classes to work with MIC values and antimicrobial interpretations (i.e. values S, I and R).
|
||||||
|
|
||||||
With `AMR` you can:
|
With `AMR` you can:
|
||||||
* Calculate the resistance (and even co-resistance) of microbial isolates with the `R`, `IR`, `SI` and `S` functions, that can also be used with the `dplyr` package (e.g. in conjunction with `summarise`)
|
* Calculate the resistance (and even co-resistance) of microbial isolates with the `rsi_R`, `rsi_IR`, `rsi_I`, `rsi_SI` and `rsi_S` functions, that can also be used with the `dplyr` package (e.g. in conjunction with `summarise`)
|
||||||
* Predict antimicrobial resistance for the nextcoming years with the `resistance_predict` function
|
* Predict antimicrobial resistance for the nextcoming years with the `resistance_predict` function
|
||||||
* Apply [EUCAST rules to isolates](http://www.eucast.org/expert_rules_and_intrinsic_resistance/) with the `EUCAST_rules` function
|
* Apply [EUCAST rules to isolates](http://www.eucast.org/expert_rules_and_intrinsic_resistance/) with the `EUCAST_rules` function
|
||||||
* Identify first isolates of every patient [using guidelines from the CLSI](https://clsi.org/standards/products/microbiology/documents/m39/) (Clinical and Laboratory Standards Institute) with the `first_isolate` function
|
* Identify first isolates of every patient [using guidelines from the CLSI](https://clsi.org/standards/products/microbiology/documents/m39/) (Clinical and Laboratory Standards Institute) with the `first_isolate` function
|
||||||
@ -121,17 +121,17 @@ after
|
|||||||
# 5 PSEAER R R - - R
|
# 5 PSEAER R R - - R
|
||||||
```
|
```
|
||||||
|
|
||||||
Bacteria ID's can be retrieved with the `as.bactid` function. It uses any type of info about a microorganism as input. For example, all these will return value `STAAUR`, the ID of *S. aureus*:
|
Bacteria ID's can be retrieved with the `guess_bactid` function. It uses any type of info about a microorganism as input. For example, all these will return value `STAAUR`, the ID of *S. aureus*:
|
||||||
```r
|
```r
|
||||||
as.bactid("stau")
|
guess_bactid("stau")
|
||||||
as.bactid("STAU")
|
guess_bactid("STAU")
|
||||||
as.bactid("staaur")
|
guess_bactid("staaur")
|
||||||
as.bactid("S. aureus")
|
guess_bactid("S. aureus")
|
||||||
as.bactid("S aureus")
|
guess_bactid("S aureus")
|
||||||
as.bactid("Staphylococcus aureus")
|
guess_bactid("Staphylococcus aureus")
|
||||||
as.bactid("MRSA") # Methicillin Resistant S. aureus
|
guess_bactid("MRSA") # Methicillin Resistant S. aureus
|
||||||
as.bactid("VISA") # Vancomycin Intermediate S. aureus
|
guess_bactid("VISA") # Vancomycin Intermediate S. aureus
|
||||||
as.bactid("VRSA") # Vancomycin Resistant S. aureus
|
guess_bactid("VRSA") # Vancomycin Resistant S. aureus
|
||||||
```
|
```
|
||||||
|
|
||||||
### New classes
|
### New classes
|
||||||
|
@ -84,3 +84,9 @@ df <- df \%>\%
|
|||||||
\seealso{
|
\seealso{
|
||||||
\code{\link{microorganisms}} for the dataframe that is being used to determine ID's.
|
\code{\link{microorganisms}} for the dataframe that is being used to determine ID's.
|
||||||
}
|
}
|
||||||
|
\keyword{Becker}
|
||||||
|
\keyword{Lancefield}
|
||||||
|
\keyword{bactid}
|
||||||
|
\keyword{becker}
|
||||||
|
\keyword{guess}
|
||||||
|
\keyword{lancefield}
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
\name{microorganisms}
|
\name{microorganisms}
|
||||||
\alias{microorganisms}
|
\alias{microorganisms}
|
||||||
\title{Dataset with ~2500 microorganisms}
|
\title{Dataset with ~2500 microorganisms}
|
||||||
\format{A data.frame with 2456 observations and 12 variables:
|
\format{A data.frame with 2464 observations and 12 variables:
|
||||||
\describe{
|
\describe{
|
||||||
\item{\code{bactid}}{ID of microorganism}
|
\item{\code{bactid}}{ID of microorganism}
|
||||||
\item{\code{bactsys}}{Bactsyscode of microorganism}
|
\item{\code{bactsys}}{Bactsyscode of microorganism}
|
||||||
@ -23,7 +23,7 @@
|
|||||||
microorganisms
|
microorganisms
|
||||||
}
|
}
|
||||||
\description{
|
\description{
|
||||||
A dataset containing 2456 microorganisms. MO codes of the UMCG can be looked up using \code{\link{microorganisms.umcg}}.
|
A dataset containing 2464 microorganisms. MO codes of the UMCG can be looked up using \code{\link{microorganisms.umcg}}.
|
||||||
}
|
}
|
||||||
\seealso{
|
\seealso{
|
||||||
\code{\link{guess_bactid}} \code{\link{antibiotics}} \code{\link{microorganisms.umcg}}
|
\code{\link{guess_bactid}} \code{\link{antibiotics}} \code{\link{microorganisms.umcg}}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
% Generated by roxygen2: do not edit by hand
|
% Generated by roxygen2: do not edit by hand
|
||||||
% Please edit documentation in R/resistance.R
|
% Please edit documentation in R/rsi_IR.R
|
||||||
\name{resistance_predict}
|
\name{resistance_predict}
|
||||||
\alias{resistance_predict}
|
\alias{resistance_predict}
|
||||||
\alias{rsi_predict}
|
\alias{rsi_predict}
|
||||||
|
106
man/rsi.Rd
Normal file
106
man/rsi.Rd
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
% Generated by roxygen2: do not edit by hand
|
||||||
|
% Please edit documentation in R/rsi_IR.R
|
||||||
|
\name{rsi}
|
||||||
|
\alias{rsi}
|
||||||
|
\title{Calculate resistance of isolates}
|
||||||
|
\usage{
|
||||||
|
rsi(ab1, ab2 = NA, interpretation = "IR", minimum = 30,
|
||||||
|
as_percent = FALSE, info = FALSE, warning = TRUE)
|
||||||
|
}
|
||||||
|
\arguments{
|
||||||
|
\item{ab1}{vector of antibiotic interpretations, they will be transformed internally with \code{\link{as.rsi}}}
|
||||||
|
|
||||||
|
\item{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 susceptible result. See Examples.}
|
||||||
|
|
||||||
|
\item{interpretation}{antimicrobial interpretation}
|
||||||
|
|
||||||
|
\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{info}{calculate the amount of available isolates and print it, like \code{n = 423}}
|
||||||
|
|
||||||
|
\item{warning}{show a warning when the available amount of isolates is below \code{minimum}}
|
||||||
|
}
|
||||||
|
\value{
|
||||||
|
Double or, when \code{as_percent = TRUE}, a character.
|
||||||
|
}
|
||||||
|
\description{
|
||||||
|
This function is deprecated. Use \code{\link{rsi_IR}} instead.
|
||||||
|
}
|
||||||
|
\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.
|
||||||
|
|
||||||
|
The functions \code{resistance} and \code{susceptibility} are wrappers around \code{rsi_IR} and \code{rsi_S}, respectively. All functions use hybrid evaluation (i.e. using C++), which makes these functions 20-30 times faster than the old \code{\link{rsi}} function. This latter function is still available for backwards compatibility but is deprecated.
|
||||||
|
\if{html}{
|
||||||
|
\cr\cr
|
||||||
|
To calculate the probability (\emph{p}) of susceptibility of one antibiotic, we use this formula:
|
||||||
|
\out{<div style="text-align: center">}\figure{mono_therapy.png}\out{</div>}
|
||||||
|
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{<div style="text-align: center">}\figure{combi_therapy_2.png}\out{</div>}
|
||||||
|
\cr
|
||||||
|
Theoretically for three antibiotics:
|
||||||
|
\out{<div style="text-align: center">}\figure{combi_therapy_3.png}\out{</div>}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\examples{
|
||||||
|
# Calculate resistance
|
||||||
|
rsi_R(septic_patients$amox)
|
||||||
|
rsi_IR(septic_patients$amox)
|
||||||
|
|
||||||
|
# Or susceptibility
|
||||||
|
rsi_S(septic_patients$amox)
|
||||||
|
rsi_SI(septic_patients$amox)
|
||||||
|
|
||||||
|
# Since n_rsi counts available isolates (and is used as denominator),
|
||||||
|
# you can calculate back to e.g. count resistant isolates:
|
||||||
|
rsi_IR(septic_patients$amox) * n_rsi(septic_patients$amox)
|
||||||
|
|
||||||
|
library(dplyr)
|
||||||
|
septic_patients \%>\%
|
||||||
|
group_by(hospital_id) \%>\%
|
||||||
|
summarise(p = rsi_S(cipr),
|
||||||
|
n = rsi_n(cipr)) # n_rsi works like n_distinct in dplyr
|
||||||
|
|
||||||
|
septic_patients \%>\%
|
||||||
|
group_by(hospital_id) \%>\%
|
||||||
|
summarise(R = rsi_R(cipr, as_percent = TRUE),
|
||||||
|
I = rsi_I(cipr, as_percent = TRUE),
|
||||||
|
S = rsi_S(cipr, as_percent = TRUE),
|
||||||
|
n = rsi_n(cipr), # also: n_rsi, works like n_distinct in dplyr
|
||||||
|
total = n()) # this is the length, NOT the amount of tested isolates
|
||||||
|
|
||||||
|
# Calculate co-resistance between amoxicillin/clav acid and gentamicin,
|
||||||
|
# so we can see that combination therapy does a lot more than mono therapy:
|
||||||
|
rsi_S(septic_patients$amcl) # S = 67.3\%
|
||||||
|
rsi_n(septic_patients$amcl) # n = 1570
|
||||||
|
|
||||||
|
rsi_S(septic_patients$gent) # S = 74.0\%
|
||||||
|
rsi_n(septic_patients$gent) # n = 1842
|
||||||
|
|
||||||
|
with(septic_patients,
|
||||||
|
rsi_S(amcl, gent)) # S = 92.1\%
|
||||||
|
with(septic_patients, # n = 1504
|
||||||
|
rsi_n(amcl, gent))
|
||||||
|
|
||||||
|
septic_patients \%>\%
|
||||||
|
group_by(hospital_id) \%>\%
|
||||||
|
summarise(cipro_p = rsi_S(cipr, as_percent = TRUE),
|
||||||
|
cipro_n = rsi_n(cipr),
|
||||||
|
genta_p = rsi_S(gent, as_percent = TRUE),
|
||||||
|
genta_n = rsi_n(gent),
|
||||||
|
combination_p = rsi_S(cipr, gent, as_percent = TRUE),
|
||||||
|
combination_n = rsi_n(cipr, gent))
|
||||||
|
|
||||||
|
\dontrun{
|
||||||
|
|
||||||
|
# calculate current empiric combination therapy of Helicobacter gastritis:
|
||||||
|
my_table \%>\%
|
||||||
|
filter(first_isolate == TRUE,
|
||||||
|
genus == "Helicobacter") \%>\%
|
||||||
|
summarise(p = rsi_S(amox, metr), # amoxicillin with metronidazole
|
||||||
|
n = rsi_n(amox, metr))
|
||||||
|
}
|
||||||
|
}
|
@ -1,66 +1,65 @@
|
|||||||
% Generated by roxygen2: do not edit by hand
|
% Generated by roxygen2: do not edit by hand
|
||||||
% Please edit documentation in R/resistance.R
|
% Please edit documentation in R/rsi_IR.R
|
||||||
\name{resistance}
|
\name{rsi_IR}
|
||||||
|
\alias{rsi_IR}
|
||||||
|
\alias{rsi_R}
|
||||||
|
\alias{rsi_I}
|
||||||
|
\alias{rsi_SI}
|
||||||
|
\alias{rsi_S}
|
||||||
\alias{resistance}
|
\alias{resistance}
|
||||||
\alias{S}
|
\alias{intermediate}
|
||||||
\alias{SI}
|
|
||||||
\alias{IR}
|
|
||||||
\alias{R}
|
|
||||||
\alias{n_rsi}
|
|
||||||
\alias{susceptibility}
|
\alias{susceptibility}
|
||||||
\alias{rsi}
|
\alias{rsi_n}
|
||||||
|
\alias{n_rsi}
|
||||||
\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/}.
|
||||||
}
|
}
|
||||||
\usage{
|
\usage{
|
||||||
S(ab1, ab2 = NULL, minimum = 30, as_percent = FALSE)
|
rsi_R(ab1, minimum = 30, as_percent = FALSE)
|
||||||
|
|
||||||
SI(ab1, ab2 = NULL, minimum = 30, as_percent = FALSE)
|
rsi_IR(ab1, minimum = 30, as_percent = FALSE)
|
||||||
|
|
||||||
IR(ab1, minimum = 30, as_percent = FALSE)
|
rsi_I(ab1, minimum = 30, as_percent = FALSE)
|
||||||
|
|
||||||
R(ab1, minimum = 30, as_percent = FALSE)
|
rsi_SI(ab1, ab2 = NULL, minimum = 30, as_percent = FALSE)
|
||||||
|
|
||||||
n_rsi(ab1, ab2 = NULL)
|
rsi_S(ab1, ab2 = NULL, minimum = 30, as_percent = FALSE)
|
||||||
|
|
||||||
resistance(ab1, include_I = TRUE, minimum = 30, as_percent = FALSE)
|
resistance(ab1, include_I = TRUE, minimum = 30, as_percent = FALSE)
|
||||||
|
|
||||||
|
intermediate(ab1, minimum = 30, as_percent = FALSE)
|
||||||
|
|
||||||
susceptibility(ab1, ab2 = NULL, include_I = FALSE, minimum = 30,
|
susceptibility(ab1, ab2 = NULL, include_I = FALSE, minimum = 30,
|
||||||
as_percent = FALSE)
|
as_percent = FALSE)
|
||||||
|
|
||||||
rsi(ab1, ab2 = NA, interpretation = "IR", minimum = 30,
|
rsi_n(ab1, ab2 = NULL)
|
||||||
as_percent = FALSE, info = FALSE, warning = TRUE)
|
|
||||||
|
n_rsi(ab1, ab2 = NULL)
|
||||||
}
|
}
|
||||||
\arguments{
|
\arguments{
|
||||||
\item{ab1}{vector of antibiotic interpretations, they will be transformed internally with \code{\link{as.rsi}}}
|
\item{ab1}{vector of antibiotic interpretations, they will be transformed internally with \code{\link{as.rsi}}}
|
||||||
|
|
||||||
\item{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 susceptible result. See Examples.}
|
|
||||||
|
|
||||||
\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{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 susceptible result. See Examples.}
|
||||||
|
|
||||||
\item{include_I}{logical to indicate whether antimicrobial interpretations of "I" should be included}
|
\item{include_I}{logical to indicate whether antimicrobial interpretations of "I" should be included}
|
||||||
|
|
||||||
\item{interpretation}{antimicrobial interpretation}
|
|
||||||
|
|
||||||
\item{info}{\emph{DEPRECATED} calculate the amount of available isolates and print it, like \code{n = 423}}
|
|
||||||
|
|
||||||
\item{warning}{\emph{DEPRECATED} show a warning when the available amount of isolates is below \code{minimum}}
|
|
||||||
}
|
}
|
||||||
\value{
|
\value{
|
||||||
Double or, when \code{as_percent = TRUE}, a character.
|
Double or, when \code{as_percent = TRUE}, a character.
|
||||||
}
|
}
|
||||||
\description{
|
\description{
|
||||||
These functions can be used to calculate the (co-)resistance of microbial isolates (i.e. percentage S, SI, IR or R). All functions can be used in \code{dplyr}s \code{\link[dplyr]{summarise}} and support grouped variables, see \emph{Examples}. \cr\cr
|
These functions can be used to calculate the (co-)resistance of microbial isolates (i.e. percentage S, SI, I, IR or R). All functions can be used in \code{dplyr}s \code{\link[dplyr]{summarise}} and support grouped variables, see \emph{Examples}. \cr\cr
|
||||||
\code{R} and \code{IR} can be used to calculate resistance, \code{S} and \code{SI} can be used to calculate susceptibility.\cr
|
\code{rsi_R} and \code{rsi_IR} can be used to calculate resistance, \code{rsi_S} and \code{rsi_SI} can be used to calculate susceptibility.\cr
|
||||||
\code{n_rsi} counts all cases where antimicrobial interpretations are available.
|
\code{rsi_n} counts all cases where antimicrobial interpretations are available.
|
||||||
}
|
}
|
||||||
\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.
|
||||||
|
|
||||||
The functions \code{resistance} and \code{susceptibility} are wrappers around \code{IR} and \code{S}, respectively. All functions except \code{rsi} use hybrid evaluation (i.e. using C++), which makes these functions 20-30 times faster than the old \code{rsi} function. This latter function is still available for backwards compatibility but is deprecated.
|
The functions \code{resistance} and \code{susceptibility} are wrappers around \code{rsi_IR} and \code{rsi_S}, respectively. All functions use hybrid evaluation (i.e. using C++), which makes these functions 20-30 times faster than the old \code{\link{rsi}} function. This latter function is still available for backwards compatibility but is deprecated.
|
||||||
\if{html}{
|
\if{html}{
|
||||||
\cr\cr
|
\cr\cr
|
||||||
To calculate the probability (\emph{p}) of susceptibility of one antibiotic, we use this formula:
|
To calculate the probability (\emph{p}) of susceptibility of one antibiotic, we use this formula:
|
||||||
@ -76,44 +75,52 @@ The functions \code{resistance} and \code{susceptibility} are wrappers around \c
|
|||||||
}
|
}
|
||||||
\examples{
|
\examples{
|
||||||
# Calculate resistance
|
# Calculate resistance
|
||||||
R(septic_patients$amox)
|
rsi_R(septic_patients$amox)
|
||||||
IR(septic_patients$amox)
|
rsi_IR(septic_patients$amox)
|
||||||
|
|
||||||
# Or susceptibility
|
# Or susceptibility
|
||||||
S(septic_patients$amox)
|
rsi_S(septic_patients$amox)
|
||||||
SI(septic_patients$amox)
|
rsi_SI(septic_patients$amox)
|
||||||
|
|
||||||
# Since n_rsi counts available isolates (and is used as denominator),
|
# Since n_rsi counts available isolates (and is used as denominator),
|
||||||
# you can calculate back to e.g. count resistant isolates:
|
# you can calculate back to e.g. count resistant isolates:
|
||||||
IR(septic_patients$amox) * n_rsi(septic_patients$amox)
|
rsi_IR(septic_patients$amox) * n_rsi(septic_patients$amox)
|
||||||
|
|
||||||
library(dplyr)
|
library(dplyr)
|
||||||
septic_patients \%>\%
|
septic_patients \%>\%
|
||||||
group_by(hospital_id) \%>\%
|
group_by(hospital_id) \%>\%
|
||||||
summarise(p = S(cipr),
|
summarise(p = rsi_S(cipr),
|
||||||
n = n_rsi(cipr)) # n_rsi works like n_distinct in dplyr
|
n = rsi_n(cipr)) # n_rsi works like n_distinct in dplyr
|
||||||
|
|
||||||
# Calculate co-resistance between amoxicillin/clav acid and gentamicin,
|
|
||||||
# so we can see that combination therapy does a lot more than mono therapy:
|
|
||||||
S(septic_patients$amcl) # p = 67.3\%
|
|
||||||
n_rsi(septic_patients$amcl) # n = 1570
|
|
||||||
|
|
||||||
S(septic_patients$gent) # p = 74.0\%
|
|
||||||
n_rsi(septic_patients$gent) # n = 1842
|
|
||||||
|
|
||||||
with(septic_patients,
|
|
||||||
S(amcl, gent)) # p = 92.1\%
|
|
||||||
with(septic_patients,
|
|
||||||
n_rsi(amcl, gent)) # n = 1504
|
|
||||||
|
|
||||||
septic_patients \%>\%
|
septic_patients \%>\%
|
||||||
group_by(hospital_id) \%>\%
|
group_by(hospital_id) \%>\%
|
||||||
summarise(cipro_p = S(cipr, as_percent = TRUE),
|
summarise(R = rsi_R(cipr, as_percent = TRUE),
|
||||||
cipro_n = n_rsi(cipr),
|
I = rsi_I(cipr, as_percent = TRUE),
|
||||||
genta_p = S(gent, as_percent = TRUE),
|
S = rsi_S(cipr, as_percent = TRUE),
|
||||||
genta_n = n_rsi(gent),
|
n = rsi_n(cipr), # also: n_rsi, works like n_distinct in dplyr
|
||||||
combination_p = S(cipr, gent, as_percent = TRUE),
|
total = n()) # this is the length, NOT the amount of tested isolates
|
||||||
combination_n = n_rsi(cipr, gent))
|
|
||||||
|
# Calculate co-resistance between amoxicillin/clav acid and gentamicin,
|
||||||
|
# so we can see that combination therapy does a lot more than mono therapy:
|
||||||
|
rsi_S(septic_patients$amcl) # S = 67.3\%
|
||||||
|
rsi_n(septic_patients$amcl) # n = 1570
|
||||||
|
|
||||||
|
rsi_S(septic_patients$gent) # S = 74.0\%
|
||||||
|
rsi_n(septic_patients$gent) # n = 1842
|
||||||
|
|
||||||
|
with(septic_patients,
|
||||||
|
rsi_S(amcl, gent)) # S = 92.1\%
|
||||||
|
with(septic_patients, # n = 1504
|
||||||
|
rsi_n(amcl, gent))
|
||||||
|
|
||||||
|
septic_patients \%>\%
|
||||||
|
group_by(hospital_id) \%>\%
|
||||||
|
summarise(cipro_p = rsi_S(cipr, as_percent = TRUE),
|
||||||
|
cipro_n = rsi_n(cipr),
|
||||||
|
genta_p = rsi_S(gent, as_percent = TRUE),
|
||||||
|
genta_n = rsi_n(gent),
|
||||||
|
combination_p = rsi_S(cipr, gent, as_percent = TRUE),
|
||||||
|
combination_n = rsi_n(cipr, gent))
|
||||||
|
|
||||||
\dontrun{
|
\dontrun{
|
||||||
|
|
||||||
@ -121,8 +128,8 @@ septic_patients \%>\%
|
|||||||
my_table \%>\%
|
my_table \%>\%
|
||||||
filter(first_isolate == TRUE,
|
filter(first_isolate == TRUE,
|
||||||
genus == "Helicobacter") \%>\%
|
genus == "Helicobacter") \%>\%
|
||||||
summarise(p = S(amox, metr), # amoxicillin with metronidazole
|
summarise(p = rsi_S(amox, metr), # amoxicillin with metronidazole
|
||||||
n = n_rsi(amox, metr))
|
n = rsi_n(amox, metr))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
\keyword{antibiotics}
|
\keyword{antibiotics}
|
@ -17,6 +17,17 @@ BEGIN_RCPP
|
|||||||
return rcpp_result_gen;
|
return rcpp_result_gen;
|
||||||
END_RCPP
|
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
|
// rsi_calc_R
|
||||||
int rsi_calc_R(DoubleVector x, bool include_I);
|
int rsi_calc_R(DoubleVector x, bool include_I);
|
||||||
RcppExport SEXP _AMR_rsi_calc_R(SEXP xSEXP, SEXP include_ISEXP) {
|
RcppExport SEXP _AMR_rsi_calc_R(SEXP xSEXP, SEXP include_ISEXP) {
|
||||||
@ -32,6 +43,7 @@ END_RCPP
|
|||||||
|
|
||||||
static const R_CallMethodDef CallEntries[] = {
|
static const R_CallMethodDef CallEntries[] = {
|
||||||
{"_AMR_rsi_calc_S", (DL_FUNC) &_AMR_rsi_calc_S, 2},
|
{"_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},
|
{"_AMR_rsi_calc_R", (DL_FUNC) &_AMR_rsi_calc_R, 2},
|
||||||
{NULL, NULL, 0}
|
{NULL, NULL, 0}
|
||||||
};
|
};
|
||||||
|
@ -1,6 +1,4 @@
|
|||||||
#include <Rcpp.h>
|
#include <Rcpp.h>
|
||||||
// #include <functional> // for std::less_equal and std::greater_equal
|
|
||||||
// #include <algorithm> // for count_if
|
|
||||||
|
|
||||||
using namespace Rcpp;
|
using namespace Rcpp;
|
||||||
|
|
||||||
@ -12,6 +10,14 @@ int rsi_calc_S(DoubleVector x, bool include_I) {
|
|||||||
1 + include_I));
|
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]]
|
// [[Rcpp::export]]
|
||||||
int rsi_calc_R(DoubleVector x, bool include_I) {
|
int rsi_calc_R(DoubleVector x, bool include_I) {
|
||||||
return count_if(x.begin(),
|
return count_if(x.begin(),
|
||||||
|
@ -1,19 +1,23 @@
|
|||||||
context("resistance.R")
|
context("rsi_IR.R")
|
||||||
|
|
||||||
test_that("resistance works", {
|
test_that("resistance works", {
|
||||||
# check shortcuts
|
# check shortcuts
|
||||||
expect_equal(resistance(septic_patients$amox, include_I = TRUE),
|
expect_equal(resistance(septic_patients$amox, include_I = TRUE),
|
||||||
IR(septic_patients$amox))
|
rsi_IR(septic_patients$amox))
|
||||||
expect_equal(resistance(septic_patients$amox, include_I = FALSE),
|
expect_equal(resistance(septic_patients$amox, include_I = FALSE),
|
||||||
R(septic_patients$amox))
|
rsi_R(septic_patients$amox))
|
||||||
|
expect_equal(intermediate(septic_patients$amox),
|
||||||
|
rsi_I(septic_patients$amox))
|
||||||
expect_equal(susceptibility(septic_patients$amox, include_I = TRUE),
|
expect_equal(susceptibility(septic_patients$amox, include_I = TRUE),
|
||||||
SI(septic_patients$amox))
|
rsi_SI(septic_patients$amox))
|
||||||
expect_equal(susceptibility(septic_patients$amox, include_I = FALSE),
|
expect_equal(susceptibility(septic_patients$amox, include_I = FALSE),
|
||||||
S(septic_patients$amox))
|
rsi_S(septic_patients$amox))
|
||||||
|
|
||||||
# amox resistance in `septic_patients` should be around 66.33%
|
# amox resistance in `septic_patients`
|
||||||
expect_equal(resistance(septic_patients$amox, include_I = TRUE), 0.6633, tolerance = 0.0001)
|
expect_equal(rsi_R(septic_patients$amox), 0.6603, tolerance = 0.0001)
|
||||||
expect_equal(susceptibility(septic_patients$amox, include_I = FALSE), 1 - 0.6633, tolerance = 0.0001)
|
expect_equal(rsi_I(septic_patients$amox), 0.0030, tolerance = 0.0001)
|
||||||
|
expect_equal(1 - rsi_R(septic_patients$amox) - rsi_I(septic_patients$amox),
|
||||||
|
rsi_S(septic_patients$amox))
|
||||||
|
|
||||||
# pita+genta susceptibility around 98.09%
|
# pita+genta susceptibility around 98.09%
|
||||||
expect_equal(susceptibility(septic_patients$pita,
|
expect_equal(susceptibility(septic_patients$pita,
|
||||||
@ -26,6 +30,18 @@ test_that("resistance works", {
|
|||||||
0.9535,
|
0.9535,
|
||||||
tolerance = 0.0001)
|
tolerance = 0.0001)
|
||||||
|
|
||||||
|
# percentages
|
||||||
|
expect_equal(septic_patients %>%
|
||||||
|
group_by(hospital_id) %>%
|
||||||
|
summarise(R = rsi_R(cipr, as_percent = TRUE),
|
||||||
|
I = rsi_I(cipr, as_percent = TRUE),
|
||||||
|
S = rsi_S(cipr, as_percent = TRUE),
|
||||||
|
n = rsi_n(cipr),
|
||||||
|
total = n()) %>%
|
||||||
|
pull(n) %>%
|
||||||
|
sum(),
|
||||||
|
1404)
|
||||||
|
|
||||||
# count of cases
|
# count of cases
|
||||||
expect_equal(septic_patients %>%
|
expect_equal(septic_patients %>%
|
||||||
group_by(hospital_id) %>%
|
group_by(hospital_id) %>%
|
||||||
@ -34,7 +50,7 @@ test_that("resistance works", {
|
|||||||
genta_p = susceptibility(gent, as_percent = TRUE),
|
genta_p = susceptibility(gent, as_percent = TRUE),
|
||||||
genta_n = n_rsi(gent),
|
genta_n = n_rsi(gent),
|
||||||
combination_p = susceptibility(cipr, gent, as_percent = TRUE),
|
combination_p = susceptibility(cipr, gent, as_percent = TRUE),
|
||||||
combination_n = n_rsi(cipr, gent)) %>%
|
combination_n = rsi_n(cipr, gent)) %>%
|
||||||
pull(combination_n),
|
pull(combination_n),
|
||||||
c(202, 482, 201, 499))
|
c(202, 482, 201, 499))
|
||||||
|
|
||||||
@ -45,22 +61,29 @@ test_that("resistance works", {
|
|||||||
|
|
||||||
|
|
||||||
# check for errors
|
# check for errors
|
||||||
expect_error(IR(septic_patients %>% select(amox, amcl)))
|
expect_error(rsi_IR(septic_patients %>% select(amox, amcl)))
|
||||||
expect_error(IR("test", minimum = "test"))
|
expect_error(rsi_IR("test", minimum = "test"))
|
||||||
expect_error(IR("test", as_percent = "test"))
|
expect_error(rsi_IR("test", as_percent = "test"))
|
||||||
expect_error(S("test", minimum = "test"))
|
expect_error(rsi_I(septic_patients %>% select(amox, amcl)))
|
||||||
expect_error(S("test", as_percent = "test"))
|
expect_error(rsi_I("test", minimum = "test"))
|
||||||
expect_error(S(septic_patients %>% select(amox, amcl)))
|
expect_error(rsi_I("test", as_percent = "test"))
|
||||||
expect_error(S("R", septic_patients %>% select(amox, amcl)))
|
expect_error(rsi_S("test", minimum = "test"))
|
||||||
|
expect_error(rsi_S("test", as_percent = "test"))
|
||||||
|
expect_error(rsi_S(septic_patients %>% select(amox, amcl)))
|
||||||
|
expect_error(rsi_S("R", septic_patients %>% select(amox, amcl)))
|
||||||
|
|
||||||
# check too low amount of isolates
|
# check too low amount of isolates
|
||||||
expect_identical(IR(septic_patients$amox, minimum = nrow(septic_patients) + 1),
|
expect_identical(rsi_R(septic_patients$amox, minimum = nrow(septic_patients) + 1),
|
||||||
NA)
|
NA)
|
||||||
expect_identical(S(septic_patients$amox, minimum = nrow(septic_patients) + 1),
|
expect_identical(rsi_I(septic_patients$amox, minimum = nrow(septic_patients) + 1),
|
||||||
|
NA)
|
||||||
|
expect_identical(rsi_S(septic_patients$amox, minimum = nrow(septic_patients) + 1),
|
||||||
NA)
|
NA)
|
||||||
|
|
||||||
# warning for speed loss
|
# warning for speed loss
|
||||||
expect_warning(S(septic_patients$amcl, as.character(septic_patients$gent)))
|
expect_warning(rsi_R(as.character(septic_patients$gent)))
|
||||||
|
expect_warning(rsi_I(as.character(septic_patients$gent)))
|
||||||
|
expect_warning(rsi_S(septic_patients$amcl, as.character(septic_patients$gent)))
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue
Block a user