Dose-Response Curve Fitting — IC50 and EC50 with Confidence Intervals
Paste a concentration column and a response column. You get a fitted four-parameter logistic curve on a log-dose axis, the IC50 or EC50 with both an asymptotic and a profile-likelihood 95% confidence interval, the Hill slope, the top and bottom plateaus, R², and every fitted parameter with its standard error. Replicates become error bars; a group column becomes overlaid curves.
Your data
SVG is vector — scale it to any size in Illustrator, Inkscape or LaTeX without losing quality, and edit the type. Use it unless a journal insists on raster.
Free downloads carry a small “made with assayplot.com” line along the bottom edge. Nothing else differs, and the figure on screen is never marked. Remove it
Options
Model
All four are the same equation; the 3PLs hold one plateau and the 5PL frees an asymmetry exponent.
Sets the sign of the starting Hill slope only. The fit is free to disagree.
Fit
Weighting assumes the SDs are known. From three replicates an SD carries about 50% relative error, and concentrations with one replicate borrow the pooled SD.
log₁₀0 is undefined, so a vehicle control cannot sit on the axis. Including it asserts that the control equals the plateau.
Figure
Drawn only where a concentration has two or more replicates. The figure states which one it shows.
Printed on the dose axis and in the IC50 column. Nothing is converted — this is a label.
Leave blank for “Concentration (unit)”.
Leave blank for “Response”.
Data
Only ambiguous for a comma followed by exactly three digits; everything else is detected.
Everything above is computed in this browser tab. Your data is not uploaded, and no request is made while you work.
What the tool does
It takes a column of concentrations and a column of responses and fits a sigmoid curve through them by nonlinear least squares. The curve has four parameters — the lower plateau, the upper plateau, the concentration at the halfway point, and how steeply it turns — and the third of those is the IC50 or EC50 you came for.
Concentration goes on a logarithmic axis, which is not a cosmetic choice. A dose-response relationship is sigmoidal in the LOGARITHM of concentration, so a serial dilution plotted on a linear axis crushes every low dose against the left-hand edge and the curve becomes an uninformative hockey stick. Plot the log and the shape appears.
If you have replicates, put each one on its own row at the same concentration: the tool averages them for the point, draws the scatter as an error bar, and — this is the part that matters — fits the curve to every individual measurement rather than to the means. Fitting to means throws away the information about how variable each concentration was, which is exactly the information the confidence interval is built from.
IC50 or EC50 — which one is this?
The same number, named after what the assay measured. IC50 is the half-maximal INHIBITORY concentration: the response falls as dose rises, and the fitted Hill slope is negative. EC50 is the half-maximal EFFECTIVE concentration for something that rises. The arithmetic is identical, and the tool reports whichever name matches the direction it found in your data.
What both mean, precisely, is the concentration producing a response halfway between the fitted Bottom and the fitted Top — not halfway between zero and the highest response observed, and not halfway to 100%. That distinction is where most disagreements between two people analysing one dataset come from. If your assay has a real baseline that is not zero, the fitted Bottom is that baseline, and the IC50 is measured from it.
Choosing a model
Start with the 4PL. It is the default because it is almost always the right answer: it makes no assumption about where the plateaus sit and it is symmetric about the inflection point, which real dose-response data usually is.
Use a 3PL — fixing Bottom or Top at a value you know — when you genuinely know it. A viability assay normalised so that the vehicle control is 100% has a known Top; an assay with a measured no-cell background has a known Bottom. Fixing a parameter you actually know tightens every other estimate, because one fewer thing is being inferred from the same points. Fixing one you have merely guessed at moves the IC50 and hides that it has moved.
Use the 5PL only when you can see asymmetry in the residuals and you have enough points on both shoulders to characterise it. The fifth parameter buys flexibility with a real cost: it is strongly correlated with the other four, so every confidence interval widens, and with a fitted asymmetry the halfway concentration is no longer the fitted parameter — the tool computes and reports it separately for exactly that reason.
Two confidence intervals, and which to quote
The tool reports the IC50 interval twice. The asymptotic interval comes from the curvature of the sum-of-squares surface at the optimum and assumes that surface is a paraboloid. The profile-likelihood interval assumes nothing: it steps the IC50 away from its fitted value, refits everything else at each step, and reports the range over which the fit stays statistically acceptable.
When your data has clear plateaus on both sides, the two agree closely and either is fine. When it does not — when the top of the curve is still climbing at your highest dose — they diverge sharply, and the profile interval is the honest one. Quote it. If its upper bound comes back as undetermined, that is not a software failure: it is the correct statement that your data does not bound the IC50 from above, and the remedy is another dose, not another algorithm.
Reading the fit critically
A high R² means very little here. Almost any sigmoid through a serial dilution scores above 0.98, including badly wrong ones, because the data spans a large range and any curve that goes down through the middle of it captures most of the variance. The diagnostics worth attention are the confidence interval on the IC50, the standard error on the Hill slope, and the correlation between Top and the IC50 — which the tool warns about when it exceeds 0.99, because that value means those two parameters are trading off against each other rather than being measured.
Look at the residuals against the curve rather than at R². Systematic curvature in them means the model is wrong; scatter that grows with the response means the errors are proportional rather than constant, which is the case for turning on the 1/SD² weighting.
Common questions
- Can I include my zero-concentration control?
- You can put it in the table, and the tool will show it, but it cannot sit on a logarithmic axis — log 0 is undefined. It is drawn in a detached band to the left of the axis break and excluded from the fit. That is the conventional treatment and it is also the statistically honest one: a vehicle control is a measurement of the baseline, and the 4PL already has a parameter for the baseline. Fixing Bottom to your control mean with the 3PL is the way to make the control inform the fit.
- Why is my Hill slope negative?
- Because the response falls as concentration rises, which is what an inhibition curve does. Prism uses the same convention. A slope near −1 is what single-site occupancy produces; steeper than about −2 is worth a second look at the dilution series before it is interpreted as cooperativity.
- Should I use SD or SEM error bars?
- SD, in almost every case. SD shows how variable the measurements were; SEM shows how precisely you know the mean, and it shrinks as you add replicates, so SEM bars make a noisy assay look tidy by doing more of it. Journals increasingly ask for SD, and for n to be stated either way. The tool reports n per concentration so you can.
- Are the numbers the same as Prism would give?
- The equation is Prism’s own, with Prism’s parameter names, so they are directly comparable and should agree to within the tolerance of two different optimisers converging on the same minimum. The underlying least-squares solver is checked against NIST certified reference values, which is a stronger check than agreement with any particular program. Where the two differ in approach — Prism’s default IC50 interval is asymptotic — the methods page says so.
- Can I fit several treatment groups at once?
- Yes. Add a group column and each distinct value becomes its own curve, fitted independently and overlaid on one figure with its own colour and marker. The tool does not currently fit a SHARED parameter across groups — a common Top, for instance — which is what you would want for a formal potency-ratio comparison. That is a known gap.