diff --git a/DESCRIPTION b/DESCRIPTION index fc14968e..d6127fe9 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: AMR -Version: 1.5.0.9017 -Date: 2021-02-08 +Version: 1.5.0.9018 +Date: 2021-02-09 Title: Antimicrobial Resistance Data Analysis Authors@R: c( person(role = c("aut", "cre"), diff --git a/NEWS.md b/NEWS.md index f95332df..a1c220a0 100755 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,5 @@ -# AMR 1.5.0.9017 -## Last updated: 8 February 2021 +# AMR 1.5.0.9018 +## Last updated: 9 February 2021 ### New * Support for EUCAST Clinical Breakpoints v11.0 (2021), effective in the `eucast_rules()` function and in `as.rsi()` to interpret MIC and disk diffusion values. This is now the default guideline in this package. diff --git a/R/first_isolate.R b/R/first_isolate.R index 81d49977..afdeaa92 100755 --- a/R/first_isolate.R +++ b/R/first_isolate.R @@ -160,7 +160,12 @@ first_isolate <- function(x = NULL, info = interactive(), include_unknown = FALSE, ...) { - meet_criteria(x, allow_class = "data.frame", allow_NULL = TRUE) # also checks dimensions to be >0 + if (is_null_or_grouped_tbl(x)) { + # when `x` is left blank, auto determine it (get_current_data() also contains dplyr::cur_data_all()) + # is also fix for using a grouped df as input (a dot as first argument) + x <- tryCatch(get_current_data(arg_name = "x", call = -2), error = function(e) x) + } + meet_criteria(x, allow_class = "data.frame") # also checks dimensions to be >0 meet_criteria(col_date, allow_class = "character", has_length = 1, allow_NULL = TRUE, is_in = colnames(x)) meet_criteria(col_patient_id, allow_class = "character", has_length = 1, allow_NULL = TRUE, is_in = colnames(x)) meet_criteria(col_mo, allow_class = "character", has_length = 1, allow_NULL = TRUE, is_in = colnames(x)) @@ -184,12 +189,6 @@ first_isolate <- function(x = NULL, meet_criteria(info, allow_class = "logical", has_length = 1) meet_criteria(include_unknown, allow_class = "logical", has_length = 1) - if (is_null_or_grouped_tbl(x)) { - # when `x` is left blank, auto determine it (get_current_data() also contains dplyr::cur_data_all()) - # is also fix for using a grouped df as input (a dot as first argument) - x <- tryCatch(get_current_data(arg_name = "x", call = -2), error = function(e) x) - meet_criteria(x, allow_class = "data.frame") - } # remove data.table, grouping from tibbles, etc. x <- as.data.frame(x, stringsAsFactors = FALSE) @@ -512,16 +511,16 @@ filter_first_isolate <- function(x = NULL, col_patient_id = NULL, col_mo = NULL, ...) { - meet_criteria(x, allow_class = "data.frame", allow_NULL = TRUE) - meet_criteria(col_date, allow_class = "character", has_length = 1, allow_NULL = TRUE, is_in = colnames(x)) - meet_criteria(col_patient_id, allow_class = "character", has_length = 1, allow_NULL = TRUE, is_in = colnames(x)) - meet_criteria(col_mo, allow_class = "character", has_length = 1, allow_NULL = TRUE, is_in = colnames(x)) if (is_null_or_grouped_tbl(x)) { # when `x` is left blank, auto determine it (get_current_data() also contains dplyr::cur_data_all()) # is also fix for using a grouped df as input (a dot as first argument) x <- tryCatch(get_current_data(arg_name = "x", call = -2), error = function(e) x) - meet_criteria(x, allow_class = "data.frame") } + meet_criteria(x, allow_class = "data.frame") # also checks dimensions to be >0 + meet_criteria(col_date, allow_class = "character", has_length = 1, allow_NULL = TRUE, is_in = colnames(x)) + meet_criteria(col_patient_id, allow_class = "character", has_length = 1, allow_NULL = TRUE, is_in = colnames(x)) + meet_criteria(col_mo, allow_class = "character", has_length = 1, allow_NULL = TRUE, is_in = colnames(x)) + subset(x, first_isolate(x = x, col_date = col_date, col_patient_id = col_patient_id, @@ -537,17 +536,17 @@ filter_first_weighted_isolate <- function(x = NULL, col_mo = NULL, col_keyantibiotics = NULL, ...) { - meet_criteria(x, allow_class = "data.frame", allow_NULL = TRUE) - meet_criteria(col_date, allow_class = "character", has_length = 1, allow_NULL = TRUE, is_in = colnames(x)) - meet_criteria(col_patient_id, allow_class = "character", has_length = 1, allow_NULL = TRUE, is_in = colnames(x)) - meet_criteria(col_mo, allow_class = "character", has_length = 1, allow_NULL = TRUE, is_in = colnames(x)) - meet_criteria(col_keyantibiotics, allow_class = "character", has_length = 1, allow_NULL = TRUE, is_in = colnames(x)) if (is_null_or_grouped_tbl(x)) { # when `x` is left blank, auto determine it (get_current_data() also contains dplyr::cur_data_all()) # is also fix for using a grouped df as input (a dot as first argument) x <- tryCatch(get_current_data(arg_name = "x", call = -2), error = function(e) x) - meet_criteria(x, allow_class = "data.frame") } + meet_criteria(x, allow_class = "data.frame") # also checks dimensions to be >0 + meet_criteria(col_date, allow_class = "character", has_length = 1, allow_NULL = TRUE, is_in = colnames(x)) + meet_criteria(col_patient_id, allow_class = "character", has_length = 1, allow_NULL = TRUE, is_in = colnames(x)) + meet_criteria(col_mo, allow_class = "character", has_length = 1, allow_NULL = TRUE, is_in = colnames(x)) + meet_criteria(col_keyantibiotics, allow_class = "character", has_length = 1, allow_NULL = TRUE, is_in = colnames(x)) + y <- x if (is.null(col_keyantibiotics)) { # first try to look for it diff --git a/R/key_antibiotics.R b/R/key_antibiotics.R index 11f4195e..b177f6e6 100755 --- a/R/key_antibiotics.R +++ b/R/key_antibiotics.R @@ -130,7 +130,12 @@ key_antibiotics <- function(x = NULL, GramNeg_6 = guess_ab_col(x, "meropenem"), warnings = TRUE, ...) { - meet_criteria(x, allow_class = "data.frame", allow_NULL = TRUE) + if (is_null_or_grouped_tbl(x)) { + # when `x` is left blank, auto determine it (get_current_data() also contains dplyr::cur_data_all()) + # is also fix for using a grouped df as input (a dot as first argument) + x <- tryCatch(get_current_data(arg_name = "x", call = -2), error = function(e) x) + } + meet_criteria(x, allow_class = "data.frame") # also checks dimensions to be >0 meet_criteria(col_mo, allow_class = "character", has_length = 1, allow_NULL = TRUE, allow_NA = TRUE) meet_criteria(universal_1, allow_class = "character", has_length = 1, allow_NULL = TRUE, allow_NA = TRUE) meet_criteria(universal_2, allow_class = "character", has_length = 1, allow_NULL = TRUE, allow_NA = TRUE) @@ -152,12 +157,6 @@ key_antibiotics <- function(x = NULL, meet_criteria(GramNeg_6, allow_class = "character", has_length = 1, allow_NULL = TRUE, allow_NA = TRUE) meet_criteria(warnings, allow_class = "logical", has_length = 1) - if (is_null_or_grouped_tbl(x)) { - # when `x` is left blank, auto determine it (get_current_data() also contains dplyr::cur_data_all()) - # is also fix for using a grouped df as input (a dot as first argument) - x <- tryCatch(get_current_data(arg_name = "x", call = -2), error = function(e) x) - meet_criteria(x, allow_class = "data.frame") - } # force regular data.frame, not a tibble or data.table x <- as.data.frame(x, stringsAsFactors = FALSE) diff --git a/R/mdro.R b/R/mdro.R index e14206f5..d2fa22f9 100755 --- a/R/mdro.R +++ b/R/mdro.R @@ -155,7 +155,12 @@ mdro <- function(x = NULL, verbose = FALSE, only_rsi_columns = FALSE, ...) { - meet_criteria(x, allow_class = "data.frame", allow_NULL = TRUE) + if (is_null_or_grouped_tbl(x)) { + # when `x` is left blank, auto determine it (get_current_data() also contains dplyr::cur_data_all()) + # is also fix for using a grouped df as input (a dot as first argument) + x <- tryCatch(get_current_data(arg_name = "x", call = -2), error = function(e) x) + } + meet_criteria(x, allow_class = "data.frame") # also checks dimensions to be >0 meet_criteria(guideline, allow_class = c("list", "character"), allow_NULL = TRUE) if (!is.list(guideline)) { meet_criteria(guideline, allow_class = "character", has_length = 1, allow_NULL = TRUE) @@ -214,14 +219,7 @@ mdro <- function(x = NULL, } } } - - if (is_null_or_grouped_tbl(x)) { - # when `x` is left blank, auto determine it (get_current_data() also contains dplyr::cur_data_all()) - # is also fix for using a grouped df as input (a dot as first argument) - x <- tryCatch(get_current_data(arg_name = "x", call = -2), error = function(e) x) - meet_criteria(x, allow_class = "data.frame") - } - + # force regular data.frame, not a tibble or data.table x <- as.data.frame(x, stringsAsFactors = FALSE) diff --git a/data-raw/AMR_1.5.0.9017.tar.gz b/data-raw/AMR_1.5.0.9018.tar.gz similarity index 88% rename from data-raw/AMR_1.5.0.9017.tar.gz rename to data-raw/AMR_1.5.0.9018.tar.gz index c3ea82bb..867e430b 100644 Binary files a/data-raw/AMR_1.5.0.9017.tar.gz and b/data-raw/AMR_1.5.0.9018.tar.gz differ diff --git a/docs/404.html b/docs/404.html index 90d7944f..48b6c031 100644 --- a/docs/404.html +++ b/docs/404.html @@ -81,7 +81,7 @@
diff --git a/docs/LICENSE-text.html b/docs/LICENSE-text.html index bc5967d7..bf77346f 100644 --- a/docs/LICENSE-text.html +++ b/docs/LICENSE-text.html @@ -81,7 +81,7 @@ diff --git a/docs/articles/AMR.html b/docs/articles/AMR.html index ab846bbf..3b22530a 100644 --- a/docs/articles/AMR.html +++ b/docs/articles/AMR.html @@ -39,7 +39,7 @@ @@ -193,7 +193,7 @@vignettes/AMR.Rmd
AMR.Rmd
Note: values on this page will change with every website update since they are based on randomly created values and the page was written in R Markdown. However, the methodology remains unchanged. This page was generated on 02 February 2021.
+Note: values on this page will change with every website update since they are based on randomly created values and the page was written in R Markdown. However, the methodology remains unchanged. This page was generated on 09 February 2021.
Now, let’s start the cleaning and the analysis!
@@ -449,16 +449,16 @@ Longest: 1So only 28.4% is suitable for resistance analysis! We can now filter on it with the filter()
function, also from the dplyr
package:
So only 28.3% is suitable for resistance analysis! We can now filter on it with the filter()
function, also from the dplyr
package:
data_1st <- data %>%
filter(first == TRUE)
We made a slight twist to the CLSI algorithm, to take into account the antimicrobial susceptibility profile. Have a look at all E. coli isolates of patient J3, sorted on date:
+We made a slight twist to the CLSI algorithm, to take into account the antimicrobial susceptibility profile. Have a look at all E. coli isolates of patient N1, sorted on date:
isolate | @@ -531,30 +531,30 @@ Longest: 1|||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | -2010-01-21 | -J3 | +2010-02-03 | +N1 | B_ESCHR_COLI | -R | -R | +I | +S | S | S | TRUE | |
2 | -2010-03-02 | -J3 | +2010-04-02 | +N1 | B_ESCHR_COLI | -R | -R | -R | +S | +S | +S | S | FALSE |
3 | -2010-08-02 | -J3 | +2010-06-23 | +N1 | B_ESCHR_COLI | S | S | @@ -564,19 +564,19 @@ Longest: 1||||||
4 | -2010-10-11 | -J3 | +2010-06-25 | +N1 | B_ESCHR_COLI | -S | -S | R | +R | +S | S | FALSE | |
5 | -2010-10-15 | -J3 | +2010-10-04 | +N1 | B_ESCHR_COLI | S | S | @@ -586,52 +586,52 @@ Longest: 1||||||
6 | -2010-10-23 | -J3 | +2010-10-11 | +N1 | B_ESCHR_COLI | +S | +S | +S | R | -S | -S | -S | FALSE |
7 | -2010-11-25 | -J3 | +2010-10-29 | +N1 | B_ESCHR_COLI | R | -R | +S | S | S | FALSE | ||
8 | -2010-12-31 | -J3 | +2010-11-11 | +N1 | B_ESCHR_COLI | +S | +S | R | S | -S | -S | FALSE | |
9 | -2011-02-25 | -J3 | +2010-12-06 | +N1 | B_ESCHR_COLI | R | +S | R | S | -S | -TRUE | +FALSE | |
10 | -2011-03-01 | -J3 | +2010-12-13 | +N1 | B_ESCHR_COLI | R | R | @@ -641,7 +641,7 @@ Longest: 1
Only 2 isolates are marked as ‘first’ according to CLSI guideline. But when reviewing the antibiogram, it is obvious that some isolates are absolutely different strains and should be included too. This is why we weigh isolates, based on their antibiogram. The key_antibiotics()
function adds a vector with 18 key antibiotics: 6 broad spectrum ones, 6 small spectrum for Gram negatives and 6 small spectrum for Gram positives. These can be defined by the user.
Only 1 isolates are marked as ‘first’ according to CLSI guideline. But when reviewing the antibiogram, it is obvious that some isolates are absolutely different strains and should be included too. This is why we weigh isolates, based on their antibiogram. The key_antibiotics()
function adds a vector with 18 key antibiotics: 6 broad spectrum ones, 6 small spectrum for Gram negatives and 6 small spectrum for Gram positives. These can be defined by the user.
If a column exists with a name like ‘key(…)ab’ the first_isolate()
function will automatically use it and determine the first weighted isolates. Mind the NOTEs in below output:
data <- data %>%
@@ -665,11 +665,11 @@ Longest: 1
1
-2010-01-21
-J3
+2010-02-03
+N1
B_ESCHR_COLI
-R
-R
+I
+S
S
S
TRUE
@@ -677,44 +677,44 @@ Longest: 1
2
-2010-03-02
-J3
+2010-04-02
+N1
B_ESCHR_COLI
-R
-R
-R
+S
+S
+S
S
FALSE
-TRUE
+FALSE
3
-2010-08-02
-J3
+2010-06-23
+N1
B_ESCHR_COLI
S
S
S
S
FALSE
-TRUE
+FALSE
4
-2010-10-11
-J3
+2010-06-25
+N1
B_ESCHR_COLI
-S
-S
R
+R
+S
S
FALSE
TRUE
5
-2010-10-15
-J3
+2010-10-04
+N1
B_ESCHR_COLI
S
S
@@ -725,23 +725,23 @@ Longest: 1
6
-2010-10-23
-J3
+2010-10-11
+N1
B_ESCHR_COLI
+S
+S
+S
R
-S
-S
-S
FALSE
TRUE
7
-2010-11-25
-J3
+2010-10-29
+N1
B_ESCHR_COLI
R
-R
+S
S
S
FALSE
@@ -749,48 +749,48 @@ Longest: 1
8
-2010-12-31
-J3
+2010-11-11
+N1
B_ESCHR_COLI
+S
+S
R
S
-S
-S
FALSE
TRUE
9
-2011-02-25
-J3
+2010-12-06
+N1
B_ESCHR_COLI
R
+S
R
S
-S
-TRUE
+FALSE
TRUE
10
-2011-03-01
-J3
+2010-12-13
+N1
B_ESCHR_COLI
R
R
S
S
FALSE
-FALSE
+TRUE
-Instead of 2, now 9 isolates are flagged. In total, 78.5% of all isolates are marked ‘first weighted’ - 50.2% more than when using the CLSI guideline. In real life, this novel algorithm will yield 5-10% more isolates than the classic CLSI guideline.
+Instead of 1, now 8 isolates are flagged. In total, 78.2% of all isolates are marked ‘first weighted’ - 50.0% more than when using the CLSI guideline. In real life, this novel algorithm will yield 5-10% more isolates than the classic CLSI guideline.
As with filter_first_isolate()
, there’s a shortcut for this new algorithm too:
data_1st <- data %>%
filter_first_weighted_isolate()
-So we end up with 15,707 isolates for analysis.
+So we end up with 15,648 isolates for analysis.
We can remove unneeded columns:
data_1st <- data_1st %>%
@@ -800,6 +800,7 @@ Longest: 1
head(data_1st)
+
@@ -815,6 +816,7 @@ Longest: 1
+
date
patient_id
hospital
@@ -831,53 +833,9 @@ Longest: 1
-2012-05-30
-Q5
-Hospital B
-B_STPHY_AURS
-R
-I
-S
-S
-F
-Gram-positive
-Staphylococcus
-aureus
-TRUE
-
-
-2012-10-04
-R8
-Hospital A
-B_ESCHR_COLI
-R
-I
-S
-S
-F
-Gram-negative
-Escherichia
-coli
-TRUE
-
-
-2015-02-19
-T6
-Hospital A
-B_KLBSL_PNMN
-R
-S
-R
-S
-F
-Gram-negative
-Klebsiella
-pneumoniae
-TRUE
-
-
-2015-07-17
-R4
+4
+2012-12-13
+Q2
Hospital C
B_STRPT_PNMN
R
@@ -890,9 +848,10 @@ Longest: 1
pneumoniae
TRUE
-
-2011-01-13
-Q4
+
+5
+2010-01-01
+O10
Hospital B
B_STPHY_AURS
R
@@ -905,16 +864,65 @@ Longest: 1
aureus
TRUE
-
-2013-04-17
-A6
-Hospital C
+
+6
+2010-07-24
+V5
+Hospital A
B_STPHY_AURS
S
S
+R
S
+F
+Gram-positive
+Staphylococcus
+aureus
+TRUE
+
+
+7
+2014-07-13
+G3
+Hospital B
+B_ESCHR_COLI
+R
+S
+R
+R
+M
+Gram-negative
+Escherichia
+coli
+TRUE
+
+
+8
+2013-07-06
+K1
+Hospital D
+B_ESCHR_COLI
+S
+S
+R
S
M
+Gram-negative
+Escherichia
+coli
+TRUE
+
+
+9
+2011-07-06
+X4
+Hospital C
+B_STPHY_AURS
+R
+R
+S
+S
+F
Gram-positive
Staphylococcus
aureus
@@ -941,8 +949,8 @@ Longest: 1
data_1st %>% freq(genus, species)
Frequency table
Class: character
-Length: 15,707
-Available: 15,707 (100%, NA: 0 = 0%)
+Length: 15,648
+Available: 15,648 (100%, NA: 0 = 0%)
Unique: 4
Shortest: 16
Longest: 24
@@ -959,33 +967,33 @@ Longest: 24
1
Escherichia coli
-7,921
-50.43%
-7,921
-50.43%
+7,846
+50.14%
+7,846
+50.14%
2
Staphylococcus aureus
-3,853
-24.53%
-11,774
-74.96%
+3,871
+24.74%
+11,717
+74.88%
3
Streptococcus pneumoniae
-2,349
-14.96%
-14,123
-89.92%
+2,331
+14.90%
+14,048
+89.78%
4
Klebsiella pneumoniae
-1,584
-10.08%
-15,707
+1,600
+10.22%
+15,648
100.00%
@@ -1012,50 +1020,50 @@ Longest: 24
E. coli
AMX
-3775
-243
-3903
-7921
+3764
+263
+3819
+7846
E. coli
AMC
-6223
-298
-1400
-7921
+6286
+255
+1305
+7846
E. coli
CIP
-5995
+5931
0
-1926
-7921
+1915
+7846
E. coli
GEN
-7173
+7043
0
-748
-7921
+803
+7846
K. pneumoniae
AMX
0
0
-1584
-1584
+1600
+1600
K. pneumoniae
AMC
-1230
-57
-297
-1584
+1270
+64
+266
+1600
@@ -1078,34 +1086,34 @@ Longest: 24
E. coli
CIP
-5995
+5931
0
-1926
-7921
+1915
+7846
K. pneumoniae
CIP
-1217
+1214
0
-367
-1584
+386
+1600
S. aureus
CIP
-2930
+2965
0
-923
-3853
+906
+3871
S. pneumoniae
CIP
-1814
+1801
0
-535
-2349
+530
+2331
@@ -1118,7 +1126,7 @@ Longest: 24
As per the EUCAST guideline of 2019, we calculate resistance as the proportion of R (proportion_R()
, equal to resistance()
) and susceptibility as the proportion of S and I (proportion_SI()
, equal to susceptibility()
). These functions can be used on their own:
data_1st %>% resistance(AMX)
-# [1] 0.5358121
+# [1] 0.5357873
Or can be used in conjuction with group_by()
and summarise()
, both from the dplyr
package:
data_1st %>%
@@ -1133,19 +1141,19 @@ Longest: 24
Hospital A
-0.5293870
+0.5376208
Hospital B
-0.5388889
+0.5299270
Hospital C
-0.5364048
+0.5439754
Hospital D
-0.5397891
+0.5373087
@@ -1165,23 +1173,23 @@ Longest: 24
Hospital A
-0.5293870
-4747
+0.5376208
+4758
Hospital B
-0.5388889
-5400
+0.5299270
+5480
Hospital C
-0.5364048
-2431
+0.5439754
+2274
Hospital D
-0.5397891
-3129
+0.5373087
+3136
@@ -1203,27 +1211,27 @@ Longest: 24
Escherichia
-0.8232546
-0.9055675
-0.9868703
+0.8336732
+0.8976549
+0.9850879
Klebsiella
-0.8125000
-0.9084596
-0.9848485
+0.8337500
+0.9050000
+0.9812500
Staphylococcus
-0.8219569
-0.9270698
-0.9890994
+0.8235598
+0.9227590
+0.9842418
Streptococcus
-0.5598127
+0.5456885
0.0000000
-0.5598127
+0.5456885
diff --git a/docs/articles/AMR_files/figure-html/plot 1-1.png b/docs/articles/AMR_files/figure-html/plot 1-1.png
index ccee1219..fac59d74 100644
Binary files a/docs/articles/AMR_files/figure-html/plot 1-1.png and b/docs/articles/AMR_files/figure-html/plot 1-1.png differ
diff --git a/docs/articles/AMR_files/figure-html/plot 3-1.png b/docs/articles/AMR_files/figure-html/plot 3-1.png
index 8168b631..1078fd51 100644
Binary files a/docs/articles/AMR_files/figure-html/plot 3-1.png and b/docs/articles/AMR_files/figure-html/plot 3-1.png differ
diff --git a/docs/articles/AMR_files/figure-html/plot 4-1.png b/docs/articles/AMR_files/figure-html/plot 4-1.png
index 22edb04d..c096fea4 100644
Binary files a/docs/articles/AMR_files/figure-html/plot 4-1.png and b/docs/articles/AMR_files/figure-html/plot 4-1.png differ
diff --git a/docs/articles/AMR_files/figure-html/plot 5-1.png b/docs/articles/AMR_files/figure-html/plot 5-1.png
index 43b81a7c..8134a60a 100644
Binary files a/docs/articles/AMR_files/figure-html/plot 5-1.png and b/docs/articles/AMR_files/figure-html/plot 5-1.png differ
diff --git a/docs/articles/MDR.html b/docs/articles/MDR.html
index a7e2e8b2..0e86071e 100644
--- a/docs/articles/MDR.html
+++ b/docs/articles/MDR.html
@@ -39,7 +39,7 @@
Class: factor > ordered (numeric)
Length: 2,000
Levels: 4: Negative < Multi-drug-resistant (MDR) < Extensively drug-resistant …
-Available: 1,747 (87.35%, NA: 253 = 12.65%)
+Available: 1,745 (87.25%, NA: 255 = 12.75%)
Unique: 2
1 | Negative | 1617 | -92.56% | +92.66% | 1617 | -92.56% | +92.66% | ||
2 | Multi-drug-resistant (MDR) | -130 | -7.44% | -1747 | +128 | +7.34% | +1745 | 100.00% | |
1 | Mono-resistant | -3211 | -64.22% | -3211 | -64.22% | +3246 | +64.92% | +3246 | +64.92% |
2 | Negative | -990 | -19.80% | -4201 | -84.02% | +976 | +19.52% | +4222 | +84.44% |
3 | Multi-drug-resistant | -435 | -8.70% | -4636 | -92.72% | +467 | +9.34% | +4689 | +93.78% |
4 | Poly-resistant | -258 | -5.16% | -4894 | -97.88% | +230 | +4.60% | +4919 | +98.38% |
5 | Extensively drug-resistant | -106 | -2.12% | +81 | +1.62% | 5000 | 100.00% |