Skip to contents

This function calculates a normalised mean for antimicrobial resistance between multiple observations.

Usage

mean_amr_distance(x, ...)

# S3 method for default
mean_amr_distance(x, ...)

# S3 method for mic
mean_amr_distance(x, ...)

# S3 method for disk
mean_amr_distance(x, ...)

# S3 method for rsi
mean_amr_distance(x, combine_SI = TRUE, ...)

# S3 method for data.frame
mean_amr_distance(x, ..., combine_SI = TRUE)

distance_from_row(mean_distance, row)

Arguments

x

a vector of class rsi, rsi or rsi, or a data.frame containing columns of any of these classes

...

variables to select (supports tidy selection such as column1:column4 and where(is.mic)), and can thus also be antibiotic selectors

combine_SI

a logical to indicate whether all values of S and I must be merged into one, so the input only consists of S+I vs. R (susceptible vs. resistant), defaults to TRUE

mean_distance

the outcome of mean_amr_distance()

row

an index, such as a row number

Details

The mean AMR distance is a normalised numeric value to compare AMR test results and can help to identify similar isolates, without comparing antibiograms by hand. For common numeric data this distance is equal to Z scores (the number of standard deviations from the mean).

MIC values (see as.mic()) are transformed with log2() first; their distance is calculated as (log2(x) - mean(log2(x))) / sd(log2(x)).

R/SI values (see as.rsi()) are transformed using "S" = 1, "I" = 2, and "R" = 3. If combine_SI is TRUE (default), the "I" will be considered to be 1.

For data sets, the mean AMR distance will be calculated per variable, after which the mean of all columns will returned per row (using rowMeans()), see Examples.

Use distance_from_row() to subtract distances from the distance of one row, see Examples.

Interpretation

Isolates with distances less than 0.01 difference from each other should be considered similar. Differences lower than 0.025 should be considered suspicious.

Examples

x <- random_mic(10)
x
#> Class 'mic'
#>  [1] 0.025  8      0.0625 16     16     1      0.125  >=32   0.25   0.002 
mean_amr_distance(x)
#>  [1] -0.9782837  0.7941806 -0.6967299  1.0071679  1.0071679  0.1552190
#>  [7] -0.4837427  1.2201551 -0.2707555 -1.7543786

y <- data.frame(
  id = LETTERS[1:10],
  amox = random_mic(10, ab = "amox", mo = "Escherichia coli"),
  cipr = random_mic(10, ab = "cipr", mo = "Escherichia coli"),
  gent = random_mic(10, ab = "gent", mo = "Escherichia coli"),
  tobr = random_mic(10, ab = "tobr", mo = "Escherichia coli")
)
y
#>    id amox     cipr   gent tobr
#> 1   A   16 <=0.0625 <=0.25 >=16
#> 2   B >=32    0.125      1    4
#> 3   C    4 <=0.0625 <=0.25    1
#> 4   D >=32      >=1    0.5    8
#> 5   E    8    0.125      2    8
#> 6   F    4     0.25 <=0.25 >=16
#> 7   G   16 <=0.0625 <=0.25    1
#> 8   H    4     0.25    >=4    1
#> 9   I    4      >=1 <=0.25 >=16
#> 10  J  <=2      >=1      2    8
mean_amr_distance(y)
#> ℹ Calculating mean AMR distance based on columns "amox", "cipr", "gent",
#>   "id" and "tobr"
#> Warning: NAs introduced by coercion
#>  [1] -0.04787176  0.30260331 -0.98864537  0.73456530  0.25539334 -0.10496162
#>  [7] -0.63509198 -0.05402839  0.19150191  0.34653525
y$amr_distance <- mean_amr_distance(y, where(is.mic))
#> ℹ Calculating mean AMR distance based on columns "amox", "cipr", "gent" and
#>   "tobr"
y[order(y$amr_distance), ]
#>    id amox     cipr   gent tobr amr_distance
#> 3   C    4 <=0.0625 <=0.25    1  -0.98864537
#> 7   G   16 <=0.0625 <=0.25    1  -0.63509198
#> 6   F    4     0.25 <=0.25 >=16  -0.10496162
#> 8   H    4     0.25    >=4    1  -0.05402839
#> 1   A   16 <=0.0625 <=0.25 >=16  -0.04787176
#> 9   I    4      >=1 <=0.25 >=16   0.19150191
#> 5   E    8    0.125      2    8   0.25539334
#> 2   B >=32    0.125      1    4   0.30260331
#> 10  J  <=2      >=1      2    8   0.34653525
#> 4   D >=32      >=1    0.5    8   0.73456530

if (require("dplyr")) {
  y %>%
    mutate(
      amr_distance = mean_amr_distance(., where(is.mic)),
      check_id_C = distance_from_row(amr_distance, id == "C")
    ) %>%
    arrange(check_id_C)
}
#> ℹ Calculating mean AMR distance based on columns "amox", "cipr", "gent" and
#>   "tobr"
#>    id amox     cipr   gent tobr amr_distance check_id_C
#> 1   C    4 <=0.0625 <=0.25    1  -0.98864537  0.0000000
#> 2   G   16 <=0.0625 <=0.25    1  -0.63509198  0.3535534
#> 3   F    4     0.25 <=0.25 >=16  -0.10496162  0.8836838
#> 4   H    4     0.25    >=4    1  -0.05402839  0.9346170
#> 5   A   16 <=0.0625 <=0.25 >=16  -0.04787176  0.9407736
#> 6   I    4      >=1 <=0.25 >=16   0.19150191  1.1801473
#> 7   E    8    0.125      2    8   0.25539334  1.2440387
#> 8   B >=32    0.125      1    4   0.30260331  1.2912487
#> 9   J  <=2      >=1      2    8   0.34653525  1.3351806
#> 10  D >=32      >=1    0.5    8   0.73456530  1.7232107
if (require("dplyr")) {
  # support for groups
  example_isolates %>%
    filter(mo_genus() == "Enterococcus" & mo_species() != "") %>%
    select(mo, TCY, carbapenems()) %>%
    group_by(mo) %>%
    mutate(d = mean_amr_distance(., where(is.rsi))) %>%
    arrange(mo, d)
}
#> ℹ Using column 'mo' as input for `mo_genus()`
#> ℹ Using column 'mo' as input for `mo_species()`
#> ℹ For `carbapenems()` using columns 'IPM' (imipenem) and 'MEM' (meropenem)
#> ℹ Calculating mean AMR distance based on columns "IPM", "MEM" and "TCY"
#> # A tibble: 63 × 5
#> # Groups:   mo [4]
#>    mo           TCY   IPM   MEM         d
#>    <mo>         <rsi> <rsi> <rsi>   <dbl>
#>  1 B_ENTRC_AVIM S     S     NA    NaN    
#>  2 B_ENTRC_AVIM S     S     NA    NaN    
#>  3 B_ENTRC_CSSL NA    S     NA     NA    
#>  4 B_ENTRC_FACM S     S     NA     -2.66 
#>  5 B_ENTRC_FACM S     R     R      -0.423
#>  6 B_ENTRC_FACM S     R     R      -0.423
#>  7 B_ENTRC_FACM NA    R     R       0.224
#>  8 B_ENTRC_FACM NA    R     R       0.224
#>  9 B_ENTRC_FACM NA    R     R       0.224
#> 10 B_ENTRC_FACM NA    R     R       0.224
#> # … with 53 more rows