Analyse, plot, and tabulate antimicrobial minimum inhibitory concentration (MIC) data. Validate the results of an MIC experiment by comparing observed MIC values to a gold standard assay, in line with standards from the International Organization for Standardization (2021) < https://www.iso.org/standard/79377.html>.
MIC is an R package for the analysis of minimum inhibitory
concentration (MIC) data. The package was designed to be compatible with
the AMR, in particular most of the functions
in MIC are designed to accept and return AMR objects, such as mic
and sir. The primary functions in MIC are designed towards
validation studies of minimum inhibitory concentrations.
install.packages("MIC")
# install.packages("remotes")
remotes::install_github("agerada/MIC")
Load the MIC package – it is highly recommended that AMR is also
loaded. Where possible, MIC functions maintain compatibility with
AMR objects, in particular the mic and sir classes.
library(MIC)
#>
#> Attaching package: 'MIC'
#> The following object is masked from 'package:base':
#>
#> table
library(AMR)
#> Warning: package 'AMR' was built under R version 4.5.2
To compare two mic vectors (e.g., one from a gold standard and one
from a prediction or investigational assay), the compare_mic function
can be used. An example dataset of MIC values is provided with the
package, which will be used here.
data("example_mics")
head(example_mics)
#> gs test mo ab
#> 1 0.002 0.002 B_ESCHR_COLI GEN
#> 2 0.004 0.002 B_ESCHR_COLI GEN
#> 3 8 16 B_ESCHR_COLI GEN
#> 4 0.008 0.016 B_ESCHR_COLI GEN
#> 5 64 64 B_ESCHR_COLI GEN
#> 6 0.06 0.06 B_ESCHR_COLI GEN
The dataset contains MIC values (in mic format) for a “test” assay,
and a “gold standard” (gs) assay. We will use compare_mic to compare
the MICs and validate the “test” assay:
val <- compare_mic(gold_standard = example_mics$gs, test = example_mics$test)
val
#> MIC validation object with 300 observations
#> Agreement type: essential
Calling summary provides the essential agreement (EA) rates and assay
bias:
summary(val)
#> MIC validation summary
#> Essential agreement: 267 (89%)
#> Bias: -7
If organisms and antimicrobials are provided, compare_mic will also
calculate and return the categorical agreement (CA) rates, in the form
of minor, major, and very major errors:
val <- compare_mic(gold_standard = example_mics$gs, test = example_mics$test,
mo = example_mics$mo, ab = example_mics$ab, accept_ecoff = TRUE)
val
#> MIC validation object with 300 observations
#> Agreement type: essential and categorical
#> Antibiotics: GEN, MEM, AMX
#> Organisms: B_ESCHR_COLI
This time, calling summary will provide a breakdown of the categorical
agreement rates in addition to the EA rates:
summary(val)
#> MIC validation summary
#> Antibiotic: AMX, GEN, MEM
#> Organism: B_ESCHR_COLI
#> Essential agreement: 267 (89%)
#> Resistant: 113 (37.67%)
#> Minor errors: 0 (0%)
#> Major errors: 6 (2%)
#> Very major errors: 8 (2.67%)
#> Mean bias: -7
#> N: 300
#> *Use as.data.frame() to see full summary*
Using as.data.frame allows us to continue working with the summarised
results:
head(as.data.frame(val))
#> gold_standard test essential_agreement ab mo gold_standard_sir
#> 1 0.002 0.002 TRUE GEN B_ESCHR_COLI WT
#> 2 0.004 0.002 TRUE GEN B_ESCHR_COLI WT
#> 3 8 16 TRUE GEN B_ESCHR_COLI NWT
#> 4 0.008 0.016 TRUE GEN B_ESCHR_COLI WT
#> 5 64 64 TRUE GEN B_ESCHR_COLI NWT
#> 6 0.06 0.06 TRUE GEN B_ESCHR_COLI WT
#> test_sir error
#> 1 WT <NA>
#> 2 WT <NA>
#> 3 NWT <NA>
#> 4 WT <NA>
#> 5 NWT <NA>
#> 6 WT <NA>
The results of an mic_validation can be plotted in a confusion matrix
(failed essential agreements are in red):
plot(val)
The plot can also be faceted by antimicrobial:
plot(val, facet_wrap_ncol = 1)
The table function can be used to generate a table of the results:
# generate table for MEM
mem_dat <- subset(example_mics, ab == "MEM")
mem_val <- compare_mic(gold_standard = mem_dat$gs, test = mem_dat$test)
table(mem_val)