vancomycin tdm · how-to and mathematics

From a patient to a dose — and every equation in between.

A walkthrough of the real calculator, followed by a complete account of the mathematics and the population models it uses, each tied to the paper it came from. Every screenshot is a synthetic demo patient, never a real one. This is orientation, not clinical advice — the tool is decision support, and every number it produces still wants a clinician's judgement.

Five words first

AUC24
The total drug exposure over a day — the area under the concentration-time curve. Vancomycin's efficacy and its kidney toxicity both track exposure rather than any single concentration, which is why the 2020 guideline made this the target and retired trough-only dosing.
Trough
The lowest concentration, just before the next dose. Still worth measuring — it is what an assay actually returns — but it is no longer a target. Many different exposure profiles can produce an identical trough.
Clearance (CL)
Volume of blood cleared of drug per hour. It sets the exposure: at steady state, AUC24 = daily dose ÷ CL.
Volume of distribution (V)
The apparent volume the drug spreads into. It sets how high the peak goes and how fast the level swings between doses.
Bayesian / MAP
A method that starts from what is typical for a population, then bends towards this patient as their own measured levels arrive. With one level it moves partway; with more, further. It never ignores the data, and never fully abandons the prior.

The walkthrough

01

Open the tool

The vancomycin calculator as it opens, inputs on the left and results on the right. The vancomycin calculator as it opens, inputs on the left and results on the right.

Inputs on the left, answers on the right. Two modules across the top: Trough-Based for deterministic dosing, and AUC Precision for Bayesian fitting once you have levels. Saved profiles work in both — save from either and loading fills both, so a patient is entered once. Nothing leaves the browser: there is no server and no network call.

02

Describe the patient

Patient demographics and renal function filled in, with derived weights and creatinine clearance shown. Patient demographics and renal function filled in, with derived weights and creatinine clearance shown.

Age, sex, height, weight and creatinine. The tool derives ideal and adjusted body weight and shows the creatinine clearance it will use, naming the weight basis so you can see which one it chose. The creatinine is used exactly as entered — it is never rounded up. If cystatin C is available, entering it surfaces a creatinine/cystatin discordance check, which is the honest answer to the low-muscle-mass problem that rounding was invented to paper over.

03

Read a starting dose

The trough-based module showing an empiric regimen. The trough-based module showing an empiric regimen.

A starting regimen from population pharmacokinetics before any level exists. Choose the clearance and volume models on the right; the panel underneath states the provenance of whichever you pick. Expect roughly ±35% uncertainty on exposure at this stage — that is what "no levels yet" means, and the tool says so rather than implying precision it does not have.

04

Enter the actual course

The AUC Precision module with a dose history and a measured level entered. The AUC Precision module with a dose history and a measured level entered.

Enter what the patient actually received — every dose, its infusion duration, and the real administration time — then the measured level and when it was drawn. Times matter more than people expect: the fit is only as good as the timestamps. Rows that are started but incomplete are reported rather than silently dropped.

05

Fit this patient

The Bayesian result: regimen detection, fitted PK parameters and a dose recommendation. The Bayesian result: regimen detection, fitted PK parameters and a dose recommendation.

The fit. Read it top-down: the regimen the tool believes the patient is on (with its confidence, and whether it detected a change of interval), then the fitted clearance and volume beside the population values, then the recommendation. The banner in this example reports a genuine q12h → q8h transition — detected from the two most recent intervals rather than from whichever interval appeared most often. If you know the intended order, set it in Current intended regimen; that steers the projection and never alters the data the fit consumes.

06

Read the profile

The concentration-time profile with the individual fit, population prediction and the measured level. The concentration-time profile with the individual fit, population prediction and the measured level.

The solid line is this patient; the dashed line is what the population model predicted before their levels were known. The gap between them is what the measurement bought you. Points are measured levels, vertical marks are doses with the interval between them annotated, and the shaded band is a trough reference — not a target. Hover anywhere on the curve to read the fitted concentration at that instant, the clock time, and how long it has been since the last dose.

Every time is a date and a time

Doses and levels are entered as full timestamps everywhere in the tool — never a bare clock reading. This is not tidiness; it is the difference between a correct answer and a confidently wrong one.

