1
0
mirror of https://github.com/msberends/AMR.git synced 2026-03-11 17:47:50 +01:00
Commit Graph

65 Commits

Author SHA1 Message Date
b6f8584994 (v3.0.1.9031) fix MDRO for non-RStudio terminal 2026-03-08 11:30:18 +01:00
e2102c081a (v3.0.1.9030) fix R 3.6 2026-03-07 18:07:24 +01:00
Matthijs Berends
9af726dcaa mdro(): infer base drug resistance from drug+inhibitor combination co… (#263)
* mdro(): infer base drug resistance from drug+inhibitor combination columns (#209)

When a base beta-lactam column (e.g., piperacillin/PIP) is absent but a
corresponding drug+inhibitor combination (e.g., piperacillin/tazobactam/TZP)
is present and resistant, resistance in the base drug is now correctly
inferred. This is clinically sound: resistance in a combination implies the
inhibitor provided no benefit, so the base drug is also resistant.

Susceptibility in a combination is NOT propagated to the base drug (the
inhibitor may be responsible for susceptibility), so only R values are
inferred; missing base drugs remain NA otherwise.

Implementation details:
- Uses AB_BETALACTAMS_WITH_INHIBITOR to identify all beta-lactam+inhibitor
  combinations present in the user's data
- Derives base drug AB codes by stripping the "/inhibitor" part from names
- Creates synthetic proxy columns (.sir_proxy_<AB>) in x, set to "R" when
  any matching combination is R, otherwise NA
- Proxy columns are added to cols_ab before drug variable assignment,
  so all existing guideline logic benefits without any changes
- Multiple combos for the same base drug are OR-ed (any R → R)
- Adds internal ab_without_inhibitor() helper for the name->base mapping
- Verbose mode reports which combinations are used for inference

Bumps version: 3.0.1.9028 -> 3.0.1.9029

https://claude.ai/code/session_01Cp154UtssHg84bw38xiiTG

* Add sir.R/mic.R fixes and mdro() unit tests; bump to 3.0.1.9030

R/sir.R (line 571):
  Guard purely numeric strings (e.g. "1", "8") from the Unicode letter
  filter. Values matching the broad SIR regex but consisting only of digits
  must not be stripped; add `x %unlike% "^[0-9+]$"` predicate.

R/mic.R (lines 220-222):
  Preserve the letter 'e' during Unicode-letter removal so that MIC values
  in scientific notation (e.g. "1e-3", "2.5e-2") survive the cleaning step.
  - Line 220: [\\p{L}] → [^e\\P{L}]  (remove all letters except 'e')
  - Line 222: [^0-9.><= -]+ → [^0-9e.><= -]+  (allow 'e' in whitelist)

tests/testthat/test-mdro.R:
  New tests for the drug+inhibitor inference added in the previous commit
  (issue #209):
  - TZP=R with no PIP column → PIP inferred R → MDRO class elevated
  - TZP=S with no PIP column → proxy col is NA (not S) → class lower
  - verbose mode emits "Inferring resistance" message
  - AMC=R with no AMX column runs without error (Enterococcus faecium)

https://claude.ai/code/session_01Cp154UtssHg84bw38xiiTG

* Fix version to single bump (9029) and update CLAUDE.md versioning rules

CLAUDE.md: Rewrite the "Version and date bump" subsection to document that:
- Exactly ONE version bump is allowed per PR (PRs are squash-merged into one
  commit on the default branch, so one commit = one version increment)
- The correct version is computed from git history:
    currentversion="${currenttag}.$((commits_since_tag + 9001 + 1))"
  with the +1 accounting for the PR's own squash commit not yet on the
  default branch
- Fall back to incrementing DESCRIPTION's version by 1 if git describe fails
- The Date: field tracks the date of the *last* PR commit (updated each time)

DESCRIPTION / NEWS.md: Correct the version from 3.0.1.9030 back to 3.0.1.9029.
Two version bumps were made across two commits in this PR; since it will be
squash-merged as one commit only one bump is correct. Also update Date to
today (2026-03-07).

https://claude.ai/code/session_01Cp154UtssHg84bw38xiiTG

* Fix stats::setNames, test accessor bug, and version script verification

R/mdro.R:
  Qualify setNames() as stats::setNames() in the drug+inhibitor inference
  block to satisfy R CMD CHECK's global-function checks.

tests/testthat/test-mdro.R:
  mdro() with verbose=FALSE returns an atomic ordered factor, not a
  data.frame. Fix three test errors introduced in the previous commit:
  - Line 320: result_no_pip$MDRO -> result_no_pip (factor, no $ accessor)
  - Line 328: result_tzp_s$MDRO / result_no_pip$MDRO -> direct factor refs
  - Line 347: expect_inherits(..., "data.frame") -> c("factor","ordered")
  Also fix the comment on line 347 to match the actual return type.

Version: confirmed at 3.0.1.9029 (no further bump; one bump already made
this PR). git describe failed (no tags in dev environment) — fallback
applies. The +1 in CLAUDE.md's formula is correct for tagged repos:
currentcommit + 9001 + 1 = 27 + 9001 + 1 = 9029 ✓

https://claude.ai/code/session_01Cp154UtssHg84bw38xiiTG

* Fix unit tests: use mrgn guideline and expect_message() for proxy tests

Three failures corrected:

1. Classification tests (lines 321, 329): The EUCAST guideline for
   P. aeruginosa already has OR logic (PIP OR TZP), so TZP=R alone
   satisfies it regardless of whether the PIP proxy exists. Switch to
   guideline="mrgn": the MRGN 4MRGN criterion for P. aeruginosa
   requires PIP=R explicitly (lines 1488-1496 of mdro.R), with no TZP
   fallback. Without the proxy: PIP missing -> not 4MRGN -> level 1.
   With the proxy (TZP=R infers PIP=R): 4MRGN reached -> level 3.
   The TZP=S case leaves proxy=NA, so PIP is still absent effectively
   -> level 1, which is < level 3 as expected.

2. Verbose/message test (line 335): message_() routes through message()
   to stderr, not cat() to stdout. expect_output() only captures stdout
   so it always saw nothing. Fix: use expect_message() instead, and
   remove the inner suppressMessages() that was swallowing the message
   before expect_message() could capture it.

Also trim two stale lines left over from the old expect_output block.

https://claude.ai/code/session_01Cp154UtssHg84bw38xiiTG

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-03-07 18:06:55 +01:00
d384b492cf (v2.1.1.9289) unit test fix 2025-06-01 16:00:12 +02:00
4b171745de (v2.1.1.9276) mdro() fix 2025-05-15 10:39:48 +02:00
48a59ee31a (v2.1.1.9275) include guideline name in MDRO verbose output 2025-05-13 18:56:12 +02:00
7d45ca9fbf (v2.1.1.9274) Improve is_sir_eligible, rename verbose MDRO output 2025-05-12 12:35:11 +02:00
40d7a971c3 (v2.1.1.9236) documentation 2025-04-12 11:46:42 +02:00
36fd99e1f4 (v2.1.1.9235) New website! 2025-04-08 15:54:30 +01:00
8deaf2c8eb (v2.1.1.9224) skip tests on cran 2025-03-20 23:29:21 +01:00
58d7aa8790 (v2.1.1.9199) fix eucast 2025-03-14 13:43:22 +01:00
f7938289eb (v2.1.1.9186) replace antibiotics with antimicrobials! 2025-03-07 20:43:26 +01:00
07efc292bc (v2.1.1.9163) cleanup 2025-02-27 14:04:29 +01:00
f03933940c (v2.1.1.9131) implement testthat 2025-01-27 21:43:10 +01:00
d8c91d5876 (v1.6.0.9031) tinytest unit tests 2021-05-15 21:36:22 +02:00
9a381c8d18 (v1.6.0.9030) new unit test flow 2021-05-13 23:07:31 +02:00
9ed2f6490f (v1.6.0.9028) new unit test flow 2021-05-13 22:44:11 +02:00
aeea00881e (v1.6.0.9023) new unit test flow 2021-05-13 19:31:47 +02:00
7a3139f7cc (v1.6.0.9000) custom EUCAST rules 2021-04-07 08:37:42 +02:00
cb404492b2 (v1.5.0.9017) unit testing 2021-02-08 21:09:36 +01:00
2eca8c3f01 (v1.5.0.9014) only_rsi_columns, is.rsi.eligible improvement 2021-02-02 23:57:35 +01:00
27f084d819 (v1.5.0.9007) updated unit tests 2021-01-18 18:45:43 +01:00
4eab095306 (v1.5.0.9006) major documentation update 2021-01-18 16:57:56 +01:00
e699de955c (v1.5.0.9004) custom MDRO guideline 2021-01-17 00:26:48 +01:00
8b52f9b1be (v1.4.0.9047) unit tests 2020-12-27 00:30:28 +01:00
68ac39aa7f (v1.4.0.9016) as.rsi() older R versions 2020-11-10 19:59:14 +01:00
28e77680c5 (v1.4.0) matching score update 2020-10-08 11:16:03 +02:00
4e0374af29 (v1.3.0.9035) mdro() for EUCAST 3.2, examples cleanup 2020-09-29 23:35:46 +02:00
76fc8e1b14 (v1.2.0.9026) move to github 2020-07-08 14:48:06 +02:00
5216d2b520 (v1.1.0.9014) lose dependencies 2020-05-19 14:16:45 +02:00
7f3da74b17 (v1.1.0.9004) lose dependencies 2020-05-16 13:05:47 +02:00
ced1a7b7fa (v0.9.0.9008) Happy new year! Add lifecycles 2020-01-05 17:22:09 +01:00
1c4f91ab74 ci fix 2019-11-06 16:08:58 +01:00
5345d2759a (v0.8.0.9012) mdro improvement 2019-11-05 11:28:52 +01:00
29e448883d (v0.8.0.9008) new verbose mode for MDROs 2019-11-03 22:24:42 +01:00
412077a6f2 (v0.8.0.9005) fix unit tests 2019-10-26 22:21:26 +02:00
d2e8249edd (v0.8.0.9004) added MDR guideline by Magiorakos et al. 2019-10-26 21:56:41 +02:00
3e5ab53209 (v0.8.0.9002) eucast_rules() fix for S. maltophilia 2019-10-23 14:48:25 +02:00
10e6b225e7 (v0.7.1.9107) v0.8.0 2019-10-15 14:35:23 +02:00
00cdb498a0 (v0.7.1.9102) lintr 2019-10-11 17:21:02 +02:00
5dbff3e170 (v0.7.1.9098) mdro() unit test fix 2019-10-07 15:12:42 +02:00
4e9c4c1b4e (v0.7.1.9096) German guideline for mdro() 2019-10-07 14:32:06 +02:00
e2aa4f996b (v0.7.1.9075) new microorganism codes 2019-09-18 15:46:09 +02:00
93be16484b (v0.7.1.9063) septic_patients -> example_isolates 2019-08-27 16:45:42 +02:00
c57ad26c5b (v0.7.1.9007) mdro update 2019-07-04 15:26:07 +02:00
270aa0dd33 v0.7.0 2019-06-03 17:45:22 +02:00
60983a1640 added mdr_tb() 2019-05-23 16:58:59 +02:00
07d26cd485 faster determination of abx 2019-05-20 19:12:41 +02:00
461eec9bac cfta streptococci, codecov.yml 2019-04-09 14:59:17 +02:00
fbc9191b13 new EUCAST rules algorithm 2019-04-05 18:47:39 +02:00