Demo study: LPS challenge, IL-6 and TNF-α
Simulated data with known ground truth (immunoassay.simulate.default_demo_study) · generated 2026-09-29 19:57 · immunoassay v1.0.0
12
flagged replicate groups
65
values measured in range
1 · Plate acceptance
A plate passes when R² ≥ 0.98, ≥ 75% of standard levels recover within 80–120% with CV ≤ 20%, a quantifiable range exists, and ≥ 67% of controls with expected ranges fall inside them. Limits are in-well concentrations.
| plate_id | analyte | verdict | model | R² | standards OK | lod | lloq | uloq | controls OK | flagged groups | reasons |
|---|
| IL6_P1 | IL-6 | ✓ pass | 4PL | 0.997 | 7/7 | 4.13 | 15.6 | 1,000.0 | 3/3 | 4 | |
| IL6_P2 | IL-6 | ✓ pass | 4PL | 0.997 | 7/7 | 5.045 | 15.6 | 1,000.0 | 3/3 | 3 | |
| TNFa_P1 | TNF-α | ✓ pass | 4PL | 0.9981 | 7/7 | 5.363 | 7.812 | 500.0 | 2/3 | 3 | |
| TNFa_P2 | TNF-α | ✓ pass | 4PL | 0.9967 | 7/7 | 4.21 | 7.812 | 500.0 | 3/3 | 2 | |
2 · Standard curves
Weighted (1/y^2) least-squares fits. 5PL is chosen over 4PL only when its AICc is lower by more than 2. Weighted residuals should scatter evenly around zero; a curved pattern means the model is wrong for the data. The plate map shows raw OD. Excluded wells are marked ✗.
IL6_P1 · IL-6
| model | a | a_se | b | b_se | c (EC50) | c_se | d | d_se | R² | aicc_4pl | aicc_5pl |
|---|
| 4pl | 0.000162 | 0.00302 | 1.153 | 0.04458 | 350.4 | 48.8 | 2.968 | 0.2213 | 0.997 | -139.1 | -135.1 |
Standard recovery
| concentration | n_wells | n_quantified | mean_back_calc | cv_pct | recovery_pct |
|---|
| 15.6 | 2 | 2 | 16.6 | 0.9573 | 106.3 |
| 31.2 | 2 | 2 | 30.9 | 12.1 | 98.9 |
| 62.5 | 2 | 2 | 60.4 | 0.7833 | 96.6 |
| 125.0 | 2 | 2 | 125.8 | 10.1 | 100.7 |
| 250.0 | 2 | 2 | 273.3 | 5.323 | 109.3 |
| 500.0 | 2 | 2 | 471.2 | 10.4 | 94.2 |
| 1,000.0 | 2 | 2 | 1,015.0 | 3.086 | 101.5 |
IL6_P2 · IL-6
| model | a | a_se | b | b_se | c (EC50) | c_se | d | d_se | R² | aicc_4pl | aicc_5pl |
|---|
| 4pl | -0.00128 | 0.00269 | 1.091 | 0.04308 | 331.7 | 49.3 | 2.705 | 0.2048 | 0.997 | -141.9 | -137.6 |
Standard recovery
| concentration | n_wells | n_quantified | mean_back_calc | cv_pct | recovery_pct |
|---|
| 15.6 | 2 | 2 | 15.1 | 0.8943 | 96.7 |
| 31.2 | 2 | 2 | 32.4 | 7.684 | 103.8 |
| 62.5 | 2 | 2 | 64.4 | 2.536 | 103.1 |
| 125.0 | 2 | 2 | 117.1 | 3.617 | 93.7 |
| 250.0 | 2 | 2 | 262.3 | 10.3 | 104.9 |
| 500.0 | 2 | 2 | 522.3 | 14.5 | 104.5 |
| 1,000.0 | 2 | 2 | 967.4 | 7.054 | 96.7 |
TNFa_P1 · TNF-α
| model | a | a_se | b | b_se | c (EC50) | c_se | d | d_se | R² | aicc_4pl | aicc_5pl |
|---|
| 4pl | -0.00209 | 0.00369 | 1.225 | 0.0511 | 175.5 | 23.5 | 2.654 | 0.2012 | 0.9981 | -135.2 | -131.3 |
Standard recovery
| concentration | n_wells | n_quantified | mean_back_calc | cv_pct | recovery_pct |
|---|
| 7.812 | 2 | 2 | 7.714 | 14.3 | 98.7 |
| 15.6 | 2 | 2 | 14.9 | 2.646 | 95.5 |
| 31.2 | 2 | 2 | 34.1 | 4.394 | 109.1 |
| 62.5 | 2 | 2 | 61.7 | 2.823 | 98.7 |
| 125.0 | 2 | 2 | 118.3 | 2.578 | 94.6 |
| 250.0 | 2 | 2 | 266.8 | 3.097 | 106.7 |
| 500.0 | 2 | 2 | 497.4 | 11.9 | 99.5 |
TNFa_P2 · TNF-α
| model | a | a_se | b | b_se | c (EC50) | c_se | d | d_se | R² | aicc_4pl | aicc_5pl |
|---|
| 4pl | -0.00163 | 0.00435 | 1.137 | 0.05121 | 237.5 | 43.7 | 3.682 | 0.3844 | 0.9967 | -129.3 | -124.9 |
Standard recovery
| concentration | n_wells | n_quantified | mean_back_calc | cv_pct | recovery_pct |
|---|
| 7.812 | 2 | 2 | 7.513 | 9.608 | 96.2 |
| 15.6 | 2 | 2 | 16.5 | 1.157 | 105.3 |
| 31.2 | 2 | 2 | 30.8 | 2.078 | 98.4 |
| 62.5 | 2 | 2 | 63.1 | 15.2 | 101.0 |
| 125.0 | 2 | 2 | 128.1 | 13.1 | 102.5 |
| 250.0 | 2 | 2 | 250.8 | 3.313 | 100.3 |
| 500.0 | 2 | 2 | 504.8 | 14.4 | 101.0 |
Excluded wells
None.
3 · Controls and flagged samples
| plate_id | analyte | sample_id | measured | low | high | cv_pct | range_flag | in range |
|---|
| IL6_P1 | IL-6 | CTRL_LO | 45.3 | 30.0 | 50.0 | 3.953 | | 1 |
| IL6_P1 | IL-6 | CTRL_MID | 163.6 | 120.0 | 200.0 | 0.558 | | 1 |
| IL6_P1 | IL-6 | CTRL_HI | 690.3 | 450.0 | 750.0 | 11.8 | | 1 |
| IL6_P2 | IL-6 | CTRL_LO | 32.2 | 30.0 | 50.0 | 7.641 | | 1 |
| IL6_P2 | IL-6 | CTRL_MID | 139.2 | 120.0 | 200.0 | 1.189 | | 1 |
| IL6_P2 | IL-6 | CTRL_HI | 477.0 | 450.0 | 750.0 | 4.399 | | 1 |
| TNFa_P1 | TNF-α | CTRL_LO | 22.6 | 15.0 | 25.0 | 6.294 | | 1 |
| TNFa_P1 | TNF-α | CTRL_MID | 79.2 | 52.5 | 87.5 | 7.165 | | 1 |
| TNFa_P1 | TNF-α | CTRL_HI | 335.8 | 187.5 | 312.5 | 15.8 | | 0 |
| TNFa_P2 | TNF-α | CTRL_LO | 19.6 | 15.0 | 25.0 | 0.9653 | | 1 |
| TNFa_P2 | TNF-α | CTRL_MID | 68.7 | 52.5 | 87.5 | 11.9 | | 1 |
| TNFa_P2 | TNF-α | CTRL_HI | 225.7 | 187.5 | 312.5 | 2.927 | | 1 |
Flagged replicate groups
below_lloq / above_uloq: outside the validated range (not reported as numbers). below_lod: not distinguishable from blank. cv_high: replicate CV above 20%.
| plate_id | analyte | sample_id | group | dilution | wells | od_mean | conc_well | cv_pct | flags |
|---|
| IL6_P1 | IL-6 | S011 | vehicle | 2 | E7,E8 | 0.0692 | 13.7 | 2.547 | below_lloq |
| IL6_P1 | IL-6 | S030 | LPS+drug | 8 | G7,G8 | 0.05615 | 11.4 | 1.899 | below_lloq |
| IL6_P1 | IL-6 | S019 | LPS | 2 | H5,H6 | 0.9724 | 212.5 | 84.7 | cv_high |
| IL6_P1 | IL-6 | S003 | vehicle | 8 | H7,H8 | 0.0418 | 8.753 | 8.969 | below_lloq |
| IL6_P2 | IL-6 | S005 | vehicle | 2 | E3,E4 | 0.0844 | 14.4 | 6.795 | below_lloq |
| IL6_P2 | IL-6 | S005 | vehicle | 8 | G7,G8 | 0.00615 | – | 197.8 | below_lloq;below_lod;cv_high |
| IL6_P2 | IL-6 | S004 | vehicle | 8 | H7,H8 | 0.0143 | 2.949 | 33.2 | below_lloq;below_lod;cv_high |
| TNFa_P1 | TNF-α | S012 | vehicle | 2 | A5,A6 | 0.1397 | 16.7 | 57.3 | cv_high |
| TNFa_P1 | TNF-α | S011 | vehicle | 8 | A9,A10 | 0.0698 | 9.419 | 22.5 | cv_high |
| TNFa_P1 | TNF-α | S004 | vehicle | 2 | E5,E6 | 0.0302 | 4.839 | 23.2 | below_lloq;below_lod;cv_high |
| TNFa_P2 | TNF-α | S006 | vehicle | 8 | A9,A10 | 0.00955 | 1.45 | 12.8 | below_lloq;below_lod |
| TNFa_P2 | TNF-α | S006 | vehicle | 2 | G3,G4 | 0.06775 | 7.32 | 25.2 | below_lloq;cv_high |
4 · Dilution linearity
Samples run at more than one dilution should agree after correction (±20%). A concentration that rises with dilution points to matrix interference or the high-dose hook effect.
| plate_id | analyte | sample_id | dilutions | neat_concs | max_deviation_pct | trend | linear | interpretation |
|---|
| IL6_P1 | IL-6 | S021 | 2;8 | 599.8;723.3 | 9.337 | rises_with_dilution | ✗ fail | possible matrix interference or high-dose hook effect |
| IL6_P1 | IL-6 | S036 | 2;8 | 213.9;244.4 | 6.655 | flat | ✓ pass | dilution-linear |
| IL6_P1 | IL-6 | S030 | 2;8 | 72.75;90.95 | – | | – | fewer than two dilutions in range; linearity not assessable |
| IL6_P1 | IL-6 | S003 | 2;8 | 69.2;70.03 | – | | – | fewer than two dilutions in range; linearity not assessable |
| IL6_P2 | IL-6 | S025 | 2;8 | 185.4;196.3 | 2.838 | flat | ✓ pass | dilution-linear |
| IL6_P2 | IL-6 | S014 | 2;8 | 773.8;810.8 | 2.33 | flat | ✓ pass | dilution-linear |
| IL6_P2 | IL-6 | S005 | 2;8 | 28.88;NA | – | | – | fewer than two dilutions in range; linearity not assessable |
| IL6_P2 | IL-6 | S004 | 2;8 | 36.87;23.59 | – | | – | fewer than two dilutions in range; linearity not assessable |
| TNFa_P1 | TNF-α | S011 | 2;8 | 72.3;75.35 | – | | – | fewer than two dilutions in range; linearity not assessable |
| TNFa_P1 | TNF-α | S016 | 2;8 | 142.9;126.7 | 5.992 | flat | ✓ pass | dilution-linear |
| TNFa_P1 | TNF-α | S030 | 2;8 | 201.3;196.3 | 1.265 | flat | ✓ pass | dilution-linear |
| TNFa_P1 | TNF-α | S015 | 2;8 | 125.7;128.6 | 1.175 | flat | ✓ pass | dilution-linear |
| TNFa_P2 | TNF-α | S006 | 2;8 | 14.64;11.6 | – | | – | fewer than two dilutions in range; linearity not assessable |
| TNFa_P2 | TNF-α | S028 | 2;8 | 125;119.7 | 2.187 | flat | ✓ pass | dilution-linear |
| TNFa_P2 | TNF-α | S033 | 2;8 | 145.6;137.5 | 2.852 | flat | ✓ pass | dilution-linear |
| TNFa_P2 | TNF-α | S025 | 2;8 | 106.1;94.57 | 5.771 | flat | ✓ pass | dilution-linear |
5 · Inter-plate normalization
Bridge controls shared by every plate estimate a multiplicative plate factor, on the log scale with the average plate as reference. Corrected concentration = raw / factor.
| plate_id | analyte | factor | log_factor_se | n_bridges | bridge_ids |
|---|
| IL6_P1 | IL-6 | 1.157 | 0.03258 | 3 | CTRL_HI,CTRL_LO,CTRL_MID |
| IL6_P2 | IL-6 | 0.8644 | 0.03258 | 3 | CTRL_HI,CTRL_LO,CTRL_MID |
| TNFa_P1 | TNF-α | 1.12 | 0.04267 | 3 | CTRL_HI,CTRL_LO,CTRL_MID |
| TNFa_P2 | TNF-α | 0.8928 | 0.04267 | 3 | CTRL_HI,CTRL_LO,CTRL_MID |
| analyte | sample_id | inter-plate CV % before | inter-plate CV % after |
|---|
| IL-6 | CTRL_HI | 25.8 | 5.528 |
| IL-6 | CTRL_LO | 24.0 | 3.617 |
| IL-6 | CTRL_MID | 11.4 | 9.136 |
| TNF-α | CTRL_HI | 27.7 | 12.0 |
| TNF-α | CTRL_LO | 9.893 | 6.128 |
| TNF-α | CTRL_MID | 10.1 | 5.932 |
6 · Group comparisons
Tests are run on log10-transformed concentrations. Shapiro-Wilk on every group decides between parametric tests (Welch t / Welch ANOVA) and rank tests (Mann-Whitney / Kruskal-Wallis). Omnibus p-values are Benjamini-Hochberg adjusted across analytes; pairwise p-values are Holm-adjusted within each analyte. Hollow points are censored values that were substituted.
| analyte | handling | n |
|---|
| IL-6 | excluded: cv_fail | 1 |
| IL-6 | measured | 33 |
| IL-6 | substituted: below common LLOQ 36.2 → /1.41 | 2 |
| TNF-α | excluded: cv_fail | 1 |
| TNF-α | measured | 32 |
| TNF-α | substituted: below common LLOQ 17.5 → /1.41 | 3 |
Omnibus tests
| analyte | groups | n | test | statistic | p | p (BH) | significant | effect | value | shapiro |
|---|
| IL-6 | vehicle vs LPS vs LPS+drug | vehicle=12, LPS=11, LPS+drug=12 | Welch ANOVA | 35.3 | 1.86e-07 | 2.61e-07 | ✓ pass | eta² | 0.6502 | vehicle: p=0.61, LPS: p=0.8, LPS+drug: p=0.46 |
| TNF-α | vehicle vs LPS vs LPS+drug | vehicle=11, LPS=12, LPS+drug=12 | Welch ANOVA | 36.4 | 2.61e-07 | 2.61e-07 | ✓ pass | eta² | 0.7802 | vehicle: p=0.46, LPS: p=0.25, LPS+drug: p=0.79 |
Pairwise comparisons
| analyte | reference | group | test | effect_name | estimate | 95% CI low | 95% CI high | std. effect | value | p (Holm) | significant |
|---|
| IL-6 | vehicle | LPS | Welch t-test | fold change | 6.574 | 4.152 | 10.4 | Hedges' g | 3.437 | 9.73e-08 | ✓ pass |
| IL-6 | vehicle | LPS+drug | Welch t-test | fold change | 2.453 | 1.466 | 4.105 | Hedges' g | 1.43 | 0.00181 | ✓ pass |
| IL-6 | LPS | LPS+drug | Welch t-test | fold change | 0.3731 | 0.2197 | 0.6337 | Hedges' g | -1.543 | 0.00181 | ✓ pass |
| TNF-α | vehicle | LPS | Welch t-test | fold change | 4.102 | 2.751 | 6.115 | Hedges' g | 3.102 | 3.29e-06 | ✓ pass |
| TNF-α | vehicle | LPS+drug | Welch t-test | fold change | 4.794 | 3.246 | 7.081 | Hedges' g | 3.576 | 1.83e-06 | ✓ pass |
| TNF-α | LPS | LPS+drug | Welch t-test | fold change | 1.169 | 0.9218 | 1.482 | Hedges' g | 0.5379 | 0.1865 | ✗ fail |
7 · Settings and warnings
{
"model": "auto",
"weighting": "1/y^2",
"include_zero_standard": true,
"qc": {
"max_cv_pct": 20.0,
"recovery_low_pct": 80.0,
"recovery_high_pct": 120.0,
"edge_tolerance_pct": 5.0,
"lod_sd_multiplier": 3.0,
"outlier_z": 3.5,
"max_std_exclusions": 2,
"min_r_squared": 0.98,
"min_std_pass_frac": 0.75,
"min_control_pass_frac": 0.6666666666666666
},
"stats": {
"transform": "log10",
"censored": "substitute",
"harmonize_lloq": true,
"lloq_divisor": 1.4142135623730951,
"alpha": 0.05,
"normality_alpha": 0.05,
"exclude_failed_plates": true,
"value_col": "conc_norm"
},
"normalize": true,
"linearity_max_deviation_pct": 20.0,
"group_order": [
"vehicle",
"LPS",
"LPS+drug"
],
"control_ranges": [
{
"analyte": "IL-6",
"sample_id": "CTRL_LO",
"nominal": 40.0,
"low": 30.0,
"high": 50.0
},
{
"analyte": "IL-6",
"sample_id": "CTRL_MID",
"nominal": 160.0,
"low": 120.0,
"high": 200.0
},
{
"analyte": "IL-6",
"sample_id": "CTRL_HI",
"nominal": 600.0,
"low": 450.0,
"high": 750.0
},
{
"analyte": "TNF-\u03b1",
"sample_id": "CTRL_LO",
"nominal": 20.0,
"low": 15.0,
"high": 25.0
},
{
"analyte": "TNF-\u03b1",
"sample_id": "CTRL_MID",
"nominal": 70.0,
"low": 52.5,
"high": 87.5
},
{
"analyte": "TNF-\u03b1",
"sample_id": "CTRL_HI",
"nominal": 250.0,
"low": 187.5,
"high": 312.5
}
]
}