Two-level sampling routinely spans midnight. A dose at 10:22 and a level at 10:38 the next morning are 24.3 hours apart, but from clock readings alone that is indistinguishable from 16 minutes. Earlier versions of this tool resolved the ambiguity by assuming the same day and adding 24 hours only when the result went negative, which folds every interval into the range 0–24 h.

That has two consequences, and the quieter one is the dangerous one. When the second level wraps below the first, the solver refuses and says so. But when both levels fall on a later day they shift by the same 24 hours, the log-linear slope between them is unchanged, and the elimination rate still comes out right — while the back-extrapolation to the peak, which uses the absolute time, is a full day early. Volume of distribution then comes out several-fold wrong with nothing on screen to suggest it. A dose at 08:00 with levels at 12:00 and 18:00 the next day gave a Vd of 75 L where the truth was 13 L.

Each field now carries its own date, and the tool prints the elapsed interval back to you — 1d 0.3h (total 24.3h) after dose start — so you can confirm it read the timestamps the way you meant them before you trust anything downstream. A level dated before its dose is reported as an error rather than silently absorbed.

Reading the graph

The plot exists so you can estimate a concentration at a time point. Its axes are built for that, and a few of its choices are deliberate enough to be worth stating.

The time axis is your interval, not a constant

Ticks are placed at half the dosing interval, so there are always seven of them and every dose boundary falls on one — at Q6H they land on 0, 3, 6, 9, 12, 15 and 18 h; at Q48H on 0, 24, 48 and so on. You can therefore read the trough directly off a gridline rather than interpolating toward it. The vertical terracotta rules mark where each dose is given.

This replaced a fixed 8-hour tick that aligned with no dose boundary at Q6H, Q12H, Q18H, Q24H, Q36H or Q48H, and drew nineteen overlapping labels at Q48H.

The concentration axis contains everything drawn on it

The vertical range is chosen to include the curve, the target band, and any measured level — not just the curve. That matters for a low-dose regimen in a fast clearer: if the axis followed the curve alone, a 10–20 mg/L band would be painted off the top of a plot whose peak was 8 mg/L, and the band would read as "everything above 10 is on target." Gridlines are placed on round values at a roughly constant density whatever the scale.

The shaded band is your target, and it is a reference

The band is drawn from the trough range you entered, and labelled with those bounds — it is not a fixed 10–20. It is shaded for orientation only: the 2020 guideline withdrew trough as a target (Rec 3, A-II) and AUC24 governs. It stays on the chart because a trough is still the value a level actually measures.

What each mark means

MarkMeaning
Rose ×, with a valueA measured level. The only real number on the chart; everything else is a model. Drawn above the curves so nothing hides it.
Solid terracotta lineThis patient's fitted concentration-time curve.
Dashed neutral lineWhat the population model predicted before the levels were known. The gap between the two is what the measurement bought you.
Solid purple lineProjection under doses that have not been given yet.
Amber and purple dotsPredicted peak (end of infusion) and trough (end of interval).
Shaded bandYour trough reference range, labelled with its bounds.

Markers are drawn on the curve, not near it — the curve is sampled at the end of infusion and at each interval boundary specifically so the peak dot sits on the line rather than above the corner the polyline would otherwise cut. If a marker ever appears off the curve, that is a bug, not rounding.

One place the marker genuinely cannot lie on the curve

In Random Level mode the level is fitted against single-dose decay while the chart draws a steady-state profile. These are different models, so the plotted point and the drawn curve will not coincide, and that is expected rather than an error. Read the fitted parameters, not the visual fit.

Choosing the interval — and why the tool will not do it for you

The tool computes exposure. It does not choose your dosing interval, and the reason is arithmetic rather than modesty.

At steady state the area under the curve over 24 hours is simply the total daily dose divided by clearance:

AUC24 = dose x (24/tau) / CL = total daily dose / CL

There is no interval term in it. 500 mg every 12 hours and 1000 mg every 24 hours deliver exactly the same exposure, and so does 2000 mg every 48 hours. Any rule that ranks regimens on how close their AUC24 sits to a target is therefore blind to the interval by construction; whichever interval happens to reach a daily dose nearest the target wins, and with doses rounded to 250 mg that is decided by rounding rather than by pharmacology. The rounding is not even-handed either — one 250 mg step moves AUC24 six times less at Q48H than at Q8H, so a long interval can always land closer.

