anumaan is an R package for preprocessing antimicrobial resistance (AMR) surveillance data and estimating disease burden using GBD methodology. It is structured around three sequential pipelines that can be used together or separately.
Vignette: Preprocessing Workflow
The preprocessing pipeline standardises raw hospital or surveillance data into an analysis-ready format. It covers:
All functions start with prep_. The pipeline entry point
is run_preprocess() for automated runs or the modular
prep_* functions for staged, inspectable workflows.
library(anumaan)
# Full automated pipeline
result <- run_preprocess(
data = your_ast_data,
config = amr_config(hai_cutoff = 3, event_gap_days = 14)
)
# Or modular
data <- prep_standardize_organisms(data, organism_col = "organism_name")
data <- prep_harmonize_ast(data, ast_col = "antibiotic_value")
data <- prep_create_event_ids(data, patient_col = "patient_id",
date_col = "date_of_culture")See the full step-by-step walkthrough in the Preprocessing Workflow vignette.
Vignette: Exploratory Data Analysis
The EDA pipeline visualises preprocessed data before it moves on to burden estimation. It does not transform data – it is the review step a stewardship team runs on Pipeline 1’s output to catch data-quality issues and characterise the cohort. It covers:
All functions start with plot_, plus the shared
eda_theme() styling helper – deliberately distinct from the
prep_ (Pipeline 1) and daly_ (Pipeline 3)
naming.
library(anumaan)
plot_top_organisms(data, n = 10, mode = "faceted")
plot_abx_heatmap(data, mode = "all")
plot_outcome_distribution(data, mode = "overall")
plot_los_ridge(data, mode = "all")See the full walkthrough in the Exploratory Data Analysis vignette.
Vignette: DALY Burden Estimation
The DALY pipeline takes analysis-ready preprocessed data and produces resistance-profile probability distributions and GBD-style burden estimates. It covers:
All estimation functions start with daly_.
Profile-specific functions are compute_*,
estimate_*, enumerate_*, build_*,
validate_*, check_*, and
bootstrap_*.
# From aggregate marginals (GBD / GLASS / national surveillance)
profiles <- estimate_profiles_convex(
marginals = your_marginals_table,
panel_map = list(
"Klebsiella pneumoniae" = c("Carbapenems", "3GC", "Fluoroquinolones")
)
)
# Assign LOS relative risk and compute fatal resistance prevalence
profiles_rr <- daly_assign_rr_to_profiles(profiles, rr_table)
R_k <- daly_calc_resistance_prevalence_fatal(profiles_rr)See the full walkthrough in the DALY Burden Estimation vignette.
For Pathway 2 Bayesian resistance-profile estimation,
fit_bayesian_multivariate_probit() now accepts a
compute argument so the same statistical model can be run
on either a standard CPU backend or an OpenCL-enabled backend.
fit <- fit_bayesian_multivariate_probit(
event_class_data = event_level_ast,
class_cols = c("3GC", "Carbapenems", "Fluoroquinolones"),
fixed_effects = c("Age_normalised", "gender", "location"),
random_effects = list(
list(name = "hospital", group_col = "center_name", terms = "intercept")
),
pathogen = "klebsiella pneumoniae",
residual_structure = "correlated",
compute = list(
backend = "cpu"
)
)fit_opencl <- fit_bayesian_multivariate_probit(
event_class_data = event_level_ast,
class_cols = c("3GC", "Carbapenems", "Fluoroquinolones"),
fixed_effects = c("Age_normalised", "gender", "location"),
random_effects = list(
list(name = "hospital", group_col = "center_name", terms = "intercept")
),
pathogen = "klebsiella pneumoniae",
residual_structure = "correlated",
compute = list(
backend = "opencl",
opencl_platform_id = 0L,
opencl_device_id = 0L
)
)This backend choice affects compilation and sampling only. Priors, likelihood, diagnostics, posterior predictive checks, resistance profiles, and downstream DALY quantities remain unchanged.
# From GitHub
remotes::install_github("saketlab/anumaan")
# Build vignettes locally when you want the full article set
remotes::install_github("saketlab/anumaan", build_vignettes = TRUE)| Feature | Packages |
|---|---|
| Convex QP solver (recommended) | osqp, Matrix |
| Convex QP solver (fallback) | quadprog |
| Mixed-effects LOS modelling | lme4, glmmTMB |
| Spatial analysis | sf, spdep, leaflet |
| Python ICD-10 embedding | reticulate + alethia |
| pkgdown site build | pkgdown |
| Enhanced EDA theme | ggpubr (plots fall back to
ggplot2::theme_bw() when absent) |
All three pipelines expect long format input — one row per isolate × antibiotic combination:
| Column | Role |
|---|---|
patient_id |
Unique patient identifier |
isolate_id |
Unique isolate identifier (counting unit for resistance stats) |
organism_name |
Organism name (raw) |
antibiotic_name |
Antibiotic name (raw) |
antibiotic_value |
Susceptibility result: R, I, or S |
date_of_culture |
Culture collection date |
specimen_type |
Specimen source |
Optional but used when present: date_of_admission,
date_of_final_outcome, DOB, Age,
gender, final_outcome,
infection_type, state.
prep_standardize_specimens() now returns
sterile_classification collapsed to Sterile,
Non-Sterile, or Others/Ambiguous. The
0.1.0.9021 reference also adds stewardship specimen labels such as
Brain abscess, Instrument,
Lung aspirate, Lymph node, Hair,
and Superficial Biopsy.
Full function documentation is at the Reference page.
# Search all functions
help(package = "anumaan")
# Common entry points
?run_preprocess
?amr_config
?estimate_profiles_convex
?compute_resistance_profilesReport bugs at https://github.com/saketlab/anumaan/issues.