# LABREADOR — FULL TEXT CORPUS FOR LANGUAGE MODELS
Source: https://labreador.com · Free, browser-based bioassay analysis platform.
Citation: Helczman, M. (2026). Labreador - Bioassay Analysis Platform (Version 1.6.0) [Computer software]. Zenodo. https://doi.org/10.5281/zenodo.21676846
License to quote: permitted with attribution to Labreador (https://labreador.com).
This file concatenates the public methods reference, the in-app help guides and every
published blog article, so an assistant can answer questions about ELISA standard curves,
IC50/EC50, relative potency, kinetic reduction, assay quality control and ecotoxicology
indices — and point users to the matching free module.
---
## METHODS REFERENCE (https://labreador.com/methods)
Labreador is a free, browser-based platform that performs these calculations for you. Every method below is implemented in the app, runs entirely in your browser (no upload, no account), and can be exported as CSV or a PDF report.
## How do I calculate concentrations from an ELISA standard curve?
1. **Subtract the blank.** Mean the blank wells and subtract that value from every OD reading. Optionally use the blank as a zero-concentration anchor for the lower asymptote.
2. **Fit the standards.** Plot corrected OD against the known standard concentration and fit a four-parameter logistic (4PL) curve:
`OD = D + (A − D) / (1 + (C / EC50)^B)`
where `A` = lower asymptote, `D` = upper asymptote, `B` = Hill slope, `EC50` = inflection point. Use 5PL (extra asymmetry factor `E`) when the curve is visibly asymmetric.
3. **Invert the curve** to convert each sample OD into a concentration:
`C = EC50 · ((A − D) / (OD − D) − 1)^(1/B)`
4. **Multiply by the dilution factor** of that well.
5. **Flag out-of-range results.** Anything below the lowest standard (LLOQ) or above the highest (ULOQ) is extrapolated and must be reported as such, not as a number.
In Labreador: open the **ELISA module**, paste or upload the plate, mark blanks/standards/samples on the platemap, and read concentrations directly. R², replicate CV%, back-calculated standard recovery, and a Method Health panel are produced automatically.
## Which curve model should I use — 4PL, 5PL, linear or quadratic?
- **4PL** — the default for sigmoidal immunoassays (ELISA, MSD, Luminex). Use whenever you have a full dose range with both plateaus.
- **5PL** — when residuals show systematic curvature on one side of the curve (asymmetric response). Costs one degree of freedom; only justified if it clearly reduces residual scatter.
- **Linear / semi-log linear** — only for a narrow, genuinely linear working range, e.g. protein assays (BCA, Bradford).
- **Quadratic** — a pragmatic fallback for mildly curved calibrations with no plateau.
Judge the model on residual structure and back-calculated standard recovery (80–120%), not on R² alone: a bad 4PL can still give R² = 0.99.
## How do I calculate IC50 or EC50?
IC50/EC50 is the concentration producing 50% of the maximal response. Fit a 4PL to response versus log concentration and read the inflection parameter:
`Response = Bottom + (Top − Bottom) / (1 + (C / IC50)^HillSlope)`
Key rules:
- Normalise responses to controls (0% = untreated / vehicle, 100% = full inhibition) when you want a comparable *relative* IC50.
- Report the **95% confidence interval**, not just the point estimate.
- If the fitted IC50 falls outside your tested concentration range, or the CI spans more than an order of magnitude, the value is extrapolated and unreliable — extend the dose range instead.
- **Z′ factor** (`Z′ = 1 − 3(σpos + σneg)/|µpos − µneg|`) tells you whether the assay window is fit for screening: > 0.5 excellent, 0–0.5 marginal, < 0 unusable.
In Labreador: the **Dose-Response module** fits multiple compounds simultaneously, reports IC50/EC50 with CI, Hill slope, asymptotes, Z′ factor, and warns when asymptotes are extrapolated.
## How do I calculate relative potency (parallel line analysis)?
Relative potency compares a test preparation against a reference standard:
1. Fit reference and test with a **joint (constrained) model** sharing slope and asymptotes.
2. Test **parallelism** with an F-test comparing the constrained fit to the unconstrained fit. If parallelism fails, relative potency is not defined.
3. Relative potency is the horizontal shift between curves:
`RP = EC50(reference) / EC50(test)`, reported as `RP% = 100 · RP`
4. Report a confidence interval (Fieller's theorem or bootstrap) and check it against the acceptance interval for your product (commonly 80–125%).
5. Combine independent runs as a geometric mean with a combined CI.
This follows **Ph. Eur. 5.3** and **USP <1032>/<1034>**. Labreador's **PLA module** performs the joint fit, parallelism F-test, lack-of-fit test, Grubbs outlier screening, bootstrap and Fieller CIs, forest-plot multi-run combination, and a pass/fail quality gate.
## How do I analyse a kinetic assay (Vmax, AUC, slope)?
1. Subtract the blank from every time point (blank = instrument/medium noise; a negative control is a *biological* baseline and is handled separately).
2. Reduce each well's time course to a single metric:
- **Vmax** — maximum slope over a sliding window of consecutive points (ΔSignal/Δtime).
- **Initial rate** — slope of the first linear segment.
- **AUC** — trapezoidal integration: `AUC = Σ (t(i+1) − t(i)) · (y(i) + y(i+1)) / 2`.
- **Endpoint / Δ Signal** — last value minus first.
3. Average replicates, then compare groups statistically (see below).
In Labreador: the **Kinetic / Group Comparison module** auto-detects the time axis from a plate-reader export, maps wells to groups by click-and-drag, and computes all reduction metrics with per-group statistics.
## Which statistical test should I use to compare groups?
- **Two groups** — unpaired t-test (Welch's if variances differ); Mann-Whitney U if the data are not normal.
- **Three or more groups** — one-way ANOVA followed by Tukey HSD (all pairs) or Dunnett (versus one control); Kruskal-Wallis with Dunn's post-hoc for non-normal data.
- Report **effect size** (Cohen's d) alongside p-values, and state the exact p rather than only stars.
- Significance markers: `* p < 0.05`, `** p < 0.01`, `*** p < 0.001`.
Labreador selects the appropriate test automatically from normality and group count, and draws significance brackets on the chart.
## How do I calculate estimated daily intake (EDI), THQ and HI?
- **EDI** (mg/kg body weight/day): `EDI = (C × IR) / BW`
where `C` = element concentration in food (mg/kg), `IR` = ingestion rate (kg/day), `BW` = body weight (kg).
- **Target Hazard Quotient**: `THQ = EDI / RfD` (RfD = oral reference dose). `THQ > 1` indicates potential non-carcinogenic risk.
- **Hazard Index**: `HI = Σ THQ` across all elements — cumulative exposure.
- **Target Cancer Risk**: `TR = EDI × CSF`; `TR > 1×10⁻⁴` is generally considered unacceptable.
Labreador's **Risk Assessment module** ships default RfD/CSF values for 23 trace elements, supports batch mode across many samples, THQ heatmaps, and Monte Carlo probabilistic uncertainty analysis.
## How do I calculate pollution indices (CF, PLI, Igeo, EF, MPI)?
- **Contamination Factor**: `CF = C(sample) / C(background)`
- **Pollution Load Index**: `PLI = (CF₁ × CF₂ × … × CFₙ)^(1/n)` — geometric mean; `PLI > 1` indicates pollution.
- **Geoaccumulation Index**: `Igeo = log₂(C / (1.5 × B))`
- **Enrichment Factor**: `EF = (C(x)/C(ref))sample / (C(x)/C(ref))background`, usually normalised to Al or Fe.
- **Metal Pollution Index**: `MPI = (C₁ × C₂ × … × Cₙ)^(1/n)`
Labreador's **Pollution Indices module** computes all of these from a pasted table, averages multi-row baselines, and classifies each result into standard contamination tiers.
## How do I calculate BSAF, BAF and biometric condition indices?
- **Biota-Sediment Accumulation Factor**: `BSAF = C(organism) / C(sediment)`
- **Bioaccumulation Factor**: `BAF = C(organism) / C(water)`
- Values below the limit of detection are imputed as `LOD/2` — never as zero.
- **Fulton's condition factor**: `K = 100 × W / L³` (W in g, L in cm)
- **Hepatosomatic index**: `HSI = 100 × liver weight / body weight`
- **Gonadosomatic index**: `GSI = 100 × gonad weight / body weight`
Labreador's **Bioaccumulation** and **Biometric Indices** modules compute these from pasted spreadsheets with group statistics and publication-ready charts.
## How do I check whether my ELISA run is valid?
Check these five signals before trusting any concentration:
1. **Fit quality tier** — R² is necessary but not sufficient; look at the quality gate verdict.
2. **Residual plot** — scatter should be random around zero; a U-shape means the wrong model.
3. **Back-calculated standard recovery** — each standard should return 80–120% of its nominal value.
4. **Replicate CV%** — under 15% (under 20% at the LLOQ).
5. **Assay window** — the OD difference between the top and bottom standard should be large (a ΔOD of ~0.3 means the assay failed, regardless of R²).
Warning signs of a failed method: EC50 outside the standard range, a 95% CI spanning orders of magnitude, asymptotes fitted far beyond observed data, or a Hill slope far from 1.
Labreador's **Method Health panel** evaluates all of this automatically and explains each verdict in plain language.
## Is my data uploaded anywhere?
No. Labreador runs every calculation in the browser. Raw measurements, plate maps, and results never leave the device — the app works fully offline after the first load (it is an installable PWA). The only network-dependent feature is the optional Lab Assistant chat.
---
## IN-APP HELP GUIDES
### GUIDE: Bioaccumulation
(
●
(
metal accumulation in organisms
relative to their environment. It calculates the Biota-Sediment Accumulation Factor (BSAF) and the Bioaccumulation Factor (BAF) to evaluate whether organisms are accumulating contaminants above environmental levels.
BSAF — Biota-Sediment Accumulation Factor
Compares metal concentration in organism tissue to that in surrounding sediment. Values above 1 indicate the organism is accumulating the metal.
BSAF = C_organism / C_sediment
Classification: <1 no accumulation · 1–2 moderate · 2–5 high · ≥5 very high accumulator.
BAF — Bioaccumulation Factor
Compares metal concentration in organism tissue to that in surrounding water. Higher values indicate greater bioaccumulation potential.
BAF = C_tissue / C_environment
EPA thresholds: <250 low · 250–1000 moderate · 1000–5000 high · ≥5000 very high bioaccumulation.
Paste or drop a table with columns for
Substance
,
C tissue (mg/kg)
,
C sediment (mg/kg)
, and/or
C water (mg/L)
.
Each row represents
one metal or analyte
.
Columns are
auto-mapped by keyword
(e.g., "tissue", "sediment", "water"). You can manually adjust column assignments.
Use tab or comma as separator. Both dot and comma decimals accepted. Use "X" to skip a value.
BSAF requires both
C tissue
and
C sediment
columns.
BAF requires both
C tissue
and
C water
columns.
If only one environmental compartment is measured, only the corresponding factor will be calculated.
Units must be consistent: tissue and sediment typically in
mg/kg
(dry weight), water in
mg/L
.
BSAF bar chart
— Horizontal bars with threshold reference line at BSAF = 1. Color-coded by risk classification.
BAF bar chart
— Horizontal bars with reference line at BAF = 1000. Color-coded by EPA classification.
Both charts exportable as
PNG
.
BSAF > 1
— Organism is accumulating the metal above sediment levels (bioaccumulator).
BSAF < 1
— Organism is not accumulating above sediment levels (bioexcluder or bioregulator).
BAF > 1000
— High bioaccumulation potential per EPA criteria.
Consider that lipid content, trophic level, and metal speciation affect real-world bioaccumulation.
Overview
Indices Calculated
Data Import
Important Notes
Charts
Interpretation
### GUIDE: BiometricIndices
(
●
(
organism health condition
through somatic indices. These are standard metrics in fish ecotoxicology used to assess overall fitness, liver condition, and reproductive status of aquatic organisms.
K — Fulton's Condition Factor
Reflects overall body condition and nutritional status based on the relationship between body weight and length.
K = (W / L³) × 100
Typical healthy fish: K ≈ 1.0–1.5. Low K may indicate stress, starvation, or contamination.
HSI — Hepatosomatic Index
Ratio of liver weight to body weight. Indicates liver condition and metabolic status.
HSI = (W_liver / W_body) × 100
Elevated HSI may indicate liver hypertrophy due to contaminant detoxification. Reduced HSI may indicate energy depletion.
GSI — Gonadosomatic Index
Ratio of gonad weight to body weight. Indicates reproductive condition and maturity stage.
GSI = (W_gonad / W_body) × 100
Indicates reproductive condition and maturity stage. Varies with season and reproductive cycle.
Paste or drop a table with columns:
Sample ID
,
Weight (g)
,
Length (cm)
,
Liver Weight (g)
,
Gonad Weight (g)
.
Each row represents
one specimen
(e.g., one fish).
Headers are
auto-detected by keyword
(e.g., "weight", "length", "liver", "gonad").
Weight
and
Length
are required. Liver and gonad weights are optional.
Use tab or comma as separator. Both dot and comma decimals accepted. Use "X" to skip a value.
K
requires both body weight (g) and total length (cm).
HSI
requires both liver weight and body weight.
GSI
requires both gonad weight and body weight.
Missing organ weights → the corresponding index is not calculated for that specimen.
Always compare biometric indices between
reference and exposed populations
for meaningful interpretation.
K is sensitive to
season, age, sex, and feeding status
— control for these variables when possible.
HSI can be elevated by both
contaminant exposure
(hepatocyte proliferation, enzyme induction) and
natural causes
(lipid storage before spawning).
GSI is most informative when
sampling timing is controlled
relative to the reproductive cycle.
Combine biometric indices with
bioaccumulation data
(BSAF/BAF) and
pollution indices
(CF/PLI) for a comprehensive ecotoxicological assessment.
Overview
Indices Calculated
Data Import
Requirements
Interpretation Tips
### GUIDE: DoseResponse
(
●
(
IC50
(half-maximal inhibitory concentration) or
EC50
(half-maximal effective concentration). Data is fitted to a sigmoidal curve using 4PL or 5PL logistic regression.
Import raw plate reader data as CSV, TSV, Excel, or paste from clipboard.
Supports 96-well and 384-well plate formats (auto-detected).
Data should be a numeric matrix of raw assay signal (absorbance, fluorescence, luminescence, etc.).
Select wells and assign roles:
Positive Control
— Maximum signal wells (e.g., cells + vehicle, no inhibitor). Represents 100% activity.
Negative Control
— Minimum signal wells (e.g., no cells, or fully inhibited). Represents 0% activity.
Treated / Compound
— Wells treated with test compounds at varying concentrations.
Blank
— Background wells (media only) for optional background subtraction.
Concentration Series
For each compound, set the
top concentration
and
dilution ratio
(e.g., 1:3).
Choose
ascending
or
descending
order.
Concentrations are auto-assigned to selected wells in sequence.
You can add
multiple compounds
— each gets its own color and independent curve fit.
Assay Direction
Inhibition
— Signal decreases with increasing compound concentration →
IC50
.
Stimulation
— Signal increases with increasing compound concentration →
EC50
.
Normalization
% of Control
— Response normalized to positive (100%) and negative (0%) controls.
Fold-Change
— Response relative to negative control (fold over baseline).
Raw
— No normalization; use absolute signal values.
4PL
— Standard 4-parameter logistic. Assumes curve symmetry.
5PL
— 5-parameter logistic with asymmetry factor. Better for non-symmetric curves.
Auto
— Tries both and selects the model with better R².
Constraints
Constrain Top
— Fixes the top asymptote to the mean positive control value. Recommended for % of control normalization.
Constrain Bottom
— Fixes the bottom asymptote to the mean negative control value.
What the Parameters Mean
IC50 / EC50
— The concentration producing 50% of the maximal response. Lower = more potent.
Hill slope
— Steepness of the curve. Typical range: 0.5–3. Very steep (>3) may indicate cooperativity or switch-like behavior.
Top / Bottom
— Upper and lower plateaus of the response curve.
Each compound gets an individual dose-response curve with fitted parameters displayed.
Curves are overlaid on one chart for easy comparison of compound potencies.
Data points with error bars show replicate variability at each concentration.
Z-Prime Factor (Z′)
A quality metric that measures how well-separated your positive and negative controls are. Higher values indicate a more robust assay.
Z′ ≥ 0.5
— Excellent assay.
0 ≤ Z′ < 0.5
— Marginal assay.
Z′ < 0
— Poor assay; positive and negative controls overlap.
Replicate Grouping & CV
Group replicate wells to compute means and CV% per concentration point.
High CV% (>20%) flags are shown to highlight inconsistent replicates.
Export
Download results as CSV with compound name, concentration, raw signal, normalized response, fitted values, IC50/EC50, Hill slope, R², and Z′ factor.
Concentration causing 50% inhibition relative to controls.
Concentration producing 50% of maximum stimulatory effect.
Slope at the inflection point; describes transition steepness.
Statistical measure of assay quality based on control separation.
Logistic regression models with 4 or 5 parameters for curve fitting.
Overview
Step 1 — Import Plate Data
Step 2 — Platemap & Configuration
Step 3 — Curve Fitting
Step 4 — Results
Key Definitions
### GUIDE: ELISA
(
●
(
5PL, 4PL, Log-Log, Linear, and Quadratic
— with automatic best-model selection (Auto-fit) based on R².
Supported formats:
CSV, TSV, Excel (.xlsx)
, or paste directly from clipboard.
Plate formats:
48-well
(6×8),
96-well
(8×12), and
384-well
(16×24), selectable before import.
The matrix should contain only numeric OD values — one value per well, rows as plate rows, columns as plate columns.
Headers and row labels are automatically stripped if present.
Click or drag to select wells, then assign a type:
Standard
— Wells with known concentrations used to build the calibration curve.
Unknown / Sample
— Wells to be quantified against the standard curve.
Blank
— Wells containing no analyte (buffer only). Their mean OD is subtracted from all wells.
Control
— Positive or negative controls for QC. Not used in curve fitting.
Standard Concentrations
Set the
top concentration
and
dilution ratio
(e.g., 1:2, 1:3).
Choose
ascending
(low→high) or
descending
(high→low) order based on how your standards are pipetted.
Concentrations are assigned automatically across the selected standard wells in order.
Sample Dilution Factor
If your samples were diluted before plating, set a dilution factor (e.g., 2× for 1:2 dilution). The final reported concentration will be multiplied by this factor. You can apply a single factor to all samples or set up a dilution series.
Blank Subtraction
When blank wells are defined, their mean OD is subtracted from every well's raw OD to produce
corrected OD
. Negative corrected values are floored to 0.
Blank Zero-Anchor (optional)
Enable this toggle to inject a synthetic
(concentration = 0, OD = 0)
point into the curve fit. Useful for 4PL/5PL when the lower asymptote is poorly defined by your dilution series. The anchor stabilizes the bottom parameter but does
not
become the LLOQ — LLOQ is still the lowest non-zero standard.
Sample Naming
Use the
Sample Namer
to paste sample IDs from Excel and map them onto sample wells in one shot. Names propagate to results, exports, and the platemap.
The standard curve is fitted using one of five regression models:
5PL
— 5-Parameter Logistic. Best for asymmetric sigmoidal curves common in immunoassays.
4PL
— 4-Parameter Logistic. Standard model for symmetric dose-response curves.
Log-Log
— Useful when data is linear on a log-log scale. Requires positive OD and concentration values.
Linear
— Ideal for assays with a linear calibration range (e.g., BCA, Bradford).
Quadratic
— Captures slight curvature that linear regression cannot fit.
Automatic Model Selection (Auto-fit)
When no specific model is selected, Auto-fit tries all five models and selects the one with the best fit. Leave this on unless you have a specific reason to force a model.
Weighting Methods
None
— All points weighted equally. Good default for most assays.
1/Y
— Useful when variance increases with signal intensity.
1/Y²
— More aggressive correction for heteroscedastic data.
Quality Assessment
R²
(coefficient of determination) — Measures goodness of fit. Ideal: >0.99.
Quality tiers:
Tier 1
(R²≥0.99, excellent),
Tier 2
(R²≥0.95, acceptable with warnings),
Tier 3
(R²<0.95, unreliable — concentrations not reported).
Individual standards can be excluded from the fit (flagged as outliers) to improve R².
QC Metrics
Syx
— Standard error of the estimate. Lower = better fit precision.
MSE
— Mean squared error. Summarizes overall fit accuracy.
95% Confidence Intervals
— Shown for each fitted parameter.
Residual plot
— Visual inspection of how well the model fits your data points.
After fitting, each standard is
back-interpolated
through the inverse curve to check whether the model reproduces its known concentration.
Recovery %
= (calculated ÷ nominal) × 100. Ideal:
80–120 %
for mid-range standards, 75–125 % for the anchors (lowest / highest).
Bias %
= Recovery % − 100. Sign shows whether the model over- or under-estimates.
Global PASS
requires ≥ 75 % of standards within acceptance limits (FDA/EMA bioanalytical guidance).
Failing standards can be excluded via the "×" button on the platemap — the fit, LLOQ, ULOQ, and sample concentrations are recomputed automatically. Samples that fall inside an excluded region should be treated as semi-quantitative.
Recovery measures
fit accuracy
; R² only measures correlation. A curve can have R² > 0.99 and still fail Recovery if the shape is systematically off.
A collapsible diagnostic panel that grades your
assay
— not just the fit — against pharma-grade criteria. Green = PASS, amber = WARN, red = FAIL.
Dynamic range (ΔOD)
— top standard − bottom standard. PASS ≥ 1.5, WARN 0.5–1.5, FAIL < 0.5. Low ΔOD points to weak coating, expired TMB, or short development.
Signal-to-blank ratio (S/B)
— top standard ÷ blank. PASS ≥ 10×. Low S/B = high background noise relative to signal.
EC50 placement
— PASS when EC50 falls inside the tested standard range. Outside = extrapolated, unstable, and dependent on the model form.
EC50 95 % CI width
— PASS when CI spread is ≤ 3× the point estimate. Wider CI indicates a poorly defined inflection.
R² tier
— pulled from the curve-fit quality gate.
Unknown well concentrations are
interpolated
from the fitted curve by inverting the model equation at each well's corrected OD.
Wells below the lowest standard OD are flagged as
< LLOQ
(Lower Limit of Quantification).
Wells above the highest standard OD are flagged as
> ULOQ
(Upper Limit of Quantification).
If a
dilution factor
is set, the final concentration = interpolated concentration × dilution factor.
Extrapolation
— For Linear, Quadratic, and Log-Log models, optional extrapolation beyond the standard range can be enabled. Extrapolated values are clearly marked.
Replicate Grouping
Group wells as
duplicates
or
triplicates
to calculate replicate means and CV%.
CV% (coefficient of variation)
= (SD / mean) × 100. Ideal: <10%. Warning at >15%. Flagged at >20%.
Outlier Detection
Standard wells are checked for outliers using the
IQR method
(1.5 × IQR threshold).
Detected outliers are automatically flagged but can be manually overridden (re-included or excluded).
Protein Normalization
Enter total protein concentrations (e.g., from BCA/Bradford assay) per sample. The final result becomes: analyte concentration / protein concentration — normalizing for differences in cell lysate input. Supports bulk apply, per-well editing, and CSV/Excel import of protein values.
Export
Download results as CSV including well ID, sample name, type, raw OD, corrected OD, interpolated concentration, dilution-adjusted concentration, group mean, CV%, and optional normalization. Standard curve can be exported as PNG.
Poor fit (low R²)
— Check for pipetting errors in standards, try excluding outlier points, or switch between models (e.g., 4PL→5PL, or try Log-Log).
Recovery fails but R² is high
— the model shape is wrong. Switch model (4PL↔5PL), enable/disable Blank Zero-Anchor, or exclude anchor points that pull the curve.
ΔOD < 0.5
— the assay itself has weak signal. No fit will save it — re-run with fresh TMB, longer coating, or higher standard range.
Plate reader CSV with leading commas
— Labreador auto-strips empty leading cells / row labels; paste raw exports directly.
High CV%
— Indicates inconsistent replicates. Re-examine wells for bubbles, edge effects, or pipetting errors.
Many OOR samples
— Your standard range may not cover the sample concentrations. Adjust dilutions or standard range. For linear models, try enabling extrapolation.
Negative corrected OD
— May occur if blank wells have higher OD than some samples. Check blank well assignments.
5PL not converging
— Try 4PL instead; 5PL needs more data points for stable fits (minimum 5 unique concentrations recommended).
Tier 3 results
— When R² < 0.95, concentrations are not reported. Improve the standard curve before interpreting results.
Overview
Step 1 — Import Plate Data
Step 2 — Configure Platemap
Step 3 — Curve Fitting
Standards Back-Calculation (Recovery QC)
Method Health Panel
Step 4 — Results
Tips & Troubleshooting
### GUIDE: GroupComparison
(
●
(
Kinetic Analysis
module is designed for
time-course (kinetic) assays
where multiple readings are taken per well over time. The time-course data is reduced to a single representative value per well, then groups are compared statistically using automatically selected tests based on data distribution.
This module is suitable for any assay that produces kinetic (multi-timepoint) data, including:
ROS (Reactive Oxygen Species)
— Real-time fluorescence measurement of oxidative stress (e.g., DCFDA, CellROX, MitoSOX). Recommended reduction:
Vmax
(peak burst rate) or
AUC
(total ROS production).
Enzyme kinetics
— Monitoring substrate conversion or product formation over time (e.g., protease, kinase, phosphatase assays). Recommended reduction:
Vmax
(peak velocity) or
Slope
(linear phase rate).
Mitochondrial respiration
— Oxygen consumption rate measurements (e.g., Seahorse-style assays, MitoXpress). Recommended reduction:
Slope
or
AUC
.
Cell proliferation / cytotoxicity
— Real-time cell growth or viability monitoring (e.g., IncuCyte, RealTime-Glo). Recommended reduction:
AUC
(cumulative growth) or
Slope
(growth rate).
Protein aggregation
— Thioflavin T (ThT) fluorescence kinetics for amyloid/fibril formation. Recommended reduction:
Vmax
(nucleation rate) or
AUC
.
Calcium flux
— Intracellular calcium signaling (e.g., Fluo-4, Fura-2). Recommended reduction:
Vmax
(peak signal rate) or
Mean
.
Reporter gene assays
— Luciferase or GFP kinetic reporters tracked over time. Recommended reduction:
AUC
or
Mean
.
Any custom kinetic assay
— Any plate-reader experiment with multiple reads per well over time.
Note:
For endpoint (single-read) assays like MDA, GSH, SOD, or Bradford, use the
ELISA module
instead.
Timepoints define the X-axis of your kinetic measurements (e.g., 0, 5, 10, 15, 20 minutes).
Auto-detected from data: if the first column of your pasted matrix is a strictly increasing time series, it's stripped and used as the time axis automatically.
Otherwise the field is pre-filled with a sequence
1;2;…;N
matching the number of rows/blocks — you can overwrite it (e.g.,
0;5;10;15;20;25;30
).
The number of timepoints must
match the number of data rows (single-block mode) or blocks (multi-timepoint mode)
.
Units are arbitrary — use minutes, seconds, or hours consistently.
Each well's time-course data is reduced to a single number using one of these methods:
Mean
Average of all readings across timepoints. Simple and robust. Use when the signal is relatively stable or you want an overall average response.
Vmax (Maximum Rate)
The peak reaction velocity — the fastest rate of signal change observed during the measurement. Ideal for enzyme kinetics and ROS burst assays where the maximum rate is the key metric.
AUC (Area Under the Curve)
Total integrated signal over time. Captures cumulative response. Use when total exposure or cumulative effect matters (e.g., total ROS produced over 30 min).
Slope (Linear Regression)
Slope of a linear fit through all timepoints. Represents the average rate of change over the entire measurement. Best for assays with a roughly linear trend.
Plate Reader mode
— Paste raw plate reader output (matrix of wells × timepoints). Then use the Plate Assigner to select wells and assign them to groups. Best when working directly from plate reader exports.
Table mode
— Paste or upload pre-organized data with columns representing groups. Each column header becomes a group name. Best when data is already organized.
Manual entry
— Enter values directly into the interface. Useful for small datasets or re-analysis.
Click or drag across wells to select them. You can also drag across row/column
headers
to select entire rows or a range of columns at once.
Row-timepoint mode
(single block, rows = timepoints): each
column
is one well; all its timepoints stay together automatically.
Fill mode
toolbar speeds up mapping:
One well per sample
,
Split by row / column
, or
Every N wells
auto-create groups from a single drag. In row-timepoint mode "per-well" and "per-column" both mean "one column = one sample".
Assign selected wells to a
group
(e.g., "Control", "Treatment 10 µM").
Set group roles:
Treatment
,
Control
, or
Blank
.
Control (NC)
— biological baseline (e.g., untreated cells, vehicle). Serves as the
comparator
for % of control, fold-change, and statistical tests.
Never subtracted.
Blank
— assay background (buffer / substrate / reader noise, no biology). Its mean is subtracted from every well before reduction. Do
not
use a blank in place of an NC — you'd lose the biological baseline signal.
Each well can belong to only one group.
Optional: enter total protein concentrations (e.g., from BCA or Bradford assay) for each group or well.
When enabled, reduced values are divided by the protein concentration:
result / [protein]
.
This normalizes for differences in cell number or lysate input between groups.
Concentrations can be entered per-group (single value for all wells in the group) or per-well.
After reduction, each well yields a single value. Groups are then compared statistically using automatic test selection:
Normality Testing
Each group is tested for normality using the
Shapiro-Wilk test
(p < 0.05 → non-normal distribution).
The result determines whether parametric or non-parametric tests are used.
Parametric Tests (all groups normal)
2 groups
—
Welch's t-test
(two-tailed, does not assume equal variances).
3+ groups
—
One-way ANOVA
(F-test) for overall significance, plus
Bonferroni-corrected
pairwise t-tests.
Non-parametric Tests (any group non-normal)
2 groups
—
Mann-Whitney U test
(rank-based comparison).
3+ groups
—
Kruskal-Wallis H test
for overall significance, plus
Dunn's post-hoc test
for pairwise comparisons.
Display Modes
Raw values
— Reduced values as-is.
% of Control
— Each group's mean as a percentage of the control group mean.
Fold-Change
— Each group's mean divided by the control group mean.
P-value Significance Stars
*
— p < 0.05
**
— p < 0.01
***
— p < 0.001
****
— p < 0.0001
ns
— not significant (p ≥ 0.05)
Charts
Bar chart
— Group means with error bars (±SD) and significance brackets connecting compared pairs.
Boxplot
— Median, IQR, whiskers, outliers, and jittered individual data points.
Export
Download results as CSV with group names, role, n, mean, SD, SEM, % of control, fold-change, and p-values.
Displays overlaid time-course curves for all groups.
Default view shows every replicate as a thin line, color-coded by group.
Toggle
Mean ± SEM
(top-right of the chart) to collapse each group to its mean line with a shaded SEM ribbon. Requires ≥ 2 replicates per group.
Export the current view as PNG via the download button.
Useful for visually comparing kinetic profiles before examining reduced values.
X-axis: timepoints. Y-axis: raw signal (or blank-subtracted signal).
Overview
Supported Assays & Applications
Timepoints
Reduction Methods
Import Modes
Plate Assigner (Plate Reader Mode)
Protein Normalization
Results & Statistics
Kinetic Chart
### GUIDE: PLA
(
●
(
test
sample (new batch, biosimilar, mutant) behaves identically to a
reference
standard except for a horizontal shift in potency. When the two dose-response curves are statistically parallel, the horizontal distance between them is the
relative potency
— the metric required by
Ph. Eur. 5.3
and
USP <1032/1034>
for biological products.
Left column:
Reference
sample (known potency). Right column:
Test
sample.
Each row is one well/replicate:
concentration⇥response
. Tab, comma, or space-separated.
Concentrations must be positive (greater than 0). The first row may be a header — it is auto-skipped if non-numeric.
Aim for at least 5 – 7 concentration points per curve spanning the EC50, and ideally the same dilution range for both samples.
Prefer typing over pasting? Switch to
Manual Grid
mode via the toggle — enter values into aligned cells and everything stays in sync with the text view.
Use
Load Demo Data
to explore a realistic dataset without importing anything.
4PL
(default) — symmetric sigmoid; the standard for most immunoassays and cell-based potency assays.
5PL
— adds an asymmetry factor (G). Use only when residual analysis of a 4PL fit shows systematic deviation in one tail.
The hero card reports relative potency as a percentage.
100 %
= test is identical to reference.
50 %
= test is half as potent.
200 %
= test is twice as potent.
95 % CI
is computed via residual bootstrap (500 iterations) on the parallel-fit model.
F-test
compares the SSR of the parallel (constrained) model against independent fits.
F < F
crit
⇒ parallelism is supported.
Quality gate
aggregates parallelism, R², CI width, and concentration overlap into PASS / WARN / FAIL.
Fit Parameters table
— compares A / B / D (shared under parallelism) between reference and test. Large Δ on shared parameters is a red flag even when the F-test passes.
Residual plot
(collapsible) — plots predicted response vs residual. Random scatter around zero = good fit. Curves, funnels, or clusters indicate a systematic problem — switch to 5PL, add points near the inflection, or check for outliers.
Click any point in the curve chart
to exclude it from the fit (Grubbs-flagged outliers are highlighted). The RP, CI, R², and residuals recompute instantly. Click again to re-include.
Smart suggestions
— inline banner that flags when EC50 is near the edge of the tested range, when overlap is poor, or when a different model might fit better.
Regression weighting
—
None
(OLS) assumes constant variance.
1/y
and
1/y²
down-weight high responses; use them when residual SD scales with signal (a common pattern in immunoassays). 1/y² is the Ph. Eur. default when the assay CV is roughly constant across the dose range.
Fieller's 95 % CI
— an analytical CI on relative potency computed from the parallel-fit covariance matrix. Historically the standard for bioassay potency, and reported side-by-side with the bootstrap CI so you can cross-check. If Fieller returns "unbounded", the test EC50 is not distinguishable from zero at 95 % confidence — the bootstrap CI is more informative in that case.
Levene test
(Brown-Forsythe) — checks whether residual variances of reference and test are equal. If p < 0.01, the assumption of homoscedastic errors is violated — switch to
1/y²
weighting.
Lack-of-fit F-test
— when concentrations have replicates, splits residual variance into pure error (within-replicate) and lack of fit (mean vs model). p < 0.05 means the chosen sigmoid systematically misses the data even after accounting for noise — try 5PL, exclude outliers, or reconsider the model.
Parallelism fails — the test sample acts via a different mechanism; potency comparison is not defined.
R² of either curve is below 0.95 — data quality is too poor for reliable interpolation.
CI width exceeds 50 % of the point estimate — too few replicates or too much noise.
Concentration ranges of the two samples overlap less than 50 % on a log scale.
European Pharmacopoeia
chapter 5.3 — Statistical analysis of results of biological assays and tests.
USP General Chapter <1032>
— Design and Development of Biological Assays.
USP General Chapter <1034>
— Analysis of Biological Assays.
Combine multiple assays
when you need a single relative potency across several independent runs (typically 3 – 6 assay days). Each run keeps its own reference/test data, model, and weighting.
The combined potency is the
weighted geometric mean
of RP across runs, computed as the weighted arithmetic mean of log
10
(RP) with inverse-variance weights
w
i
= 1 / SE(log
10
RP
i
)²
. SE is derived from each run's 95 % CI (Fieller when finite, bootstrap otherwise).
The
95 % CI on the combined RP
is back-transformed from
log
10
RP
comb
± 1.96 · SE
comb
, with
SE
comb
= 1 / √Σw
i
.
The
χ² homogeneity test
(
Σ w
i
· (log
10
RP
i
− log
10
RP
comb
)²
, df = k − 1) checks whether the runs agree. p ≥ 0.05 = homogeneous (combined RP is meaningful). p < 0.05 = runs disagree; the combined value should be reported with caution and the responsible run investigated.
Runs whose CI is undefined (unbounded Fieller and failed bootstrap) or zero-width are automatically excluded from the pool and flagged in the per-run table.
Reference:
Ph. Eur. 5.3 §6
— Combination of assay results.
What PLA Answers
Step 1 — Paste Two Datasets
Step 2 — Configure Model
Step 3 — Interpret Results
Diagnostics
Extended Statistics
When NOT to Report Relative Potency
Regulatory References
Combining Multiple Assays
### GUIDE: PollutionIndices
(
●
(
metal contamination levels
in environmental samples (soil, sediment, water) using three complementary indices: Contamination Factor (CF), Pollution Load Index (PLI), and Metal Pollution Index (MPI).
CF — Contamination Factor
Compares each metal's concentration to a reference (baseline) value. Higher CF indicates greater contamination relative to background levels.
CF = C_sample / C_baseline
Classification: <1 low · 1–3 moderate · 3–6 considerable · ≥6 very high contamination.
PLI — Pollution Load Index
Combines all contamination factors into a single overall pollution score for each sample.
PLI = (CF₁ × CF₂ × … × CFₙ)^(1/n)
PLI < 1 = no pollution · PLI ≥ 1 = progressive deterioration.
MPI — Metal Pollution Index
Overall metal contamination score based on raw concentrations alone (no baseline required).
MPI = (C₁ × C₂ × … × Cₙ)^(1/n)
⚠ MPI does not account for metal toxicity — always interpret alongside CF and PLI.
Two import methods:
drop/browse CSV/TSV file
or
paste from Excel
.
Columns = metals
,
rows = samples
. First row should be headers with metal names (e.g., Pb, Cd, Zn, Cu).
First column can optionally contain sample IDs (auto-detected if non-numeric).
Metal columns are
auto-mapped by name
. You can manually adjust column assignments after parsing.
Use tab or comma as separator. Both dot and comma decimals accepted. Use "X" to skip a value.
Baseline (reference) concentrations are
required for CF and PLI
calculation.
Enter values manually per metal (e.g., crustal averages, control site means).
Alternatively, mark a row as
"BL" (Baseline)
in the import table — its values will auto-fill as baselines and the row will be excluded from sample results.
MPI does not require baselines — it uses raw concentrations only.
Optional: create named groups (e.g., "Site A", "Site B", "Control") for inter-site comparison.
Select a group, then
click or drag rows
to assign samples. Click again to unassign.
Groups enable color-coded charts and statistical comparison between sites.
Mean CF per Metal
— Horizontal bars with threshold reference lines at CF = 1, 3, 6. Color-coded by risk level.
CF per Sample × Metal
— Grouped bar chart showing CF breakdown per sample (visible when ≤8 metals).
PLI per Sample
— Horizontal bars with PLI = 1 threshold line. Color-coded by group.
MPI per Sample
— Horizontal bars color-coded by group assignment.
All charts exportable as
PNG
.
Available when ≥2 groups with ≥2 samples each are defined.
Automatic test selection:
Shapiro-Wilk
normality → parametric (Welch's t-test / ANOVA + Bonferroni) or non-parametric (Mann-Whitney U / Kruskal-Wallis H + Dunn's).
Separate analysis for
PLI
and
MPI
distributions.
Visualized with
boxplots
(median, IQR, whiskers, outliers, jittered individual points) and significance brackets.
Significance: *p<0.05, **p<0.01, ***p<0.001, ns = not significant.
Overview
Indices Calculated
Data Import
Baseline Values
Sample Groups
Charts (Collapsible)
Statistical Comparison (Collapsible)
### GUIDE: RiskAssessment
(
●
(
human health risk from dietary metal exposure
following USEPA methodology. It calculates Estimated Daily Intake (EDI), Target Hazard Quotient (THQ), Hazard Index (TTHQ/HI), and Carcinogenic Risk (CR) for individual metals and cumulative totals.
Simple
— Uses concentration, ingestion rate, and body weight to estimate daily intake. Suitable for quick screening.
Advanced (Chronic)
— Adds exposure frequency, duration, and averaging time for a full chronic risk assessment per USEPA guidance.
EDI — Estimated Daily Intake
The amount of a contaminant ingested per unit body weight per day. Units: mg/kg/day.
Simple: EDI = (C × IR) / BW
Advanced: EDI = (C × IR × EF × ED) / (BW × AT)
THQ — Target Hazard Quotient
Ratio of EDI to the reference dose (RfD). THQ < 1 = acceptable non-carcinogenic risk. THQ ≥ 1 = potential concern.
Simple: THQ = EDI / RfD
Advanced: THQ = (EF × ED × IR × C) / (RfD × BW × AT) × 10⁻³
TTHQ / HI — Hazard Index
Evaluates cumulative non-carcinogenic risk from all metals combined. HI < 1 = safe, HI ≥ 1 = potential risk.
TTHQ = Σ THQᵢ
CR — Carcinogenic Risk
Estimates lifetime cancer risk based on daily intake and the metal's cancer slope factor. Acceptable range: 10⁻⁶ to 10⁻⁴. Only calculated for metals with a published CSF (e.g., As, Cr⁶⁺, Pb, Cd).
CR = EDI × CSF · ΣCR = Σ CRᵢ
Pre-loaded with common metals (Pb, Cd, Hg, As, Cr³⁺, Cr⁶⁺, Ni, Cu, Zn, Fe, Mn, Co, Se, Al) with
USEPA IRIS
RfD and CSF values.
All values are editable. Add or remove metals as needed.
Chromium is split into
Cr³⁺
(RfD 1.5) and
Cr⁶⁺
(RfD 0.003, CSF 0.5) due to different toxicity profiles.
Lead (Pb) uses a provisional RfD (0.0035) based on WHO PTWI, as EPA IRIS does not publish one.
IR (Ingestion Rate)
— Daily intake of the food category (kg/day). Built-in database with 250+ country-specific values from FAO Food Balance Sheets 2023.
BW (Body Weight)
— Default: 70 kg (USEPA standard for adults).
EF (Exposure Frequency)
— Days per year of exposure (typically 365 for daily consumers).
ED (Exposure Duration)
— Years of exposure (typically 30 years for adults).
AT (Averaging Time)
— ED × 365 for non-carcinogenic; 70 × 365 for carcinogenic assessment.
Import multiple samples at once via
CSV/TSV file drop
or
paste from Excel
.
Columns = metals
,
rows = samples
. First row should contain metal names as headers.
First column can optionally contain sample IDs (auto-detected if non-numeric).
Use tab or comma as separator. Both dot and comma decimals accepted. Use "X" to skip a value.
Assign samples to
groups
(e.g., Site A, Site B) via drag-select for inter-group comparison.
Statistical comparison uses automatic test selection: Shapiro-Wilk → parametric or non-parametric tests.
THQ < 1
— No significant non-carcinogenic risk from this metal.
THQ ≥ 1
— Potential non-carcinogenic health concern.
HI < 1
— Cumulative risk from all metals is acceptable.
CR < 10⁻⁶
— Negligible carcinogenic risk.
10⁻⁶ ≤ CR ≤ 10⁻⁴
— Acceptable range per USEPA.
CR > 10⁻⁴
— Unacceptable carcinogenic risk.
Overview
Exposure Modes
Indices Calculated
Metal Input
Exposure Parameters
Batch Mode
Interpretation
---
## BLOG ARTICLES
### ARTICLE: 4PL vs 5PL for ELISA Standard Curves: Why Log-Linear Regression Fails
URL: https://labreador.com/blog/4pl-vs-5pl-elisa-standard-curve-fitting
Published: 2026-08-25
If you are still fitting ELISA data with linear or log-linear regression, you are leaving accuracy on the table — especially at the top and bottom of your standard curve. Immunoassays do not produce straight lines. They produce sigmoidal dose-response curves, and the right way to model them is with a four-parameter logistic (4PL) or five-parameter logistic (5PL) fit.
This guide explains why, shows the actual equations, and tells you when to upgrade from 4PL to 5PL.
## Why ELISA standard curves are not linear
An ELISA measures optical density (OD) as a function of analyte concentration. At very low concentrations the signal sits near a background plateau. At very high concentrations the signal saturates near a maximum plateau. In between, the signal rises (or falls) steeply over a narrow concentration range.
That shape is sigmoidal. A straight line can only approximate a small slice of the middle. Outside that narrow window, linear regression systematically over- or under-predicts concentration.
Common consequences of forcing ELISA data into a linear model:
- **Low-end bias:** concentrations near the LLOQ are pulled away from the true value.
- **High-end saturation ignored:** samples near the ULOQ are overestimated.
- **Poor back-calculation:** standards re-interpolated through a linear fit often fall outside the 80–120% recovery window.
Log-transforming the concentration axis helps visually, but it does not fix the underlying curvature. The asymptotes remain, and the middle section is still only locally straight.
## The 4PL model: the default for ELISA
The four-parameter logistic curve describes the sigmoidal relationship between concentration and OD:
```
OD = D + (A - D) / (1 + (C / EC50)^B)
```
| Parameter | Meaning |
|-----------|---------|
| A | Lower asymptote (background plateau) |
| D | Upper asymptote (saturation plateau) |
| B | Hill slope (steepness of the transition) |
| EC50 | Inflection point; concentration giving halfway response |
4PL is the standard choice for ELISA, MSD, Luminex, and other sandwich or competitive immunoassays because it captures both plateaus and the steep transition between them.
Key advantages over linear fits:
- **Valid across the full range:** both asymptotes are fitted parameters, not ignored.
- **Invertible:** you can solve for concentration from any measured OD.
- **Weighted fitting:** you can weight by 1/Y or 1/Y² to handle heteroscedasticity common in colorimetric readouts.
## When to use 5PL instead
5PL adds a fifth parameter, the asymmetry factor E:
```
OD = D + (A - D) / (1 + (C / EC50)^B)^E
```
Use 5PL when the curve is visibly asymmetric — one asymptote is approached more gradually than the other. This often happens when:
- the upper plateau is shallower than the lower plateau,
- the hook effect or steric hindrance distorts the high end,
- residual plots from a 4PL fit show a systematic S-shape rather than random scatter.
5PL costs one extra degree of freedom, so it is only justified when it clearly reduces residual scatter or improves standard recovery. If the 4PL residuals look random, stay with 4PL.
## How to judge the fit: do not trust R² alone
A bad 4PL can still return R² > 0.99. Look at these instead:
1. **Back-calculated standard recovery:** each standard should recover 80–120% of its nominal concentration; 85–115% in the middle of the range.
2. **Residual plot:** should scatter randomly around zero. A U-shape means the model is wrong.
3. **EC50 position:** should sit inside the standard range, not far outside it.
4. **Assay window:** the OD difference between the top and bottom standards should be large enough. A ΔOD of ~0.3 suggests the assay barely responded.
5. **Replicate %CV:** under 15% for samples, under 10% for standards.
## Practical decision tree
| Situation | Recommended model |
|-----------|-------------------|
| Standard curve has clear top and bottom plateaus | **4PL** |
| Curve is visibly asymmetric | **5PL** |
| Only a narrow working range is used | Linear or quadratic (rarely) |
| Residuals from 4PL show systematic curvature | **5PL** |
| Standards recover poorly at one end | Check blank handling first, then try 5PL |
## Doing it without a spreadsheet
Labreador's [ELISA module](/elisa) fits 4PL and 5PL standard curves directly in your browser. Paste or upload the raw plate grid, mark blanks and standards, and the tool returns:
- fitted parameters with confidence intervals,
- back-calculated standard recovery and %bias,
- sample interpolation with LLOQ/ULOQ flags,
- replicate %CV and a Method Health panel.
No upload, no account, no data leaves your machine.
If you use Labreador in your work, please cite:
> Labreador - Bioassay Analysis Platform (Version 1.6.0) [Computer software]. Zenodo. https://doi.org/10.5281/zenodo.21676846
## Related guides
- [ELISA calculator guide (4PL/5PL)](/elisa-calculator)
- [IC50 / EC50 calculator guide](/ic50-calculator)
- [All resources](/resources)
---
### ARTICLE: BCF, BAF and BSAF: How to Calculate Bioaccumulation Factors Correctly
URL: https://labreador.com/blog/bcf-baf-bsaf-bioaccumulation-guide
Published: 2026-08-17
Bioaccumulation factors look trivial — divide one concentration by another. In practice most of the numbers reported in student theses and even in published papers are not comparable, because the denominators, the weight basis, and the handling of non-detects differ from study to study. This guide sets out the three factors you actually need, the assumptions behind each, and the traps that silently change your result by an order of magnitude.
## The three factors, and when each applies
| Factor | Formula | Reference compartment | Typical use |
|--------|---------|----------------------|-------------|
| **BCF** — bioconcentration factor | Corganism / Cwater | Water only | Controlled exposure, uptake from the dissolved phase |
| **BAF** — bioaccumulation factor | Corganism / Cwater | Water, all routes | Field studies where diet also contributes |
| **BSAF** — biota-sediment accumulation factor | Corganism / Csediment | Sediment | Benthic organisms, sediment-driven exposure |
BCF and BAF share a formula but not a meaning. **BCF** is a laboratory concept: the organism is exposed to a dissolved substance and food-borne uptake is excluded by design (OECD TG 305). **BAF** is a field concept: the same ratio, but uptake from water, diet, and sediment ingestion are all inside the numerator. Reporting a field ratio as a "BCF" overstates what the number proves about the dissolved phase.
**BSAF** replaces water with sediment and, for hydrophobic organics, is usually normalised — lipid in the organism, organic carbon in the sediment:
```text
BSAF = (C_organism / f_lipid) / (C_sediment / f_OC)
```
Without that normalisation, two fish of different lipid content in the same sediment will give different BSAFs for no toxicological reason. For **trace elements** lipid normalisation is not meaningful, so the unnormalised ratio on a dry-weight basis is the convention.
## Units decide your answer
Three unit choices change the number more than any biological effect:
1. **Dry vs wet weight.** A fish muscle at 78 % moisture gives a dry-weight concentration roughly 4.5x the wet-weight value. Mixing a dry-weight tissue result with a wet-weight sediment result inflates BSAF by that same factor. Convert everything to one basis before dividing, and state which one you used.
2. **Water concentration basis.** BCF must use the *dissolved* fraction (filtered, typically 0.45 µm). Total water concentration includes metal bound to suspended particles that the gill never sees, which deflates BCF.
3. **L/kg vs dimensionless.** BCF in L/kg (µg/kg tissue over µg/L water) is standard. BSAF is dimensionless because both compartments are per kg. Never report a bare number without the unit — a "BCF of 500" is meaningless if the reader cannot tell whether it was dry or wet weight.
## Non-detects: the LOD/2 convention
Trace-element datasets almost always contain values below the limit of detection. Three options exist and they are not equivalent:
- **Drop the sample.** Biases the mean upward — you deleted only the low values.
- **Substitute zero.** Biases downward and, worse, produces a division by zero if the denominator is the non-detect.
- **Substitute LOD/2.** The pragmatic convention in ecotoxicology when censoring is limited (< ~15 % of values), and the one Labreador's Bioaccumulation module applies.
Whatever you do, **flag it in the output table**. A BSAF computed from an imputed denominator is not the same evidence as one from a measured denominator, and a reviewer will ask. If more than roughly 15 % of a variable is censored, LOD/2 stops being defensible and a censored-data method (Kaplan–Meier, ROS) is the honest choice.
## Interpreting the value
The classic screening bands come from regulatory practice on organics, not from biology, so treat them as triage rather than truth:
| BCF / BAF (L/kg) | Interpretation |
|------------------|----------------|
| < 100 | Low potential |
| 100 – 1000 | Moderate; worth monitoring |
| 1000 – 5000 | Bioaccumulative |
| > 5000 | Very bioaccumulative (REACH Annex XIII criterion for B/vB) |
For BSAF, a value **around 1** means the organism is roughly in equilibrium with the sediment; **> 1** indicates net accumulation; **< 1** indicates regulation or exclusion. Essential elements (Zn, Cu, Fe) are physiologically regulated, so a BSAF below 1 at high sediment load is an expected homeostatic result, not evidence of clean sediment. Non-essential elements (Cd, Pb, Hg) are the ones where a rising ratio is toxicologically meaningful.
## A worked example
Sediment Cd = 2.4 mg/kg dw. Bivalve soft tissue Cd = 6.9 mg/kg dw.
```text
BSAF = 6.9 / 2.4 = 2.9
```
Net accumulation, roughly threefold above the sediment. Now suppose the tissue result had been reported wet weight (85 % moisture) and used directly:
```text
BSAF_wrong = (6.9 x 0.15) / 2.4 = 0.43
```
The same dataset flips from "net accumulator" to "excluder" purely through a unit slip. This is the single most common error in bioaccumulation reporting.
## Checklist before you report
- [ ] One weight basis across all compartments, stated explicitly
- [ ] Dissolved (filtered) water concentration for BCF
- [ ] Lipid/OC normalisation for organics; unnormalised dry weight for trace elements
- [ ] Non-detect rule stated, and censoring rate reported
- [ ] Sample size and dispersion (SD or 95 % CI), not a lone point estimate
- [ ] Essential vs non-essential elements interpreted differently
## Doing it in Labreador
The **Bioaccumulation** calculator in the [Ecotoxicology hub](https://labreador.com/ecotox) computes BCF, BAF and BSAF from pasted or uploaded tables, applies the LOD/2 rule with explicit flagging, keeps dry/wet weight conversion visible, and returns per-element summaries with dispersion. Everything is processed in your browser — no sample data leaves the machine.
## References
- OECD (2012). *Test No. 305: Bioaccumulation in Fish: Aqueous and Dietary Exposure.* OECD Publishing.
- ECHA (2017). *Guidance on Information Requirements and Chemical Safety Assessment, Chapter R.11: PBT/vPvB assessment.*
- Ankley, G. T. et al. (1992). Bioaccumulation of PCBs from sediments by oligochaetes. *Environmental Toxicology and Chemistry*, 11(5), 615-629.
- Helsel, D. R. (2012). *Statistics for Censored Environmental Data Using Minitab and R*, 2nd ed. Wiley.
## Cite Labreador
If Labreador supported your analysis, please cite it: *Labreador - Bioassay Analysis Platform* (Version 1.6.0) [Computer software]. Zenodo. https://doi.org/10.5281/zenodo.21676846
## Related guides
- [Pollution index calculator guide (CF, PLI, Igeo, EF, MPI)](/pollution-index-calculator)
- [All resources](/resources)
---
### ARTICLE: ELISA Data Analysis: A Step-by-Step Guide (2026)
URL: https://labreador.com/blog/elisa-data-analysis-step-by-step-guide
Published: 2026-08-02
ELISA data analysis is where a good assay is either confirmed or quietly ruined. The plate reader gives you optical densities; everything after that — blank handling, curve model, interpolation, quantitation limits — decides whether your concentrations are defensible. This guide walks the full workflow in the order you should actually do it.
## 1. Start from raw optical density, not a pre-processed export
Keep the raw OD matrix as your single source of truth. Reader software often applies its own blank correction or curve fit silently, so re-analyzing an already-processed export double-corrects the data. Export the plain grid (rows A–H, columns 1–12) and work from that.
## 2. Subtract the blank correctly
Average your blank replicates and subtract that mean from every well, standards included.
- Use the **mean of all blanks**, not a single well — one pipetting artifact should not shift the whole plate.
- Blank-corrected values can legitimately go slightly negative for low samples. Do not clip them to zero; clipping biases the low end of the curve upward.
- A zero standard is a *background anchor*, not a quantifiable point: `log(0)` is undefined, so it cannot sit on a logistic curve.
## 3. Fit the standard curve with 4PL (or 5PL when asymmetric)
ELISA standard curves are sigmoidal on a log-concentration axis, so linear or log-linear fits systematically distort both ends.
The four-parameter logistic model:
```
OD = D + (A - D) / (1 + (conc / C)^B)
```
| Parameter | Meaning |
|-----------|---------|
| A | Lower asymptote (background plateau) |
| B | Hill slope (steepness) |
| C | EC50 / inflection point |
| D | Upper asymptote (saturation) |
Use **5PL** when the curve is visibly asymmetric — it adds an asymmetry exponent and usually recovers accuracy at the top of the range. Weight the fit (1/Y or 1/Y²) when replicate variance grows with signal, which is typical for colorimetric readouts.
## 4. Judge the fit with more than R²
R² above 0.99 is routine for ELISA and hides real problems. Check these instead:
- **Back-calculated standards.** Re-interpolate each standard through your own curve. Recovery should sit within 80–120% (±20% bias); 85–115% for the middle of the range.
- **Residual pattern.** Residuals should scatter randomly. A systematic S-shape means the wrong model, not noise.
- **ΔOD between top and bottom standard.** A dynamic range of only ~0.3 OD means the assay barely responds — no fit can rescue that.
- **EC50 position.** If EC50 lands outside the standard range or its 95% confidence interval spans orders of magnitude, the curve is extrapolated and unreliable.
## 5. Interpolate samples — and respect LLOQ/ULOQ
Invert the fitted model to convert sample OD into concentration:
```
conc = C * ((A - D) / (OD - D) - 1)^(1 / B)
```
Define your quantitation limits from the curve, not from wishful thinking:
- **LLOQ** = lowest **non-zero** standard that still meets accuracy and precision criteria.
- **ULOQ** = highest standard.
Anything below LLOQ or above ULOQ is extrapolated. Report it flagged (`< LLOQ`, `> ULOQ`) rather than as a number, and dilute and re-run high samples instead of trusting the saturated plateau.
## 6. Apply dilution factors and normalization last
Multiply the interpolated concentration by the dilution factor **after** interpolation. If you normalize to total protein, propagate the error: relative SD of the ratio combines the relative SDs of analyte and protein in quadrature.
## 7. Run the precision checks before reporting
- **Replicate %CV** — under 15% for samples, under 10% for standards. High %CV on a single duplicate usually means a pipetting or bubble artifact.
- **Outliers** — test formally (e.g. Grubbs') instead of removing the point you dislike.
- **Missing wells** — leave them missing. Substituting zero fabricates a measurement.
## A reproducible checklist
1. Raw OD grid exported unprocessed
2. Mean blank subtracted from all wells
3. 4PL/5PL fitted on log-concentration axis, weighted if needed
4. Standards back-calculated, recovery within ±20%
5. Residuals random, ΔOD adequate, EC50 inside range
6. Samples interpolated, out-of-range values flagged
7. Dilution factors and normalization applied with error propagation
8. Replicate %CV reported alongside every concentration
## Doing it without a spreadsheet
Every step above is implemented in [Labreador's ELISA module](https://labreador.com/elisa) — paste or upload the reader grid, assign wells, and you get the 4PL/5PL fit, back-calculated standard recovery, method health warnings, LLOQ/ULOQ flags and %CV in one pass. Everything runs in your browser: no account, no upload, no data leaving your machine.
If you use it in a publication, please cite:
> Labreador - Bioassay Analysis Platform (Version 1.6.0) [Computer software]. Zenodo. https://doi.org/10.5281/zenodo.21676846
## Related guides
- [ELISA calculator guide (4PL/5PL)](/elisa-calculator)
- [All resources](/resources)
---
### ARTICLE: Beyond R²: What to Actually Check for ELISA Method Quality
URL: https://labreador.com/blog/elisa-quality-checks-method-health
Published: 2026-07-22
Most ELISA reports live or die on a single number: R². It is comforting, it is familiar, and it is not enough. A curve with R² = 0.99 can still be built on a collapsed dynamic range, an EC50 that sits outside the standards, or a lower asymptote that is indistinguishable from the blank. None of that shows up in R² — but all of it silently biases the sample concentrations you report.
This post is a practical checklist of the metrics that actually decide whether an ELISA run is trustworthy, and how [Labreador](/elisa) surfaces them automatically through the new **Method Health Panel** so you do not have to compute them by hand.
## The five checks that matter more than R²
### 1. Dynamic range (ΔOD)
The difference between your highest and lowest standard OD is the "room" your assay has to discriminate concentrations. If the top standard reads 1.8 and the bottom reads 1.5, the whole assay is trying to resolve samples inside a 0.3 OD window — smaller than the plate-reader noise on many instruments.
- **≥ 1.5 OD** — ideal, comfortable resolution across the curve
- **0.5–1.5 OD** — marginal, low-end samples become noisy
- **< 0.5 OD** — the assay cannot separate concentrations; re-run
A shrunken ΔOD usually points to degraded conjugate, under-developed substrate, or coating that has lost activity.
### 2. Signal-to-blank ratio (S/B)
S/B is the top standard OD divided by the blank OD. It tells you how far your signal sits above the background. A high R² on a curve with S/B = 2 is meaningless — half of what you are fitting is noise.
- **≥ 10×** — clean assay
- **3–10×** — marginal, expect poor LLOQ
- **< 3×** — background dominates; results are not defensible
Low S/B typically means the plate was not washed thoroughly, or the blocking step was skipped or under-optimized.
### 3. EC50 inside the standards range
For 4PL and 5PL fits, EC50 (parameter C) is the inflection point of the sigmoid — the single best-constrained part of the curve. If EC50 falls **outside** your highest or lowest standard, the model is extrapolating the shape of the curve, and the asymptotes A and D become guesses rather than measurements.
An EC50 outside the standards is a strong signal that your dilution series does not span the analyte's real dynamic range. The fix is usually to add a higher or lower standard, not to accept the curve.
### 4. EC50 confidence-interval width
Even when EC50 lands inside the range, its **95% CI** tells you how well the data actually constrain it. A ratio of upper/lower CI bound is a clean summary:
- **≤ 3×** — EC50 is well-identified
- **3–10×** — parameter is loose; interpolation near the middle is uncertain
- **> 10×** — the curve is essentially under-defined; different EC50 values fit almost equally well
Wide CIs usually come from too few standards around the inflection region, or from replicates with high CV%.
### 5. R² — as a floor, not a ceiling
R² still matters — but as the last check, not the first. Labreador uses a three-tier gate: **≥ 0.98 ideal · 0.95–0.98 marginal · < 0.95 fail**. Think of it as a floor that rules out obvious disasters, while the four checks above catch the silent ones.
## Recovery: the honest test of your calibration
The metrics above describe the curve. **Standards back-calculation** describes what the curve does to real data. Labreador plugs each standard's OD back through the fit and reports the interpolated concentration versus the known one — the *Recovery %* and *Bias %*.
Following FDA/EMA bioanalytical guidance, the target is:
- **80–120 %** recovery for non-anchor standards (25 % at the LLOQ)
- **≥ 75 %** of standards must pass — the "75/25 rule"
If your R² is 0.99 but three standards recover at 140 %, your curve is wrong in a way R² will never tell you. Recovery is the ground-truth check.
## How Labreador's Method Health Panel puts it together
Rather than making you compute five diagnostics by hand after every run, Labreador aggregates them into a single collapsible **Method Health Panel** on the ELISA results screen:
- Each check gets a **pass / warn / fail** status with the numeric value, the target range, and a plain-language explanation of what a failure means for your data.
- The panel is **diagnostic only** — it never silently modifies your fit or interpolation. You stay in control of every decision.
- A top-line verdict (*Healthy · Review recommended · Method issues detected*) gives you an at-a-glance summary you can screenshot for a lab notebook or QC log.
Combined with **Standards Back-Calculation**, the **3-tier R² gate**, and the ability to exclude individual standards from the platemap, it turns "does the curve look OK?" into a defensible, reproducible answer.
## A workflow that raises method quality, not just report quality
The point of these checks is not to fail more runs — it is to catch method problems while you can still fix them:
1. **Run the plate**, load results into Labreador.
2. **Open the Method Health Panel** — if ΔOD or S/B fail, the problem is in the lab, not the fit. Re-run before spending time on interpretation.
3. **Check the Recovery table** — if the 75/25 rule fails, exclude the offending standards, refit, and treat samples in that concentration range as semi-quantitative.
4. **Only then** trust the sample concentrations, LLOQ, and ULOQ.
R² is a useful summary. It is not a quality gate. Dynamic range, S/B, EC50 placement, CI width, and recovery are — and having them one click away turns ELISA from a black box into a method you can defend.
*Try the Method Health Panel in the [ELISA module](/elisa). Every check is documented in-app under the Help (book icon) button.*
## Related guides
- [ELISA calculator guide (4PL/5PL)](/elisa-calculator)
- [All resources](/resources)
---
### ARTICLE: How to Calculate Km and Vmax: A Practical Enzyme Kinetics Guide
URL: https://labreador.com/blog/enzyme-kinetics-km-vmax-guide
Published: 2026-08-29
Enzyme kinetics looks simple on paper — one equation, two parameters — and yet Km and Vmax are among the most frequently misreported values in the life sciences. The usual culprits are not the maths but the data: rates read from the wrong part of the curve, substrate ranges that never approach saturation, and linearised plots that distort the very errors you are trying to estimate.
This guide walks through the practical workflow: from raw absorbance traces to defensible Km and Vmax values.
## The model
The Michaelis-Menten equation relates initial reaction velocity to substrate concentration:
```text
v = (Vmax * [S]) / (Km + [S])
```
- **Vmax** — the maximum velocity reached when the enzyme is saturated with substrate.
- **Km** — the substrate concentration at which v = Vmax/2. It is an *inverse* proxy for apparent affinity: a low Km means half-maximal activity is reached at low substrate.
- **kcat** — turnover number, `Vmax / [E]total`, only calculable if you know the active enzyme concentration.
- **kcat/Km** — catalytic efficiency, the number most often compared between enzyme variants or across substrates.
Two assumptions matter in the lab: substrate is in large excess over enzyme, and you measure **initial** velocity, before appreciable substrate depletion or product inhibition.
## Step 1: get real initial rates, not endpoints
This is where most datasets go wrong. A single endpoint absorbance is not a rate. You need a kinetic read — absorbance versus time — and a linear region from it.
Practical rules:
- Read every 15-60 s for long enough that the lowest substrate concentration still gives a measurable slope.
- Fit the slope over the region where the trace is linear, typically while less than **10 %** of substrate has been consumed.
- Discard wells where the trace curves from the very first read: the reaction is too fast, so dilute the enzyme rather than forcing a fit.
- Convert slope units consistently: ΔA/min becomes ΔC/min via the Beer-Lambert law, `Δc = ΔA / (ε · l)`, with the actual path length of your well volume — not a generic 1 cm.
In Labreador the [Kinetic Analysis module](/group-comparison) does exactly this reduction: it detects the time axis in a plate-reader export, computes per-well slopes over the selected window, and reports the reduced values with their replicate statistics, so the numbers entering your fit are traceable.
## Step 2: choose the substrate range around Km
A kinetics experiment can only estimate what its design allows. If your highest substrate is 2×Km, Vmax is an extrapolation and its confidence interval will be enormous.
A workable design:
- Span roughly **0.2×Km to 10×Km**, logarithmically spaced, 7-10 concentrations.
- Run a pilot experiment first if Km is unknown; a rough estimate from a wide log series is enough to design the real run.
- Use at least duplicates, ideally triplicates, at every concentration, and include a no-enzyme blank at each substrate level to correct for non-enzymatic hydrolysis.
If saturation is genuinely unreachable — poor substrate solubility, substrate inhibition — say so and report `kcat/Km` from the linear low-substrate regime instead of pretending Vmax was measured.
## Step 3: fit non-linearly, never Lineweaver-Burk
The double-reciprocal Lineweaver-Burk plot (1/v vs 1/[S]) was invented for a world without computers. It is still useful as a *diagnostic picture*, but it is a poor estimator:
- Taking reciprocals compresses high-substrate points and inflates low-substrate ones, so the least reliable measurements dominate the slope.
- Errors become non-normal, invalidating ordinary least squares.
- Eadie-Hofstee and Hanes-Woolf transforms distribute the distortion differently but do not remove it.
Fit the untransformed hyperbola by non-linear least squares. Report Km and Vmax with **95 % confidence intervals**, not just point estimates — a Km of "42 µM" means little without knowing whether the interval is 38-46 or 12-150 µM.
## Step 4: check the fit before you trust it
R² alone is not a verdict; a hyperbola fits almost anything that rises and flattens. Look at:
| Check | What good looks like |
|---|---|
| Residual plot | Random scatter around zero, no systematic curvature |
| Km confidence interval | Narrow, entirely positive, contained within the tested range |
| Vmax vs highest measured v | Highest v reaches ~80-90 % of fitted Vmax |
| Replicate CV | Typically < 10 % at mid-range substrate |
| High-substrate points | No downturn (see below) |
A **downturn at high substrate** is not noise — it is substrate inhibition, and it needs the appropriate model:
```text
v = Vmax * [S] / (Km + [S] * (1 + [S]/Ki))
```
Forcing plain Michaelis-Menten onto such data biases Km upwards and Vmax downwards, sometimes severely.
## Step 5: inhibition, if that is the question
When the goal is characterising an inhibitor, fit the substrate series at several inhibitor concentrations and compare parameter shifts:
- **Competitive** — apparent Km rises, Vmax unchanged.
- **Uncompetitive** — Vmax falls, Km falls proportionally (Vmax/Km constant).
- **Non-competitive / mixed** — Vmax falls, Km may shift either way.
Report `Ki` from a global fit across all inhibitor levels rather than from separate independent fits; global fitting uses the shared parameters and gives far tighter intervals. Note also that an IC50 from a single-substrate screen is **not** a Ki — it depends on the substrate concentration used, which is why IC50 values are only comparable within one assay format. See our [IC50 vs EC50 guide](/blog/ic50-vs-ec50-explained) for the related distinction.
## Reporting checklist
Include all of this in a methods section and reviewers will rarely push back:
- Buffer, pH, temperature, ionic strength, and any cofactors
- Enzyme concentration (and how active enzyme was quantified)
- Substrate range and number of concentrations
- Detection wavelength, path length, extinction coefficient used
- Time window over which initial rates were fitted
- Model fitted, fitting method (non-linear least squares, weighting scheme)
- Km, Vmax, kcat, kcat/Km — each with 95 % CI and units
- Number of independent biological replicates, not just technical ones
## Common pitfalls in one place
1. Using endpoint absorbance as a proxy for rate.
2. Fitting slopes across curved, substrate-depleted regions.
3. Substrate range topping out below Km, so Vmax is unidentifiable.
4. Estimating parameters from Lineweaver-Burk regression.
5. Reporting Km without a confidence interval.
6. Ignoring a high-substrate downturn.
7. Omitting the blank correction for non-enzymatic background.
8. Quoting kcat when active enzyme concentration was never determined.
## Where Labreador fits
Labreador runs entirely in your browser — plate data never leaves your machine. For enzyme kinetics the practical entry point today is the [Kinetic Analysis module](/group-comparison), which imports plate-reader time-course exports, extracts per-well initial rates over a window you control, and gives replicate statistics and group comparisons you can export for reporting. Dose-response style non-linear fitting with confidence intervals lives in the [Dose-Response module](/dose-response), and the full computational methodology is documented on the [Methods page](/methods).
Get the rates right, design the substrate range around Km, fit the hyperbola you actually measured — and your kinetic constants will hold up.
## Related guides
- [IC50 / EC50 calculator guide](/ic50-calculator)
- [All resources](/resources)
---
### ARTICLE: How to Calculate LOD and LOQ: Formulas, Methods and Common Mistakes
URL: https://labreador.com/blog/how-to-calculate-lod-loq
Published: 2026-08-23
Almost every method-validation report contains an LOD and an LOQ, and a surprising share of them are wrong — not because the arithmetic is hard, but because the number depends entirely on which definition was used and on how the blank was measured. This guide gives the three accepted routes, the exact formulas, and the traps that make two labs report values differing by a factor of five on the same instrument.
## What the two limits actually mean
- **LOD (limit of detection)** — the lowest concentration that can be reliably *distinguished from a blank*. It answers "is the analyte there?" It is **not** a concentration you may report as a number.
- **LOQ (limit of quantitation)** — the lowest concentration that can be measured with acceptable precision and accuracy (conventionally CV ≤ 20 % and recovery 80–120 % for immunoassays). It answers "how much is there?"
Everything below LOQ is reported as `< LOQ`, never as the point estimate. Everything below LOD is reported as *not detected* with the LOD stated.
## Method 1 — blank standard deviation (ICH Q2(R2), most common)
Measure the blank at least 10 times independently (not 10 reads of one well), take the SD of the blank signal, and convert to concentration with the calibration slope *S*:
```text
LOD = 3.3 x SD_blank / S
LOQ = 10 x SD_blank / S
```
Some fields use the *decision limit* form `LOD = mean_blank + 3 x SD_blank` in signal units and then back-calculate. Both are defensible; state which one you used.
**Worked example.** Blank OD over 12 replicates: mean 0.052, SD 0.0061. Calibration slope near the bottom of the curve: 0.0042 OD per pg/mL.
```text
LOD = 3.3 x 0.0061 / 0.0042 = 4.8 pg/mL
LOQ = 10 x 0.0061 / 0.0042 = 14.5 pg/mL
```
## Method 2 — calibration curve residuals
When blanks are unavailable or dominated by matrix, use the residual standard deviation of the regression (σ) in place of SD_blank:
```text
LOD = 3.3 x sigma / S
LOQ = 10 x sigma / S
```
Two rules make this valid: fit the curve **over the low range only** (roughly the bottom third), and use a *linear* segment. Taking σ from a full-range 4PL fit mixes in variance from the high asymptote and inflates both limits.
## Method 3 — signal-to-noise (chromatography)
For methods with a visible baseline, LOD is the concentration giving S/N ≈ 3 and LOQ the concentration giving S/N ≈ 10. Simple and widely accepted for HPLC/GC, but it depends on how the software windows the noise, so record the noise window.
## LOQ vs LLOQ: not the same thing
In immunoassay practice you will meet **LLOQ** — the lowest standard on the curve that meets the precision and accuracy criteria. It is an *empirical* limit tied to your calibrators, whereas LOQ from the formulas above is a *statistical* estimate. When your lowest calibrator sits above the calculated LOQ, the calibrator wins: you cannot quantify below the range you actually measured.
This is also why a zero standard never becomes the LLOQ. The log-scale 4PL/5PL model is undefined at zero concentration, so the zero well anchors the lower asymptote (background) while the lowest **non-zero** standard defines the quantifiable floor.
## Five mistakes that change the number
1. **Pseudo-replicates.** Reading one blank well ten times measures instrument noise, not method noise. Use independent preparations.
2. **Wrong slope.** Using the mid-curve slope of a sigmoidal fit instead of the slope near the blank underestimates LOD, sometimes twofold.
3. **Matrix-free blanks.** A buffer blank ignores matrix interference; use blank matrix when the assay is run in serum, plasma, or sediment extract.
4. **Skipping the dilution factor.** LOD/LOQ must be expressed in original-sample units. Multiply by the dilution factor before reporting.
5. **Reporting values below LOQ as numbers.** They pass into means and inflate or deflate group comparisons. Apply a documented rule (`< LOQ`, or LOD/2 imputation where the field accepts it) and state the censoring rate.
## Reporting checklist
- [ ] Method used (blank SD, residual SD, or S/N) named explicitly
- [ ] Number of independent blank replicates
- [ ] Slope source and range used for its estimation
- [ ] Blank type (buffer vs matrix)
- [ ] Units after dilution correction
- [ ] Rule applied to values below LOQ, plus how many samples were affected
## Doing it in Labreador
Labreador's [ELISA module](https://labreador.com/elisa) fits 4PL/5PL curves, reports the working range with explicit LLOQ/ULOQ flags, and marks every sample that falls outside it or was extrapolated, so out-of-range values never quietly enter your summary statistics. The Method Health panel additionally checks curve span, R², back-calculated standard recovery, and confidence-interval width — the signals that tell you whether an LOQ estimate is trustworthy at all. All computation happens in your browser; no data is uploaded.
## References
- ICH (2023). *Q2(R2) Validation of Analytical Procedures.* International Council for Harmonisation.
- Armbruster, D. A., & Pry, T. (2008). Limit of blank, limit of detection and limit of quantitation. *Clinical Biochemist Reviews*, 29(Suppl 1), S49-S52.
- CLSI (2012). *EP17-A2: Evaluation of Detection Capability for Clinical Laboratory Measurement Procedures.*
- Currie, L. A. (1999). Detection and quantification limits: origins and historical overview. *Analytica Chimica Acta*, 391(2), 127-134.
## Cite Labreador
If Labreador supported your analysis, please cite it: *Labreador - Bioassay Analysis Platform* (Version 1.6.0) [Computer software]. Zenodo. https://doi.org/10.5281/zenodo.21676846
## Related guides
- [ELISA calculator guide (4PL/5PL)](/elisa-calculator)
- [All resources](/resources)
---
### ARTICLE: IC50 vs EC50: What They Mean, How to Calculate Them, and When Each Applies
URL: https://labreador.com/blog/ic50-vs-ec50-explained
Published: 2026-06-18
IC50 and EC50 are two of the most reported numbers in pharmacology, toxicology, and bioassay screening — and two of the most frequently misused. They look almost identical on a curve, they share the same fitting machinery, and most software prints them with the same units. But they answer different questions, and reporting one when you mean the other quietly invalidates downstream comparisons.
This post defines both metrics, shows where they come from on a dose–response curve, walks through how they're actually calculated, and lists the small set of decisions that determine whether your IC50/EC50 is reproducible.
## Definitions
- **EC50** — the *Effective Concentration* that produces **50 % of the maximal response**. EC50 is the natural metric for **stimulatory** assays (agonists, growth, enzyme activation, fluorescence increase): higher signal = more effect.
- **IC50** — the *Inhibitory Concentration* that produces **50 % inhibition** of a baseline activity. IC50 is the natural metric for **inhibitory** assays (antagonists, cytotoxicity, enzyme inhibition, viability decrease): higher dose = lower signal.
Both are read off the **same 4PL/5PL curve** at the same vertical position — the midpoint between the fitted top and bottom asymptotes. The difference is the direction of the response and what "50 %" refers to.
## When to report which
| Assay type | Response direction | Report |
|---|---|---|
| Agonist binding, receptor activation | Signal ↑ with dose | **EC50** |
| Cell proliferation, growth factor | Signal ↑ with dose | **EC50** |
| Enzyme activator, reporter induction | Signal ↑ with dose | **EC50** |
| Cytotoxicity (MTT, CellTiter-Glo) | Signal ↓ with dose | **IC50** |
| Enzyme inhibitor, kinase screen | Signal ↓ with dose | **IC50** |
| Antimicrobial, antiviral activity | Signal ↓ with dose | **IC50** (often as MIC/EC50 too) |
If your assay can go in either direction (some functional assays do), pick **once per project** and stick with it — mixing EC50 and IC50 across plates of the same compound makes potency comparisons meaningless.
## How IC50/EC50 is actually calculated
Both come from a non-linear least-squares fit, almost always a **4-parameter logistic (4PL)**:
```
y = D + (A − D) / (1 + (x / C)^B)
```
where:
- **A** = bottom asymptote (response at concentration 0),
- **D** = top asymptote (response at saturating concentration),
- **C** = the inflection point on the dose axis — this is your **EC50 / IC50**,
- **B** = Hill slope (steepness of the transition).
Asymmetric curves (cooperative binding, biased agonism) need a **5PL** with a fifth parameter *E* that lets the upper and lower halves of the curve have different curvature. A 5PL almost always reports a slightly different EC50 than a 4PL on the same data — usually closer to the true midpoint when the curve is asymmetric.
On a normalised curve (0 % to 100 % response), IC50 and EC50 are exactly the **C** parameter. On raw signal, they are the concentration where `y = (A + D) / 2`.
## The five decisions that determine reproducibility
An EC50 reported without these five choices is not reproducible:
1. **Model** — 4PL or 5PL. Use an F-test, not your eye, to decide whether the extra 5PL parameter is justified.
2. **Normalisation** — % of control, fold-change, or raw signal. Different choices give different EC50 values on the same data.
3. **Constraints** — were Top and Bottom fixed to control means, or left free? A free fit on a curve that doesn't reach the plateau will drift the asymptote and shift the midpoint.
4. **Weighting** — equal weights, 1/Y, or 1/Y². Dose-response data is heteroscedastic; unweighted fits bias the midpoint toward the noisier end of the curve.
5. **Reported confidence interval** — a point estimate of EC50 without a 95 % CI is half a result. Two compounds with overlapping CIs are not significantly different in potency, no matter what the point estimates say.
## Common pitfalls
**Reporting EC50 when the top plateau wasn't reached.** If the curve hasn't levelled off, the fit will extrapolate the asymptote and the EC50 will move with every added or removed top point. Either extend the concentration range or constrain Top to a defensible value.
**Comparing IC50 across assays.** An IC50 from an enzyme assay and an IC50 from a cell viability assay are not the same quantity. Compare within an assay format.
**Treating IC50 as affinity.** For competitive binding assays, the **Cheng–Prusoff equation** converts IC50 to the true binding constant **Ki**, accounting for substrate concentration. Reporting IC50 as Ki is a common error in early SAR work.
**Confusing IC50 with potency rank in noisy assays.** A 2-fold IC50 difference inside the noise of the assay is not a real potency difference. Always look at the 95 % CI before ranking compounds.
**Linear interpolation between two points around 50 %.** This was acceptable when curve fitting was hard. It isn't anymore — a full 4PL/5PL fit with proper weighting takes seconds and gives you a CI.
## Practical workflow
1. Plot the data on a log-concentration axis before fitting — your eye is the fastest sanity check for whether a 4PL is even appropriate.
2. Fit a 4PL with 1/Y weighting; let the engine multi-start to avoid local minima.
3. Run a 5PL on the same data; compare with an F-test at α = 0.05. Keep the simpler model unless 5PL is significantly better.
4. Inspect the 95 % CI on EC50. If it spans more than ~3-fold, the assay or the concentration range needs work before the number is publishable.
5. Report: model, normalisation, constraints, weighting, EC50/IC50 with 95 % CI, Hill slope, R², Z' factor.
## In Labreador
The [Dose-Response module](/dose-response) does all five of the decisions above explicitly. Auto-fit runs the 4PL vs 5PL F-test, normalisation and constraints are first-class options, weighting is selectable per fit, and every EC50/IC50 is reported with a 95 % confidence interval computed from the log-transformed standard error — not a symmetric ± value that crosses zero on potent compounds.
The platform runs entirely in your browser, no account or upload required. If you publish results that use it, the [citation](/) is on the home page.
## Further reading
- Sebaugh, J. L. (2011). Guidelines for accurate EC50/IC50 estimation. *Pharmaceutical Statistics*, 10(2), 128–134.
- Yung-Chi, C., & Prusoff, W. H. (1973). Relationship between the inhibition constant (Ki) and IC50. *Biochemical Pharmacology*, 22(23), 3099–3108.
- Gadagkar, S. R., & Call, G. B. (2015). Computational tools for fitting the Hill equation to dose–response curves. *Journal of Pharmacological and Toxicological Methods*, 71, 68–76.
## Related guides
- [IC50 / EC50 calculator guide](/ic50-calculator)
- [All resources](/resources)
---
### ARTICLE: Labreador v1.5 — Parallel Line Analysis, Combined Assays, and Smarter Diagnostics
URL: https://labreador.com/blog/labreador-v1-5-release-notes
Published: 2026-07-13
Labreador v1.5 is the biggest release since launch. The headline is a brand-new **Parallel Line Analysis (PLA)** module for relative potency — the same statistical machinery regulators expect for biological batch release — but the update also brings sharper diagnostics, cleaner exports, and a handful of fixes that make everyday work faster. Everything still runs in your browser; no data ever leaves the device.
## New: Parallel Line Analysis module
A dedicated workspace for comparing a **test** sample against a **reference** standard and reporting **relative potency (RP %)** — the metric required by *Ph. Eur. 5.3* and *USP <1032/1034>* for biological products.
- **Joint 4PL / 5PL fit** under both the parallel (shared A, B, D) and non-parallel model.
- **F-test for parallelism** — the pass/fail gate that decides whether an RP number is defensible at all.
- **Relative potency with two CIs side by side**: analytical **Fieller's 95 % CI** and a residual **bootstrap 95 % CI** (500 iterations), so you can cross-check.
- **Quality gate** aggregating parallelism, R², CI width, concentration overlap, and variance homogeneity into a single PASS / WARN / FAIL verdict.
- **CSV + high-resolution PNG export** for reports.
## New: Combine multiple assay runs
Toggle at the top of the PLA page. Enter 3 – 6 independent runs (each with its own reference/test data, model, and weighting) and get a single combined potency.
- **Weighted geometric mean** of RP across runs, with inverse-variance weights derived from each run's CI.
- **χ² homogeneity test** (Ph. Eur. 5.3 §6) that tells you whether the runs actually agree before you report the combined value.
- Runs with undefined CI are automatically excluded from the pool and flagged in the per-run table.
## Sharper diagnostics
- **Fit parameters table** — reference vs test side by side (A, B, C, D, [G], R², n). Makes it obvious when a shared parameter is drifting even though the F-test passes.
- **Residual plot** (collapsible) — predicted vs residual with ±2σ guides and an auto-generated interpretation caption ("no systematic pattern" vs "curved residuals — consider 5PL").
- **Smart suggestions banner** — flags EC50 near the edge of the tested range, poor concentration overlap, and cases where 5PL would likely fit better than 4PL.
- **Interactive outlier exclusion** on the curve chart — click a point to drop it, click again to bring it back. Grubbs ESD pre-flags candidates.
- **Lack-of-fit F-test** (when replicates exist) that separates pure error from model misfit.
- **Levene / Brown-Forsythe test** for variance homogeneity between reference and test, feeding directly into the quality gate.
## Regression weighting
A segmented control next to the model toggle: **None**, **1/y**, **1/y²**. Applies consistently to the fit, the F-test, and the bootstrap — so switching to 1/y² when the assay CV is roughly constant across the dose range does not silently break the CI.
## Fixes and polish
- **Scatter dots on the PLA curve chart** now sit on the curves instead of stacking at the top of the plot.
- **Interactive-mode disclaimer** in the PLA chart is now a small collapsible hint and is excluded from PNG exports, so screenshots stay clean.
- **In-app guide** for PLA rewritten with worked examples, failure modes, and regulatory references.
## Documentation and standards
PLA is fully documented in the in-app guide (top-right of the module). The maths follows *Ph. Eur. 5.3* — including §6 for combining runs — and *USP <1032/1034>* for the acceptance framework. As always, Labreador is a research and method-development tool, not a GMP release instrument; but the calculations are the same calculations regulators check.
## Cite this version
If you cite Labreador in a methods section, please update to the v1.5 record:
> Labreador — Bioassay Analysis Platform (Version 1.5.0) [Computer software]. Zenodo. https://doi.org/10.5281/zenodo.21336603
Feedback and bug reports are welcome — the PLA module in particular benefits from real-world datasets, so send them our way.
---
### ARTICLE: Local-First Science: Why Your Assay Data Should Never Leave the Browser
URL: https://labreador.com/blog/local-first-scientific-software-2026
Published: 2026-07-27
There is a quiet shift happening in scientific software in 2026, and most labs have not noticed yet. The SaaS tools that promised to "modernise" bioassay analysis a few years ago — the ones that ask you to upload your raw plate files, your standards, your unpublished IC50s — are now the same tools whose Terms of Service quietly grant a licence to use "aggregated, de-identified" data to train internal models. Your negative controls are somebody else's training set.
This is why **local-first** has become the fastest-growing pattern in scientific tooling, and why [Labreador](/) was built that way from day one.
## What "local-first" actually means
Local-first is not the same as "offline mode" or "we encrypt in transit". It is a stricter architectural promise:
1. **Your data never leaves the device.** Parsing, fitting, statistics, QC, exports — all of it runs inside your browser tab.
2. **The server has nothing to leak.** There is no database row with your OD values, no S3 bucket with your CSV, no log line containing your sample names.
3. **The app keeps working without a network.** If the server disappears tomorrow, your analyses do not.
For a bioassay platform this matters more than for a note-taking app. Raw curves, EC50s, batch numbers, and dilution schemes are often the most sensitive artefacts a lab produces — sometimes months before a patent filing, sometimes under an NDA, sometimes covered by GDPR because the samples came from human donors.
## Why 2026 made this urgent
Three things changed in the last eighteen months:
- **Generative models eat any text they can reach.** "We do not sell your data" no longer implies "we do not train on your data". The two clauses are separate, and most cloud lab tools only make the first promise.
- **Regulators started reading TOS.** EU AI Act obligations and updated GDPR guidance now treat scientific measurements linked to identifiable samples as processing that requires an explicit legal basis — one that a click-through EULA does not provide.
- **Journals started asking.** Several Q1 journals in analytical chemistry and toxicology now require authors to state where raw data was processed and whether the processing environment could re-transmit it. "In a browser tab, never uploaded" is a much cleaner answer than "on vendor X's cloud".
If your workflow currently pastes standards into a hosted spreadsheet or a SaaS ELISA calculator, you are already answering these questions — just implicitly, and not in your favour.
## How Labreador implements local-first
Every calculation module in Labreador — ELISA, Dose-Response, Kinetic Analysis, Parallel Line Analysis, Ecotoxicology — runs entirely in the browser. Concretely:
- **Parsing** of plate-reader CSVs, kinetic time-courses, and grid layouts happens in client-side TypeScript. Nothing is POSTed.
- **Fitting** (4PL/5PL, weighted regression, PLA constrained fits, Monte Carlo draws) uses in-browser numeric routines. No serverless function receives your OD values.
- **Statistics** (Grubbs, Lack-of-Fit, ANOVA, post-hoc, bootstrap CIs) are computed locally.
- **Exports** — PDF reports, CSVs, high-resolution PNGs — are generated in the browser and streamed straight to your Downloads folder.
- **Offline** is a first-class mode. Labreador is an installable PWA; once opened, the calculation modules keep working with the network cable pulled.
The one place a network call happens is the optional AI assistant, and that call carries only the question you type — never the dataset in the workspace. If you want the assistant to reason about your numbers, you paste the specific values you choose to share.
## What to ask any lab-software vendor in 2026
If you are evaluating a tool that touches raw assay data, five questions separate local-first vendors from repackaged clouds:
1. Where is the fitting executed — my device or your servers?
2. What is retained after I close the tab: nothing, metadata, or the raw values?
3. Can the app compute results with the network disabled? (Ask them to demo it.)
4. Are my data used, in any form — aggregated, anonymised, statistical — for model training or benchmarking?
5. Can you produce an audit trail confirming the answers above?
A vendor that hesitates on question 3 or 4 is not local-first, no matter what the landing page says.
## The bigger point
The last decade of scientific software was about moving everything to the cloud because that was where compute lived. In 2026, the browser is fast enough to fit a 5PL curve in milliseconds, run a thousand Monte Carlo iterations on a laptop, and render a publication-ready PDF without a round-trip. The reason to keep sending raw data to somebody else's server is no longer technical — it is commercial.
Local-first is how scientific software should have looked all along. Labreador is one implementation of that idea, and if you want to see the guarantee in action, open the [ELISA module](/elisa), disconnect from the internet, and finish your analysis anyway.
---
### ARTICLE: Parallel Line Analysis: The One Test That Separates Biosimilars From Bench Curiosities
URL: https://labreador.com/blog/parallel-line-analysis-relative-potency
Published: 2026-07-01
Every batch of a biological drug — insulin, a monoclonal antibody, a recombinant vaccine, a biosimilar — needs to answer one question before it leaves the manufacturing site: **does it work as well as the reference standard?** Not "is the protein there", not "does the bioassay produce a curve", but "is this batch quantitatively equivalent to the material the regulator approved." Parallel Line Analysis (PLA) is the statistical method that answers it, and it has been the de facto gate in European Pharmacopoeia chapter 5.3 and USP <1032/1034> for decades.
This post explains what PLA actually computes, why two simpler shortcuts (comparing EC50s, comparing percent-maximal responses) are wrong, and how relative potency reports are routinely invalidated by failure modes that never appear on the headline number.
## The shortcut that doesn't work
The intuitive comparison is to fit each curve independently, read off its EC50, and report the ratio. This fails the moment the two curves are not parallel:
- A test compound that acts via a different mechanism produces a curve with a different Hill slope. Its "EC50" is then not measuring the same quantity as the reference EC50, and the ratio is meaningless.
- A test compound that saturates at a lower plateau (partial agonist) has a defined EC50 mathematically, but the assay is no longer comparing equivalents — the test sample literally cannot reproduce the reference's maximal response.
PLA refuses to report a number in either case. That refusal is the feature, not a bug.
## What PLA actually does
Given replicates from a **reference** sample (known potency) and a **test** sample (unknown), PLA fits two sigmoidal curves under two hypotheses:
1. **Parallel model** — both curves share the same bottom asymptote (A), top asymptote (D), and Hill slope (B). Only the inflection point (C, the EC50) is allowed to differ between them.
2. **Non-parallel model** — every parameter is free for each curve.
If the parallel model fits almost as well as the non-parallel one, the two curves are statistically parallel and the horizontal shift between them — `RP = C_reference / C_test` — is the **relative potency**. RP > 1 means the test sample is more potent than the reference; RP = 0.5 means it has half the activity.
The decision is made by an F-test on the residual sums of squares:
```ts
F = ((SSR_parallel - SSR_nonparallel) / (df_p - df_np))
/ (SSR_nonparallel / (n - df_np));
```
If `F` is below the critical value at α = 0.05, parallelism is supported and the relative potency is reported. If it exceeds the critical value, the test sample is behaving differently from the reference and no single potency number is defensible.
## A worked example
Suppose a manufacturing batch of a monoclonal antibody is tested side-by-side with the qualified reference standard on a cell-based potency assay. Independent 4PL fits give:
| Curve | A (bottom) | B (Hill) | C (EC50) | D (top) | R² |
|-----------|-----------:|---------:|---------:|--------:|------:|
| Reference | 4.8 | 1.02 | 10.1 ng/mL | 94.7 | 0.992 |
| Test | 4.6 | 0.98 | 21.7 ng/mL | 95.1 | 0.989 |
A naive EC50 ratio gives RP = 10.1 / 21.7 ≈ 0.47 — apparently the batch is 47 % potent. PLA insists on the F-test first. The joint parallel fit yields SSR_p = 12.4 across 48 points (8 concentrations × 3 replicates × 2 curves), while the independent fits yield SSR_np = 12.0 combined. With df_p = 5 (shared A, B, D + two C) and df_np = 8:
```ts
F = ((12.4 - 12.0) / 3) / (12.0 / 40) = 0.44;
// F_critical(3, 40, α=0.05) ≈ 2.84
// F << F_critical ⇒ parallelism supported
```
Now — and only now — RP = 0.47 is a defensible number, and a 95 % bootstrap CI of [0.43 – 0.51] tells QA the batch is meaningfully below the 80 – 125 % acceptance window. The batch fails release.
If the same arithmetic had been done without the F-test, a non-parallel test sample (say one that saturated at a 30 % lower plateau) would still produce an EC50 ratio of 0.47 — and the batch would be released on a number that does not actually mean what its name suggests.
## The four failure modes that invalidate every report
Even when the math runs cleanly, a PLA result can be quietly invalid for reasons that never appear on the headline number:
1. **Parallelism fails.** F-test rejects parallelism. The mechanism is different; no single potency number is defined. Treating the F-test as advisory is the single most common reason regulators reject release dossiers.
2. **Curve quality is poor.** Either curve has R² below 0.95. The fit is interpolating noise, not biology, and the CI on RP will be wide enough to be operationally useless even if parallelism passes.
3. **CI width is too large.** A 95 % CI that spans more than 50 % of the RP point estimate signals too few replicates, too narrow a concentration range, or both. The point estimate is technically correct and operationally meaningless.
4. **Concentration ranges don't overlap.** If the reference covers 0.1 – 10 nM and the test covers 30 – 3000 nM, the F-test will still compute, but it is comparing extrapolated regions of each curve. Less than 50 % overlap on a log scale ⇒ the report is not interpretable.
A defensible PLA workflow refuses to issue a number when any of these gates fails — exactly like the [R² gate for ELISA standard curves](/blog/r-squared-not-enough-elisa-quality-gate), but at four times the rigor because the stakes (a clinical batch) are four times higher.
## Where PLA fits in the modern bioassay stack
| Metric | Question answered |
|-----------------|-------------------------------------------------------------------------------------|
| R² | Did the model describe the curve shape? |
| Z'-factor | Is the assay window large enough relative to control noise to quantify anything? |
| Replicate CV | Is each individual measurement precise? |
| **PLA + RP** | Is the test sample quantitatively equivalent to the reference? |
R² and Z' are necessary but not sufficient. Replicate CV is necessary but not sufficient. PLA is the only one of these that ties an assay result back to a regulatory specification on the drug substance itself.
## Conclusion
Parallel Line Analysis is not an academic refinement of "compare two EC50s." It is the formal statistical machinery that turns a bioassay into a release test. The F-test for parallelism is a gate, not a footnote; the bootstrap CI on relative potency is the operational interval the QA team will actually use; and the 80 – 125 % specification window only means what it says when those two are honestly reported.
Labreador's new PLA module computes all of this in the browser with no data leaving the device: joint 4PL/5PL fit, parallelism F-test, bootstrap 95 % CI on RP, and a pharma-grade quality gate. It is meant as a research and method-development tool, not a GMP release instrument — but the math is the same math regulators check, and the gates are the same gates a release dossier has to pass.
If you cite this discussion in a methods section, please cite Labreador via the DOI listed on the home page.
---
### ARTICLE: R² Is Not Enough: A 3-Tier Quality Gate for ELISA Curves
URL: https://labreador.com/blog/r-squared-not-enough-elisa-quality-gate
Published: 2026-05-26
A standard curve with R² = 0.97 looks reassuring on a report. In practice, that same curve can mis-quantify low-abundance samples by 30 % or more — and nothing in the R² number tells you it happened. For ELISA, where most clinically and ecologically interesting samples sit in the lower third of the dynamic range, accepting a curve on R² alone is one of the most common silent failure modes in the workflow.
This post explains what R² actually measures on a sigmoidal ELISA standard curve, why it systematically over-reports quality on heteroscedastic data, and how a three-tier acceptance gate — the same one [Labreador](/elisa) enforces — turns a soft number into a defensible accept/warn/reject decision.
## What R² actually measures (and doesn't)
R² is the fraction of variance in the response explained by the model. On a sigmoidal ELISA curve, almost all of that variance lives in the steep middle of the dose–response transition. A model can therefore nail the inflection region, drift on both asymptotes, and still report R² in the high 0.9s.
R² does **not** measure:
- whether residuals are symmetric around the curve,
- whether the low-end (where samples often are) is fit better than the upper plateau,
- whether the chosen model is the right *shape* (4PL vs 5PL vs log-log),
- whether the asymptotes are stable enough to define LLOQ/ULOQ.
In other words, R² confirms a model **fits the data on average**. It does not confirm the model is **fit-for-purpose for sample interpolation**.
## Why ELISA data is heteroscedastic
ELISA responses scale with signal: replicate variance at OD 2.0 is typically an order of magnitude larger than at OD 0.1. Unweighted least squares treats both as equally informative, so the fit gets pulled toward the noisy upper plateau and quietly abandons the low end.
Two practical consequences follow:
1. **Global R² is dominated by the high-signal points.** A curve can post R² ≈ 0.98 while the three lowest standards are off by 20–40 %.
2. **Residuals become asymmetric.** Standard parametric confidence intervals built on a symmetry assumption underestimate true uncertainty near LLOQ.
The fix at the fitting stage is variance-stabilising weighting (typically 1/Y or 1/Y²). The fix at the *acceptance* stage is to stop trusting a single R² value.
## The 3-tier acceptance gate
Labreador grades every standard curve into one of three tiers and ties downstream behaviour to that tier:
| Tier | Weighted R² | Decision | What the app does |
|------|-------------|----------|-------------------|
| 1 — Accept | ≥ 0.98 | Curve is fit-for-purpose | Interpolate freely within LLOQ–ULOQ |
| 2 — Warn | 0.95 ≤ R² < 0.98 | Borderline | Interpolate, flag wells, surface a smart suggestion |
| 3 — Reject | < 0.95 | Curve is not interpretable | Nonlinear interpolation is blocked |
The thresholds are not arbitrary. 0.98 is the value above which, on typical heteroscedastic immunoassay data, the dominant residual pattern is random noise rather than systematic curvature. Between 0.95 and 0.98 you are usually looking at one or two questionable standards — recoverable, but the user needs to know. Below 0.95 the model is misaligned with the data shape; no amount of confidence-interval reporting will rescue a sample value interpolated from it.
> Tier 3 is a hard gate, not a warning. Labreador will not return interpolated sample concentrations from a curve below 0.95 — the user is asked to re-fit with a different model, exclude an outlier standard, or re-run the plate.
## Why 0.95 is the fail-safe (and not 0.90)
In heteroscedastic, asymmetric-residual regimes, a globally low R² is not a small fit problem — it is a signal that the chosen model shape is wrong for the data. Once that happens, nonlinear interpolation produces concentrations with confidence intervals that look reasonable on paper and are wrong in reality. The 0.95 cutoff is set deliberately conservatively because the cost of a false-accept (a published number derived from a misaligned curve) is much higher than the cost of a false-reject (a re-run plate).
## What R² doesn't catch — and what Labreador adds on top
The quality gate is only one layer. Around it, the engine enforces several checks R² is blind to:
- **F-test for 4PL → 5PL.** The choice between 4PL and 5PL is not made on R². Labreador runs an F-test on the residual sum of squares and only accepts 5PL when the extra asymmetry parameter is statistically justified. This prevents the overfitting that an R²-only comparison would always favour.
- **Weighted residuals (1/Y, 1/Y²).** Variance-stabilising weights are applied during fitting so the low end is not sacrificed to the upper plateau.
- **Replicate CV gating.** Replicates with CV > 20 % are flagged before they ever influence the curve.
- **LLOQ / ULOQ enforcement.** Sample values outside the quantifiable range are not silently extrapolated; when extrapolation is permitted (polynomial / log-log only), values are explicitly tagged `< LLOQ (ext)` or `> ULOQ (ext)`.
- **Confidence intervals via the covariance matrix.** EC₅₀ uncertainty is propagated through the delta method in log space, not approximated from R².
## A practical checklist
Regardless of which software you use, the following five checks will catch most of what R² alone misses:
1. **Inspect the residuals plot, not just R².** Look for systematic curvature, especially at the low end.
2. **Compare 4PL and 5PL with an F-test**, not by picking the higher R².
3. **Apply 1/Y or 1/Y² weighting** for any immunoassay with > 1 decade of dynamic range.
4. **Set a hard R² floor for sample interpolation** — 0.95 is a defensible default.
5. **Report LLOQ and ULOQ explicitly**, and refuse to interpolate outside them (or flag clearly when you do).
## Cite Labreador
If the 3-tier gate or any of the QC logic above supported your analysis, please cite Labreador in your publications — the citation is available from the **Cite Labreador** button on the home page.
## Related guides
- [ELISA calculator guide (4PL/5PL)](/elisa-calculator)
- [All resources](/resources)
---
### ARTICLE: Understanding Pollution Indices: CF, PLI and MPI Explained
URL: https://labreador.com/blog/understanding-pollution-indices-cf-pli-mpi
Published: 2026-05-06
Trace-metal contamination rarely speaks for itself. A raw concentration of 25 mg/kg of zinc in sediment means very little until you ask the only question that matters: *compared to what?* Pollution indices exist to answer that question in a reproducible, comparable way. This post walks through the three indices most commonly used in sediment, soil and biota studies — **CF**, **PLI** and **MPI** — and what each one actually tells you.
## Contamination Factor (CF)
The Contamination Factor is the simplest and the foundation of everything that follows. For each metal, it is the ratio of the measured concentration in the sample to a background (reference) concentration:
```text
CF = C_sample / C_background
```
The background can be a local pristine site, a pre-industrial sediment layer, or a published geochemical baseline (e.g. Turekian & Wedepohl average shale). The interpretation, after Hakanson (1980), is:
- **CF < 1** — low contamination
- **1 ≤ CF < 3** — moderate contamination
- **3 ≤ CF < 6** — considerable contamination
- **CF ≥ 6** — very high contamination
CF is metal-specific. It does not tell you anything about the *overall* pollution status of a site — only how a single element compares to its reference.
## Pollution Load Index (PLI)
Tomlinson et al. (1980) introduced PLI to collapse a vector of CF values into a single, site-level number. It is the **geometric mean** of the CFs of all metals considered:
```text
PLI = ( CF_1 × CF_2 × … × CF_n )^(1/n)
```
Two properties make the geometric mean the right choice here. It is dominated by neither extreme highs nor extreme lows, and it goes to zero if any single CF is zero — a useful sanity property when one metal is below detection. Interpretation is binary and conservative:
- **PLI < 1** — no overall pollution (baseline-like)
- **PLI ≥ 1** — progressive deterioration of site quality
PLI is excellent for **comparing sites** along a gradient (e.g. upstream vs. downstream), because it produces one number per location.
## Metal Pollution Index (MPI)
MPI is conceptually similar to PLI but is computed directly on **concentrations**, not on CFs:
```text
MPI = ( C_1 × C_2 × … × C_n )^(1/n)
```
Because no reference is involved, MPI is **not a contamination index in the strict sense** — it is a summary of metal load. Its strength is that it lets you compare biota or matrices when a credible local background is unavailable or contested. It is widely used in fish-tissue studies, where "background concentrations" of essential metals are biologically meaningful and a CF would be misleading.
## Choosing an appropriate baseline
Every CF-derived index inherits the quality of its baseline. Three rules of thumb:
1. **Replicate the reference.** A single reference sample sits somewhere inside its own natural variability; using it as "the" baseline propagates that noise into every CF you compute. Wherever possible, use the **mean of multiple reference replicates** for each metal.
2. **Match the matrix.** Sediment baselines for sediment samples; soil baselines for soils; species-specific baselines for biota. Cross-matrix references are not interchangeable.
3. **State the source.** Local pristine site, deep sediment core, or a published geochemical average are all defensible — but the choice changes the numbers and must be reported.
## Reporting per-sample *and* per-group results
Field studies almost always involve replication: *n* samples per site, several sites per study. Per-sample CF/PLI/MPI values are the raw evidence, but the **per-group mean ± SD** is what belongs in a manuscript table. Reporting only individual values hides the within-site variability; reporting only group means hides outliers and the sample size behind each estimate. Best practice is to publish both, with sample standard deviation (*n* − 1) and explicit *N*.
## Common pitfalls
- **Mixing units.** CF is unitless, but only because numerator and denominator share units. Mixing dry weight and wet weight is a frequent silent error.
- **Treating BDL as zero.** Below-detection-limit values should be imputed (commonly LOD/2) rather than set to zero, otherwise a single non-detect can drag PLI to zero.
- **Reading CF as toxicity.** CF measures *enrichment relative to background*, not biological harm. A high CF for an essential nutrient (e.g. iron) is not necessarily a toxicological signal — pair indices with hazard-based metrics (THQ, HI) when human or ecological risk is the actual question.
- **Comparing across studies with different references.** Two PLIs computed against different baselines are not directly comparable. Always report the reference values used.
## In short
- **CF** answers "how enriched is *this metal* at this site?"
- **PLI** answers "how polluted is *this site overall*, relative to background?"
- **MPI** answers "what is the total metal load here, regardless of reference?"
Used together, and reported with proper baselines and replication, they provide a clear, defensible picture of metal contamination without overstating what the numbers can support.
If you use Labreador to compute these indices for a publication, please cite it via the **Cite Labreador** button on the home page.
## Related guides
- [Pollution index calculator guide (CF, PLI, Igeo, EF, MPI)](/pollution-index-calculator)
- [All resources](/resources)
---
### ARTICLE: Welcome to the Labreador Blog
URL: https://labreador.com/blog/welcome-to-labreador
Published: 2026-04-21
Welcome — and thanks for stopping by. This is the first post on the Labreador blog, so it is short and meta on purpose: no science claims yet, just a heads-up about what is coming.
## What this blog is for
Labreador is a free, browser-based platform for bioassay analysis. The app already covers ELISA standard curves, IC50/EC50 dose-response fitting, kinetic group comparison, and a small suite of ecotoxicology calculators. The blog is the place where we will explain **how** and **why** behind those tools.
You can expect three kinds of posts:
1. **Methodology notes** — short write-ups on a single concept (for example, how the 3-tier R² quality gate works, or why a 4PL is preferred over a linear fit for sigmoidal data).
2. **Step-by-step guides** — practical walk-throughs that follow a real workflow from raw plate-reader output to a publication-ready figure.
3. **Release notes** — when a new module or a non-trivial change ships, we summarise what changed and why it matters scientifically.
## What this blog is not
It is not a replacement for primary literature. Every post will link to the references behind the methods it describes, so you can verify and cite the original sources in your own work.
## Cite Labreador
If Labreador supports your research, please cite it in your publications — the citation is available from the **Cite Labreador** button on the home page. More posts soon.
---
### ARTICLE: Z'-Factor: The One Number That Tells You If Your Assay Is Worth Running
URL: https://labreador.com/blog/z-prime-factor-assay-quality-metric
Published: 2026-06-30
Every assay run produces numbers. Only some of those numbers are worth interpreting. The Z'-factor — introduced by Zhang, Chung and Oldenburg in 1999 — is the single most useful statistic for deciding whether a plate-based assay has enough dynamic range relative to its noise to be analyzed at all. Two decades later it remains the de facto gate in high-throughput screening, and it deserves the same status in everyday ELISA and dose-response work.
This post explains what the Z'-factor actually quantifies, why the 0.5 acceptance threshold is not arbitrary, and how to compute it correctly from your positive and negative controls — including the failure modes that quietly inflate it.
## The intuition behind Z'
A plate assay is only useful when the signal window between your positive and negative controls is large compared to the variability inside each control. The Z'-factor formalises that ratio:
```ts
Z' = 1 - (3 * (sd_pos + sd_neg)) / Math.abs(mean_pos - mean_neg);
```
The numerator is the total noise band — three standard deviations on each side of both controls, the region where 99.7 % of replicate values are expected to land. The denominator is the assay window. When the noise band consumes most of the window, Z' collapses toward zero or below. When the controls are tight and well-separated, Z' approaches one.
## Why 0.5 is the threshold
| Z' value | Interpretation | Action |
|--------------|--------------------------------------|------------------------------|
| 1.0 | Theoretical maximum (zero variance) | Impossible in practice |
| 0.5 – 1.0 | Excellent assay | Proceed with analysis |
| 0.0 – 0.5 | Marginal — usable only as yes/no | Do not quantify samples |
| < 0.0 | Controls overlap | Reject the plate |
At Z' = 0.5, the noise bands of the two controls just stop touching — there is exactly one full noise band of separation between them. Below that, the bands begin to overlap and any single replicate from a sample of unknown concentration could plausibly belong to either population. Quantitative interpolation in that regime is statistically indefensible, no matter how good the curve's R² looks.
## Z' vs Z: a critical distinction
The original paper defines two metrics:
- **Z'** uses only the **controls** (positive and negative reference wells). It describes the *assay*.
- **Z** uses the **sample population** in place of the positive control. It describes a specific *screen*.
For ELISA standard curves and dose-response experiments, Z' is the relevant number. Reporting plain Z on a screen where most samples are inactive will look catastrophic even on a perfectly behaved assay, simply because the sample mean sits near the negative control.
## How to compute it without fooling yourself
Three failure modes routinely inflate Z' and need to be guarded against:
1. **Too few replicates.** Standard deviation estimated from n = 3 is itself noisy. Z' computed from triplicates can swing by 0.2 between plates of identical biological quality. Use at least n = 8 control wells per plate when Z' is going to gate downstream decisions.
2. **Edge effects.** If positive and negative controls are clustered in adjacent columns, evaporation and thermal gradients shrink the apparent within-control SD and inflate Z'. Distribute controls across the plate, or compute Z' after applying a row/column correction.
3. **Outlier masking.** Removing a single high replicate from the positive control can lift Z' from 0.4 to 0.6. Define an outlier rule (e.g. Tukey 1.5×IQR or modified Z-score) *before* the run, not after seeing the result.
## A worked example
Suppose a sandwich ELISA reports, across eight wells per control:
| Control | Mean OD | SD |
|-----------|---------|--------|
| Positive | 2.40 | 0.08 |
| Negative | 0.12 | 0.03 |
```ts
const zPrime = 1 - (3 * (0.08 + 0.03)) / Math.abs(2.40 - 0.12);
// Z' = 1 - 0.33 / 2.28 = 0.855
```
A Z' of 0.86 is excellent: the noise band consumes only 14 % of the assay window. Sample interpolation on this plate is well supported.
Now suppose a later run drifts:
| Control | Mean OD | SD |
|-----------|---------|--------|
| Positive | 1.80 | 0.22 |
| Negative | 0.18 | 0.09 |
```ts
const zPrime = 1 - (3 * (0.22 + 0.09)) / Math.abs(1.80 - 0.18);
// Z' = 1 - 0.93 / 1.62 = 0.426
```
The R² of the standard curve may still exceed 0.99, but Z' = 0.43 means the assay is no longer quantitative on this plate. Sample concentrations reported from it carry uncertainty that R² will not reveal — exactly the failure mode covered in [R² Is Not Enough](/blog/r-squared-not-enough-elisa-quality-gate).
## Where Z' fits in a modern QC stack
R², Z'-factor, replicate CV, and outlier flags answer different questions and should be reported together:
- **R²** — does the model describe the standard curve shape?
- **Z'** — is the assay window large enough relative to control noise to quantify anything?
- **Replicate CV** — is each individual sample measured precisely?
- **Outlier flags** — are any wells contaminating the means?
A plate that passes all four is defensible. A plate that passes only R² is a publication risk.
## Conclusion
The Z'-factor turns "the controls looked fine" into a single auditable number with a defined acceptance threshold. Compute it on every plate, report it next to R², and use 0.5 as a hard gate for quantitative interpretation. [Labreador](/elisa) surfaces control statistics alongside curve fits so this check takes seconds, not a separate spreadsheet — and the same logic carries directly into dose-response and group-comparison workflows.
If you cite this discussion in a methods section, please cite Labreador via the DOI listed on the home page.
## Related guides
- [IC50 / EC50 calculator guide](/ic50-calculator)
- [ELISA calculator guide (4PL/5PL)](/elisa-calculator)
- [All resources](/resources)