Rather than hide that behind a tuned preference score, the tool shows the whole picture. The exposure matrix lays out every dose against every interval, shades each cell against the 400–600 mg·h/L band, strikes through anything that breaches a hard safety limit, outlines the recommended cell, and lets you click any other one to see its full profile. The AUC values repeat down the diagonals, which is the point: those regimens are exposure- equivalent.

What does change with the interval is the shape — peak and trough. Those are yours to weigh against renal trajectory, how long you expect the regimen to stand, infusion-related tolerability and practicality on the ward. The tool gives you the numbers for each; the judgement is not something it can derive from an AUC target.

The single recommendation is still shown, because a starting point is useful. Treat it as one admissible cell among several rather than as a ranking the model has earned.

The mathematics

Everything below is implemented in the shipped file and covered by an automated suite that runs the real engine — 101 unit and regression tests, 21 simulation checks, and 40 regimen-detection cases. Fifteen of those run the actual chart renderers and assert on what they draw.

Body size and renal function

Ideal body weight. At or above 60 in (152.4 cm), Devine (1974):

IBW = 50 (male) or 45.5 (female) + 2.3 x (height_in − 60)

Below 60 in, Devine extrapolates downwards and understates IBW, so the GlobalRPH BMI method is used instead — with the target BMI derived from the Devine anchor rather than chosen:

IBW = (50 ÷ 1.524²) x height_m² = 21.53 x height_m² (male) IBW = (45.5 ÷ 1.524²) x height_m² = 19.59 x height_m² (female)

Deriving the target from the anchor is what makes the two methods meet: IBW is continuous and monotonic across 152.4 cm. Substituting round numbers such as 21.5 / 22.0 — a different method entirely (Tokunaga 1991) — breaks the join and makes a 152.3 cm woman weigh more than one at 152.5 cm.

Adjusted body weightAdjBW = IBW + 0.4 x (TBW − IBW), used for creatinine clearance when total weight exceeds IBW by more than 20%. Where actual weight is below the selected basis, actual weight wins.

Creatinine clearance — Cockcroft-Gault, on the measured creatinine:

CrCl = ((140 − age) x weight) ÷ (72 x SCr) x 0.85 if female

No rounding of low creatinine. Rounding up in the elderly under-doses measurably: in 56 patients aged ≥65 with baseline SCr <1, rounded creatinine missed measured troughs by 8.84 mg/L against 4.54 mg/L for the actual value, and 92.9% came out subtherapeutic (Drugs R&D 2017;17:463-70). The one exception is internal to the Goti model, which was estimated on truncated creatinine and so must be fed the same transformation — that never touches the creatinine clearance shown on screen.

One-compartment infusion, at steady state

With R0 = dose ÷ t_inf, ke = CL ÷ V, interval tau:

C_peak = (R0 ÷ (ke·V)) · (1 − e^(−ke·t_inf)) ÷ (1 − e^(−ke·tau)) C_trough = C_peak · e^(−ke·(tau − t_inf))

During the infusion the residual from the previous interval must be carried forward:

C(t) = (R0 ÷ (ke·V)) · (1 − e^(−ke·t)) + C_trough · e^(−ke·t) 0 ≤ t ≤ t_inf C(t) = C_peak · e^(−ke·(t − t_inf)) t > t_inf

Dropping that second term is a real and easy mistake — it agrees with the correct form at the end of the infusion, so it looks right, but it returns zero at t = 0, implying no drug present immediately before a dose at steady state. It shipped here until September 2026 and was caught by external review.

Exposure

AUC_24 = (dose x 24 ÷ tau) ÷ CL

Exact at steady state and independent of the compartment model — which is why it, not the trough, is the quantity the tool optimises against. A trapezoidal form (linear across the infusion, log-linear across elimination) is also implemented; the two agree to within 0.31% worst case.

Fitting this patient

Two levels, no prior — Sawchuk-Zaske. The elimination rate comes straight from the slope between two post-infusion concentrations:

ke = ln(C1 ÷ C2) ÷ (t2 − t1)

Volume then comes from back-extrapolating to the peak — and here where in the course the levels were drawn changes the answer. The single-dose form assumes nothing was left over from a previous dose:

V = (R0 ÷ (ke·C_peak)) · (1 − e^(−ke·t_inf)) first dose V = (R0 ÷ (ke·C_peak)) · (1 − e^(−ke·t_inf)) ÷ (1 − e^(−ke·tau)) steady state

