IC50 Studio is an open R Shiny app for dose-response analysis and publication-oriented figure making. It helps you load assay data, fit common sigmoid models, calculate IC50 or EC50 values, compare equations, review fit quality, and export plots and tables.
The app was developed at the Laboratory of Bioactive Peptides (LPB), Faculty of Biochemistry and Biological Sciences, National University of the Littoral (UNL), Santa Fe, Argentina.
- Quick overview: this
README.md - Full guide: USER_MANUAL.md
- In-app guide: the
Instructionstab
- Import
csv,tsv,txt,xls, andxlsxfiles - Paste tab-separated or comma-separated tables copied from Excel
- Map your own dose, response, and optional group columns
- Preview imported columns, suggested mapping, and read diagnostics before fitting
- Validate raw data with warnings plus a quick scatter preview before running the fit
- Accept either linear concentration columns or already
log10-transformed concentration columns - Fit
4PL,5PL,3PL (Hill fixed = 1),3PL (Bottom = 0), and3PL (Top = 100) - Report either
IC50orEC50 - Use
Auto-detect,Increasing, orDecreasingcurve direction - Fit either
Group meansorAll observations - Normalize responses with min/max scaling, manual
0%and100%controls, or zero-dose controls per group - Compare all supported models before running bootstrap uncertainty
- Choose automatic, measured-dose, or custom x-axis breaks and show either concentration or
log10(concentration)axis labels - Control curve error-bar cap width independently from the x-value spacing
- Export curve plots, fit tables, other plots, and other-plot summary tables
- Build
Bar plot,Boxplot, andLine plotfigures in theOther Plotstab - Add manual annotation labels or automatic significance letters to bar plots
Install the required packages once:
install.packages(c("shiny", "bslib", "ggplot2", "DT", "readxl"))Open R or RStudio in this folder and run:
shiny::runApp()- Launch the app.
- Click
Use example dataset, upload your own file, or use thePaste datatab to paste a table copied from Excel. - Review the automatic
Import previewwindow to confirm how the table was read and what column mapping was suggested. - Map the
Concentration or dose column,Response column, and optionalGroup or compound column. - Set
Uploaded concentration valuesso the app knows whether your file stores linear concentrations or alreadylog10-transformed values. - Open
Data Previewand check the validation warnings, raw-data preview, and scatter plot before fitting. - Start with
Fit curve using = Group means. - Keep
Potency uncertainty = Noneduring exploration. - If you are unsure which equation fits best, enable
Compare all models first (no bootstrap). - Click
Run analysis. - Review
Curve Plot,Fit Results, andModel Comparison. - Only after the fit looks right, enable bootstrap uncertainty for final reporting.
- Use the
Other Plotstab if you want publication-style assay figures that do not require curve fitting.
For dose-response fitting, your imported table should contain:
- one numeric dose or concentration column
- one numeric response column
- one optional grouping column such as
compound,sample,treatment, orpeptide
You can supply that table by uploading a supported file or by pasting a tab-separated or comma-separated block with a header row into the Paste data tab.
Important behavior:
- Negative doses are removed.
- The app accepts either linear concentrations such as
0.01,0.1,1, or10, or alreadylog10-transformed values such as-2,-1,0, or1. UseUploaded concentration valuesto match your file. - Zero-dose rows in linear-concentration files are kept in the preview and can be used for
Normalize to zero-dose control (per group). By default they stay out of the nonlinear fit, but you can turn onInclude zero-dose rows in fittingto replace concentration0with a small positive surrogate one log10 decade below the minimum positive concentration. - Each fitted group needs at least
4distinct dose values used for fitting after any log10-to-linear conversion. By default the app counts only positive doses; whenInclude zero-dose rows in fittingis enabled, concentration0can count as one of those levels. - Before fitting, the app warns when a mapped dose or response column contains non-numeric or missing values, or when a group has fewer than
4distinct positive doses. - The app does not assume a fixed concentration unit. You can use
nM,uM,ug/mL,mg/mL, or any other unit as long as the dose column is numeric. IC50andEC50are always reported in linear concentration units, even when the uploaded concentration column is already log10-transformed.- If you choose
Normalize using manual 0% and 100% controls, the app applies100 * (Y - control_0) / (control_100 - control_0). - If you choose
Normalize to zero-dose control (per group), the app applies100 * Y / mean(Y at concentration 0)when the zero-dose mean is non-zero. If that mean is0, the app keeps the zero-dose response as the0%baseline and maps the strongest observed response away from it to100%.
An example file is included at example_dose_response.csv.
- After each file upload, Excel-sheet change, or pasted-data parse, the app opens an
Import previewwindow automatically. - The import preview shows the detected separator when relevant, the first rows as read, suggested column mapping, variable names, and read diagnostics such as suspicious headers or non-numeric mapped columns.
- The
Open import previewbutton reopens that window at any time. - The
Data Previewtab now includes a pre-fit validation block with warning messages, the first10raw rows, and a simple raw scatter plot with alog10x-axis so you can sanity-check the data shape before fitting.
IC50uses a fixed response target of50.EC50uses the half-max effect between the fitted bottom and fitted top.Auto-detectdirection chooses the better fit between increasing and decreasing directions when needed.Weighting = 1 / SD^2 from meansis only meaningful withFit curve using = Group means.- If you switch to
All observations, the app resets weighting toNone. 95% CI,+/- SD, and+/- SEMare bootstrap-based uncertainty estimates for the fitted potency value.
Use log10 concentration axischanges the x-axis spacing, not the underlying reported concentration units.Log10 axis labelscan show either the concentration values or the displayedlog10(concentration)values.X-axis breakscan beAutomatic,Measured concentrations, orCustom.- In
Custommode, x breaks and x limits follow the same scale shown on the axis. Error bar cap width (% of x-axis span)controls the visual cap width so it stays consistent across x-axis scales.
| Model | Parameters | Typical use | Main caution |
|---|---|---|---|
4PL |
bottom, top, midpoint, Hill slope | Best general starting point for inhibitor, viability, and activation-style curves | Assumes a symmetric sigmoid around the midpoint |
5PL |
bottom, top, midpoint, Hill slope, asymmetry | Useful for clearly asymmetric curves, especially in immunoassay-style calibration or other skewed bioassays | Easier to overfit when there are few concentrations or weak plateau coverage |
3PL (Hill fixed = 1) |
bottom, top, midpoint | Simple Langmuir-like shape when you want a fixed slope across groups | Can miss genuinely steep or shallow transitions |
3PL (Bottom = 0) |
top, midpoint, Hill slope | Useful when the biology strongly supports a true zero baseline | Wrong if the lower plateau is not actually near zero |
3PL (Top = 100) |
bottom, midpoint, Hill slope | Useful for well-normalized percent-response assays with a meaningful 100% upper bound | Wrong if the upper plateau is not truly constrained to 100 |
See USER_MANUAL.md for detailed model explanations, Hill-slope interpretation, and scientific references.
Use the Other Plots tab for figures that are common in inhibitor, hemolysis, viability, or other bioassay workflows.
Supported plot types:
Bar plotBoxplotLine plot
Useful details:
- The module uses the same uploaded dataset as the curve-fitting workflow, but has its own
X,Y,Series / color,Facet, andOptional annotationmapping. Bar plotandLine plotcan summarize replicates withMeanorMedian.- Available error bars are
SEM,SD,95% CI,IQR, orNone. Boxplotis best for raw replicate distributions, not pre-summarized means.Bar plotsupports either manual annotation labels or automatic significance letters.
Automatic letters in bar plots:
- Methods:
ANOVA + Tukey HSDorKruskal-Wallis + pairwise Wilcoxon (Holm) - Default comparison scope:
Within each x group in each facet - Recommended use: independent biological replicates, not only technical repeats
- Important limitation: the lettering is a one-factor comparison inside the selected scope and does not replace a full factorial statistical analysis
The Fit Results table includes a reporting_status column to help decide whether a numeric potency value should be reported:
Report numeric potency valueDo not report numeric value (target not reached)Do not report numeric value (extrapolated)Numeric value shown; review fitNo fit available
The fit_reason and reporting_note columns explain why a row needs caution.
When Compare all models first (no bootstrap) is enabled, the app ranks supported equations by:
- how many groups give reportable numeric potency values
- how many groups fit successfully
- how many groups still need review
- median
R-squared - simpler models when the earlier criteria are tied
This makes it easier to choose a practical model before spending time on bootstrap uncertainty.
You can export:
- the main curve plot
- the fit-results CSV
- the other-plot figure
- the other-plot summary CSV
The export settings panel controls file name, format, units, width, height, and DPI for both plotting modules.
- If a curve looks wrong, first check the mapped columns and
Curve direction. - If imported columns look wrong, reopen
Import previewand confirm the separator, header row, and suggested mapping. - If
Data Previewwarns that a group has fewer than4unique doses, expand the tested range or do not expect a stable sigmoidal fit for that group. - If many groups are flagged as
Top far above dataorBottom far below data, try a simpler model or expand the tested concentration range. - If the app says the target was not reached, do not force a numeric IC50 or EC50. Report that the effect was not reached within the tested range.
- If you want a boxplot, make sure your rows are raw replicate values. If your file already contains means plus SD or SEM, use a bar plot instead.
| Dr. Ivan Sanchis | sanchisivan@fbcb.unl.edu.ar sanchisivan@gmail.com |
Laboratory of Bioactive Peptides (LPB)
Faculty of Biochemistry and Biological Sciences (FBCB)
National University of the Littoral (UNL)
Santa Fe, Argentina
Repository: github.com/sanchisivan/ic50-studio
MIT License. See LICENSE for the full text.