How to Calculate IC50 and EC50: the Dose-Response Curve Step by Step

You have a dose-response experiment — cell viability against a cytotoxic compound, enzyme inhibition against a drug, or the response to increasing concentrations of an agonist — and you need a single number that summarizes the whole curve: the concentration at which the effect is half of its maximum. That number is the IC50 or the EC50, depending on whether your effect falls or rises with dose, and calculating it properly is not a matter of fitting a straight line or eyeballing the table for where it crosses 50%.

Why a linear fit (or a rule of three) gets this wrong

Dose-response data, plotted with concentration on a log scale, traces a sigmoid: a flat plateau at very low doses where there's barely any effect, a flat plateau at very high doses where the effect stops growing or shrinking, and a transition between the two. A straight line cannot represent two plateaus and a transition at the same time. Forced onto this kind of data, it either flattens the real transition or, outside the range you actually tested, extrapolates in a straight line toward values with no biological meaning — negative cell viability, inhibition above 100%.

The shortcut of "interpolating between the two points that bracket 50%" isn't the fix either, even though it sounds reasonable: it throws away every other point you measured, uses no information from either plateau, and gives you no way to compute how much uncertainty surrounds that number. With seven concentrations and three replicates each, that shortcut discards twenty of your twenty-one observations to keep two.

The right model: the four-parameter logistic (4PL)

The standard model in pharmacology and biology is the four-parameter logistic curve, almost always called the 4PL. The four parameters it estimates are: the lower plateau (bottom), the upper plateau (top), the midpoint between the two — which, once you undo the log transform, is your IC50 or EC50 — and the Hill slope, which describes how sharp the transition is.

The equation, in the parameterization most commonly used in practice — the one GraphPad Prism uses — is this: response = bottom + (top − bottom) / (1 + 10^((logIC50 − logDose) × HillSlope)).

The fit is run on the base-10 logarithm of the dose, not on the raw dose: that transform is what turns an asymmetric curve into a symmetric sigmoid and what stabilizes the numerical estimation. And unlike simple linear regression, there's no closed-form formula that solves for the four parameters at once: they're estimated by nonlinear least squares, iteratively — the Levenberg-Marquardt algorithm is the usual choice — starting from an initial guess and correcting it step by step until it converges. That's why a proper dose-response fit needs software built for the job, not a trendline in a spreadsheet.

None of this is a reason to distrust nonlinear regression, only a reason to expect a different workflow than the one you're used to from OLS: instead of a single formula, you get an iterative fit that can converge cleanly, converge slowly, or fail to converge at all depending on how good your data and your starting values are. A fit that reports both the parameter estimates and a diagnostic like R² or the residual pattern is telling you more than one that reports only the IC50.

IC50 and EC50: the same curve, opposite direction

The difference between the two names isn't a different model, it's the direction of the effect. EC50 (half-maximal effective concentration) is used when the response rises with dose — an agonist activating a receptor, a pharmacological response that increases. IC50 (half-maximal inhibitory concentration) is used when the response falls with dose — enzyme inhibition, cytotoxicity, an antagonist. The midpoint between the two fitted asymptotes is the same calculation either way; what changes is the sign of the Hill slope and what you're asking the curve.

One nuance that almost always gets skipped: the IC50 or EC50 a fit returns is the relative one — the midpoint between your own fitted asymptotes, not between a 0% and 100% fixed in advance by an external control. Sebaugh (2011) is explicit about this: use the relative value unless you have a 100% control that is demonstrably stable with less than 5% error in its estimate, because only then does the absolute value gain precision without losing accuracy.

The Hill slope: what it tells you and what it doesn't

The Hill slope describes how sharp the transition is between the two plateaus. The reference value is 1: a "standard" transition, with no assumption of cooperativity. A slope steeper than 1 describes a sharper curve — a small change in concentration produces a large change in response — and in receptor-ligand binding contexts this is usually read as positive cooperativity. A slope shallower than 1 describes a more gradual transition.

The real caveat, and the one that almost never gets explained: in a cell-based or functional assay — viability, a reporter assay, a behavioral response — a slope different from 1 often reflects the biology of the assay itself (signal amplification downstream of the receptor, heterogeneity across the cells on the plate) more than true molecular cooperativity at the binding site. Reading it as cooperativity without independent evidence — a direct binding assay, for instance — goes further than the data supports. And a slope far from 1 with no biological justification is, more often than not, a sign of a fit with too few points in the transition zone rather than a genuine finding.

Why it's reported with its 95% confidence interval, not just the point estimate

The point estimate alone hides how well — or how poorly — your data constrain that value. If the concentration range you tested doesn't reach both plateaus, the fit is guessing at the part of the curve you didn't measure, and the confidence interval is exactly what gives that away: it widens, sometimes a lot, or the fit itself fails to converge on a stable solution. An IC50 that falls outside the range you tested isn't a measured IC50: it's the model's prediction about a region you never observed.

This matters even more when you're comparing the potency of two compounds. Looking only at which point estimate is lower and concluding one compound is more potent is a common mistake: if the confidence intervals overlap substantially, that difference hasn't been demonstrated. Comparing them properly means looking at the intervals, not just the point, or running a formal statistical test for whether the two datasets share the same IC50. One more detail, so it doesn't read as an error: the IC50 interval usually comes out asymmetric, because it's computed on the log scale and back-transformed afterward. That's correct, not a mistake in the calculation.

How many concentrations and replicates you actually need

The mathematical minimum for four parameters is five points — just enough to leave one degree of freedom — but that's a floor, not a recommendation. Sebaugh (2011) recommends 6 to 8 concentrations in half-log steps, spread on both sides of the midpoint, with at least two or three replicates per concentration. The costliest mistake in these assays usually isn't having too few replicates: it's crowding every point into the transition zone and never actually observing either plateau.

A cell viability assay with seven concentrations in half-log steps and three replicates each — twenty-one wells in total — is a common design that meets this recommendation with room to spare. With a design like that, the fit typically converges in a handful of iterations and returns a tight confidence interval, because both plateaus are covered by the data rather than guessed at by the model.

And one textbook mistake worth naming directly: don't average your replicates before fitting. If you feed the model the mean of each concentration instead of each replicate separately, you lose degrees of freedom and the confidence interval comes out artificially tight — the fit sees seven perfect points instead of twenty-one with their real variability. The mean per concentration, with its error bar, is what belongs in the figure; the individual data points are what should feed the fit.

What software is actually used in practice

GraphPad Prism is the de facto standard in biology and pharmacology for this kind of fit. It ships with a ready-made panel of equations for dose-response curves — inhibition or agonist, variable slope — that fits the 4PL and returns the IC50 or EC50 with its 95% confidence interval without you having to write out the equation yourself.

In R, the reference alternative is the drc package (Ritz, Baty, Streibig & Gerhard, 2015), built specifically for dose-response analysis and published in PLOS ONE. Its drm() function, combined with a four-parameter log-logistic model, fits the same curve as Prism, with the advantage that the analysis stays a reproducible script instead of a sequence of clicks. If you also want to understand the statistical reasoning behind the fit in depth — how the weighting works, how nested models get compared — the field's reference text is Motulsky and Christopoulos (2004), Fitting Models to Biological Data Using Linear and Nonlinear Regression.

If what you need is a one-off fit without installing Prism or writing an R script, the site's dose-response curve calculator fits the four-parameter logistic to your own data and gives you the IC50 or EC50 with its 95% confidence interval, the Hill slope, and a downloadable PNG of the curve, free and with nothing to install.

Keep reading

All blog articles