Elimination is basis-independent — accumulation does not change a log-linear slope. Volume is not. Treating steady-state levels as first-dose levels attributes the drug already in the body to a smaller volume: for a patient with ke 0.0866 and V 52 L on 1000 mg q12h, V comes back as 33.6 L (−35%) and AUC24 as 687 against a true 444 — a 55% over-read, which would argue for reducing the dose of a patient already at target. The calculator therefore asks which it is rather than assuming.

Bayesian MAP — minimise the Burton (1985) objective over the individual deviations eta:

OBJ = Σ (eta_i² ÷ omega_i²) + Σ ((C_pred − C_obs)² ÷ SE²)

The first sum is the price of departing from the population; the second is the price of disagreeing with the measurements. Minimising their total is what "bend towards the patient, but only as far as the data justifies" means arithmetically. Parameters are exponential — CL = CL_pop · e^(eta_CL) — so they stay positive. The search is Nelder-Mead simplex, in two dimensions for one-compartment models and three for two-compartment.

Two compartments

Concentrations follow a bi-exponential: a fast distribution phase then a slow terminal phase, with the macro-constants alpha and beta obtained from the micro-constants k10, k12, k21. Steady state is reached by superposition of repeated doses — and the number of cycles required is derived from the terminal half-life rather than assumed:

beta = ((k10 + k12 + k21) − √((k10 + k12 + k21)² − 4·k21·k10)) ÷ 2 cycles = ceil(10 x (ln2 ÷ beta) ÷ tau), clamped to [12, 400]

A fixed 12 cycles is not steady state when clearance is low. At CrCl 10 a Goti patient has a terminal half-life near 110 h, so twelve 12-hourly cycles covers about 1.3 half-lives and reads the trough roughly 40% low — in exactly the renal-impairment patients where accumulation is the danger.

The population models

Four Bayesian priors and four deterministic model pairs. Every parameter below was checked against the primary source; where a coded value disagreed with its paper, the paper won.

Bayesian priors

ModelStructureTypical valuesBetween-subjectResidualSource
Buelga 2005
Haematological malignancy, n=215
1-compartment CL (L/h) = 1.08 x CLcr (L/h); V (L) = 0.98 x TBW omega 28.16% (CL), 37.15% (V), exponential sigma 3.52 mg/L, additive Buelga DS et al. Antimicrob Agents Chemother 2005;49(12):4934-41
verified: verbatim
Goti 2018
Hospitalised adults incl. haemodialysis, n=1,812
2-compartment CL = 4.5 x (CrCl/120)^0.8 x 0.7^DIAL; Vc = 58.4 x (WT/70) x 0.5^DIAL; Vp = 38.4; Q = 6.5 BSV %CV 39.8 / 81.6 / 57.1 (CL / Vc / Vp) 22.7% proportional + 3.4 mg/L additive Goti V et al. Ther Drug Monit 2018;40(2):212-21 (+ erratum 2019;41(4):549)
verified: 16 of 16 parameters
Goti 2018 — HD
The dialysis arm of the same model
2-compartment As above with DIAL = 1: CL x 0.7 and Vc x 0.5 as Goti as Goti Goti V et al. Ther Drug Monit 2018;40(2):212-21
verified: as Goti
Hughes 2024
Class 3 obesity ONLY — BMI ≥ 40 (median 46.3, range 40–70.3)
2-compartment, FFM-scaled CL = 5.09 x (CrCl_FFM/100)^0.887; Vc = 64.9 x (FFM/70); Vp = 66.4 x (FFM/70); Q = 6.36 BSV %CV 24.9 / 17.8 / 80.3 15.6% + 1.2 mg/L Hughes M-SA et al. Ther Drug Monit 2024;46(5):575-83, Table 2 (nlmixr2)
verified: Table 2 exact; one structural defect corrected

Deterministic models

