All examples · Example 14 of 34
Waterfall Plot: Tumour Response
Best percentage change in tumour size from baseline for each of 30 patients, ordered from largest increase to largest decrease; dashed lines mark the RECIST +20% and −30% thresholds.

Key findings
- 14 of 30 patients (46.7%) met the partial-response threshold; the 95% Wilson interval is wide because n = 30.
- Mean best change -23.54% (95% CI [-33.3, -13.78]), one-sample t p = 3.1 × 10⁻⁵.
Descriptive statistics
Location, spread and shape for every group — the first thing to read before choosing a test. Skewness near 0 and excess kurtosis near 0 are what a normal distribution looks like.
| Group | n | Mean | SD | SEM | Median | Q1 – Q3 | Min – Max | Skewness | Excess kurtosis |
|---|---|---|---|---|---|---|---|---|---|
| Best change (%) | 30 | -23.54 | 26.14 | 4.772 | -26 | -42.7 – -10.75 | -76 – 20.3 | -0.0287 | -0.62 |
LabTools call
stats.describelabtools stats describe --groups @groups.json
The same method is available as an MCP tool (stats_describe) and from the desktop app's statistics panel.
Normality
Three tests of the same question — could these values come from a normal distribution? Shapiro–Wilk has the best power at bench sample sizes, Anderson–Darling is more sensitive in the tails, and Kolmogorov–Smirnov (Lilliefors-corrected) is included for comparability with older papers. A significant p means normality is rejected.
| Group | n | Shapiro–Wilk W | p | Anderson–Darling A² | p | K–S D | p | Verdict |
|---|---|---|---|---|---|---|---|---|
| Best change (%) | 30 | 0.9669 | 0.46 | 0.3206 | 0.52 | 0.1062 | 0.52 | Consistent with normal |
LabTools calls (3)
stats.normalitylabtools stats normality --groups @groups.json --method shapiro-wilk
stats.normalitylabtools stats normality --groups @groups.json --method anderson-darling
stats.normalitylabtools stats normality --groups @groups.json --method kolmogorov-smirnov
The same method is available as an MCP tool (stats_normality) and from the desktop app's statistics panel.
Outlier screen
Five detectors with different assumptions. Grubbs tests the single most extreme point, generalised ESD looks for up to several (immune to masking), Dixon's Q is the small-sample chemistry test, modified-z uses the median and MAD so needs no normality, and the IQR rule is Tukey's boxplot fence. LabTools flags points; it never deletes them.
| Method | Best change (%) |
|---|---|
| Grubbs | none |
| Generalised ESD | none |
| Dixon's Q | none |
| Modified z (MAD) | none |
| IQR fences (1.5×) | none |
LabTools calls (5)
stats.outlierslabtools stats outliers --groups @groups.json --method grubbs
stats.outlierslabtools stats outliers --groups @groups.json --method generalized-esd --max-outliers 5
stats.outlierslabtools stats outliers --groups @groups.json --method dixon-q
stats.outlierslabtools stats outliers --groups @groups.json --method modified-z
stats.outlierslabtools stats outliers --groups @groups.json --method iqr
The same method is available as an MCP tool (stats_outliers) and from the desktop app's statistics panel.
LabTools notes
- The IQR rule is descriptive — it has no p-value and flags roughly 0.7% of a perfectly normal sample by construction.
Is the average patient shrinking?
One-sample t-test of the best change against 0%, with 95% and 99% intervals for the mean change.
| Test | Statistic | df | p | Mean change | 95% CI | 99% CI |
|---|---|---|---|---|---|---|
| One-sample t (μ = 0%) | t = -4.933 | 29 | 3.1 × 10⁻⁵ | -23.54% | [-33.3, -13.78] | [-36.69, -10.39] |
LabTools calls (2)
stats.ttestlabtools stats ttest --data @best_change.json --test one-sample --mu 0
stats.cilabtools stats ci --data @best_change.json --conf-level 0.95
The same method is available as an MCP tool (stats_ttest) and from the desktop app's statistics panel.
Response rates (RECIST thresholds)
Partial response is a shrinkage of 30% or more; progression is growth of 20% or more. Each rate is a proportion of 30 patients, so it gets a Wilson interval.
| Proportion | Count | Estimate | 95% Wilson CI | 95% Wald CI |
|---|---|---|---|---|
| Response (≤ −30%) | 14 / 30 | 46.7% | 30.2% – 63.9% | 28.8% – 64.5% |
| Progression (≥ +20%) | 1 / 30 | 3.3% | 0.6% – 16.7% | 0.0% – 9.8% |
| Disease control (< +20%) | 29 / 30 | 96.7% | 83.3% – 99.4% | 90.2% – 100.0% |
LabTools calls (2)
stats.cilabtools stats ci --kind proportion --successes 14 --n 30 --method wilson
stats.cilabtools stats ci --kind proportion --successes 14 --n 30 --method wald
The same method is available as an MCP tool (stats_ci) and from the desktop app's statistics panel.
Methods paragraph
Written to go straight into a manuscript.
Median best change from baseline was −26.0%. Fourteen of 30 patients (46.7%, 95% Wilson CI 30.2–63.9%) reached a partial response (≤ −30%).
Every number on this page was computed by the LabTools statistics engine (version 0.14.3) from the example's CSV on 2026-09-23. Where a value was derived before the data reached LabTools (replicate means, paired differences, log odds ratios), the text says so. The data are simulated from a fixed random seed.
Get started
Run the same analysis on your data
Every test on this page is built into LabTools — from the statistics panel, the command line, or an AI assistant through MCP.