ModelClearanceVolumeProvenance
VancoPK CL (mL/min) = 0.75 x CrCl + 4 Vd (L) = 0.29 x age + 0.33 x TBW + 11 Vd: Fewel N. J Clin Pharm Ther 2021;46:1426-32 (verified verbatim). CL: vancopk.com in-house regression, updated Nov 2023 — site documentation, not peer-reviewed.
Matzke 1984 CL (mL/min) = 0.689 x CrCl + 3.66 0.72 or 0.89 L/kg by CrCl band, or 0.875 L/kg pooled Matzke GR et al. Antimicrob Agents Chemother 1984;25(4):433-7. The CL equation is verbatim (r = 0.8807). The Vd split on CrCl is NOT a published covariate — the paper states there was no significant relationship between Vd and CLcr — so a pooled option is offered.
Buelga 2005 CL (L/h) = 1.08 x CLcr (L/h) 0.98 L/kg TBW Same model the AUC module uses as its Bayesian prior — the two modules agree exactly.
Bauer per-kg clearance x weight 0.70 L/kg TBW Bauer LA. Pharmacotherapy: A Pathophysiologic Approach, 11e, ch. e5. Textbook method; no standalone source paper.

Choosing between them

The tool recommends a model from the patient, but the choice is yours. Two constraints are worth knowing because they are easy to get wrong:

  • Hughes is a class-3 model. It enrolled only patients with a BMI of at least 40 kg/m² and should not be used below that. There is no vancomycin population model validated specifically for BMI 30–39.9; the tool routes that band to Goti — the largest development dataset, with a weight covariate on central volume — and says plainly that nothing is validated there. Obtain levels early and let the Bayesian fit carry the weight.
  • The Hughes creatinine clearance is deliberately lower, by roughly 20–25%. Hughes fitted its clearance against a Cockcroft-Gault computed on fat-free mass, not total or adjusted weight — the paper found that "using FFM as an input to the Cockcroft-Gault equation improved the fit significantly compared with using TBW". It is a model input, not an estimate of the patient's renal function, and feeding the model a conventional creatinine clearance would over-predict clearance and over-dose.
  • Goti with a single trough is weaker than it looks. Three parameters from one or two troughs is under-determined; a second trough adds little. With one level a one-compartment model is often the more reliable choice.

How much a level is worth

Simulated against the verified Buelga prior, 2,000 patients per level count. These are measured, not asserted, and are quoted at the ~80th percentile:

LevelsMedian error80th percentile90th percentileWithin ±15%
0 — population only18.3%35.4%45.9%42%
110.3%20.9%28.3%66%
28.8%18.2%25.4%73%
3 or more8.1%17.1%23.2%76%

The first level buys the most. The tool previously claimed ~±15% at one level; only 66% of simulated patients met that, so the disclosure was re-derived from simulation and now states the percentile it means.

The safety bounds, and where they come from

A dose recommendation is filtered before it is offered. The bounds are tiered by how much clinical judgement each requires.

TierBoundValueSource
Hard reject
dose-domain; cannot be wrong for a clinical reason
Single dose≤ 2000 mgconventional adult per-dose ceiling
Total daily dose≤ 4500 mgadult empiric maintenance ceiling
AUC24 absolute≤ 700 mg·h/LAKI risk rises above ~650 (Rybak 2020); Zasowski 2018
Acceptance bandAUC24400–600 mg·h/LRybak 2020 Rec 1 (A-II), assuming MIC 1 mg/L
Flags
attached to the answer, never used to hide it
Trough warning≥ 15 mg/LAKI risk begins to rise (Rybak 2020)
Trough high≥ 20 mg/Lupper end of that band; trough ≥18.2 → 3–4× risk
Sub-inhibitorytrough < MICpart of each interval below the MIC

Trough is deliberately not a filter. Because the dose is solved from the target exposure, every candidate already sits near the target AUC — so a trough window would not be guarding exposure, it would be silently choosing the dosing interval on rounding arithmetic. The 2020 guideline withdrew trough as a target for the same underlying reason: many different profiles share one trough. When no candidate is admissible the tool refuses and says which bound failed rather than quietly returning a rejected regimen.

What it does not do

  • No paediatrics or neonates. Adult models only.
  • No CRRT, SLED or hybrid therapies. Intermittent haemodialysis is supported through the Goti dialysis covariate; continuous modalities are not modelled.
  • No continuous infusion. Intermittent dosing only.
  • Two-compartment fitting from troughs alone is under-determined. Three parameters from one or two troughs carries wider uncertainty than the one-compartment path; a second trough adds little. This is measured and documented, not hidden.
  • It is advisory. Nothing here is a prescription, and no number replaces the judgement of the person signing for the dose.

The engine, its tests and the full audit record — including the defects found and what they cost — live with the source. The calculator runs entirely in your browser; no patient data is transmitted anywhere.