All examples · Example 7 of 34
Ridgeline Plot: Cell Size over Time
Distribution of cell area (µm²) at eight time points after stimulation (n = 300 cells per time point).

Key findings
- Mean cell area grows from 108.7 µm² at 0 h to 184.2 µm² at 48 h (Kruskal–Wallis p = 2.0 × 10⁻¹⁰⁸).
- Every time point is right-skewed (skewness 0.37–1.1), which is why ridgelines — whole distributions — are the right display.
- Against baseline, the first time point to differ after Holm correction is 2 h.
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 |
|---|---|---|---|---|---|---|---|---|---|
| 0 h | 300 | 108.7 | 37.19 | 2.147 | 102.9 | 83.5 – 128 | 38.2 – 257.5 | 1.06 | 1.67 |
| 2 h | 300 | 118.6 | 38.26 | 2.209 | 112.3 | 92.08 – 141.6 | 38 – 258.9 | 0.654 | 0.505 |
| 4 h | 300 | 124.2 | 39.53 | 2.282 | 118.4 | 96.17 – 149.6 | 40.3 – 282.5 | 0.675 | 0.716 |
| 8 h | 300 | 135.6 | 43.87 | 2.533 | 133.7 | 103.9 – 160.2 | 34.6 – 288.7 | 0.575 | 0.39 |
| 12 h | 300 | 146.2 | 47.16 | 2.723 | 141.3 | 112.8 – 175.7 | 57.2 – 295.4 | 0.615 | 0.119 |
| 24 h | 300 | 153.8 | 54.39 | 3.14 | 149.8 | 113.7 – 179.6 | 56 – 350.3 | 0.803 | 0.903 |
| 36 h | 300 | 171.4 | 54.07 | 3.122 | 166.4 | 130.4 – 203.9 | 64.8 – 351.1 | 0.539 | 0.0485 |
| 48 h | 300 | 184.2 | 54.7 | 3.158 | 181 | 144.8 – 221.1 | 46.5 – 404.4 | 0.365 | 0.0987 |
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 |
|---|---|---|---|---|---|---|---|---|
| 0 h | 300 | 0.9412 | 1.5 × 10⁻⁹ | 4 | 5.6 × 10⁻¹⁰ | 0.097 | 3.5 × 10⁻⁷ | Normality rejected |
| 2 h | 300 | 0.9739 | 2.8 × 10⁻⁵ | 1.859 | 9.3 × 10⁻⁵ | 0.06977 | 0.001 | Normality rejected |
| 4 h | 300 | 0.973 | 2.0 × 10⁻⁵ | 1.445 | 0.0010 | 0.06278 | 0.006 | Normality rejected |
| 8 h | 300 | 0.9764 | 7.4 × 10⁻⁵ | 1.526 | 0.0006 | 0.04687 | 0.11 | Normality rejected |
| 12 h | 300 | 0.9721 | 1.5 × 10⁻⁵ | 2.003 | 4.1 × 10⁻⁵ | 0.06554 | 0.003 | Normality rejected |
| 24 h | 300 | 0.9595 | 2.1 × 10⁻⁷ | 2.545 | 1.9 × 10⁻⁶ | 0.07703 | 0.0002 | Normality rejected |
| 36 h | 300 | 0.9781 | 0.0002 | 1.598 | 0.0004 | 0.05998 | 0.011 | Normality rejected |
| 48 h | 300 | 0.9869 | 0.008 | 0.8862 | 0.023 | 0.05834 | 0.015 | Normality rejected |
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.
LabTools notes
- Group '0 h' rejects normality (p = 0.0000); prefer a rank-based test.
- Group '12 h' rejects normality (p = 0.0000); prefer a rank-based test.
- Group '2 h' rejects normality (p = 0.0000); prefer a rank-based test.
- Group '24 h' rejects normality (p = 0.0000); prefer a rank-based test.
- Group '36 h' rejects normality (p = 0.0002); prefer a rank-based test.
- Group '4 h' rejects normality (p = 0.0000); prefer a rank-based test.
- Group '48 h' rejects normality (p = 0.0078); prefer a rank-based test.
- Group '8 h' rejects normality (p = 0.0001); prefer a rank-based test.
- Group '2 h' rejects normality (p = 0.0001); prefer a rank-based test.
- Group '36 h' rejects normality (p = 0.0004); prefer a rank-based test.
- Group '4 h' rejects normality (p = 0.0010); prefer a rank-based test.
- Group '48 h' rejects normality (p = 0.0232); prefer a rank-based test.
- Group '8 h' rejects normality (p = 0.0006); prefer a rank-based test.
- Group '12 h' rejects normality (p = 0.0034); prefer a rank-based test.
- Group '2 h' rejects normality (p = 0.0013); prefer a rank-based test.
- Group '24 h' rejects normality (p = 0.0002); prefer a rank-based test.
- Group '36 h' rejects normality (p = 0.0112); prefer a rank-based test.
- Group '4 h' rejects normality (p = 0.0062); prefer a rank-based test.
- Group '48 h' rejects normality (p = 0.0154); prefer a rank-based test.
Equal variances
Student's t and one-way ANOVA assume every group has the same spread. LabTools' Levene test uses deviations from the group median (the Brown–Forsythe form), which stays reliable on skewed data; Bartlett's test is more powerful but only trustworthy when the data are normal. A significant p means the equal-variance assumption fails — prefer Welch's t-test or a rank-based test.
| Test | Statistic | p | Largest / smallest variance | Verdict |
|---|---|---|---|---|
| Levene (Brown–Forsythe, median-centred) | 14.26 | 3.0 × 10⁻¹⁸ | 2.16 | Variances differ |
| Bartlett | 111 | 5.6 × 10⁻²¹ | 2.16 | Variances differ |
LabTools calls (2)
stats.levenelabtools stats levene --groups @groups.json --method levene
stats.levenelabtools stats levene --groups @groups.json --method bartlett
The same method is available as an MCP tool (stats_levene) and from the desktop app's statistics panel.
LabTools notes
- Variances differ: use Welch's t-test (stats.ttest default) or stats.kruskal rather than the pooled-variance alternatives.
- Bartlett's test assumes normality and is badly inflated when that fails — confirm with stats.normality, or use method='levene'.
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 | 0 h | 2 h | 4 h | 8 h | 12 h | 24 h | 36 h | 48 h |
|---|---|---|---|---|---|---|---|---|
| Grubbs | 1 (257.5) | none | 1 (282.5) | none | none | none | none | 1 (404.4) |
| Generalised ESD | 2 (257.5, 248.4) | none | 1 (282.5) | none | none | none | none | 1 (404.4) |
| Modified z (MAD) | 5 (257.5, 228.2, 218.3, 238.6 …) | 2 (254.8, 258.9) | 1 (282.5) | 1 (288.7) | none | 3 (322.8, 350.3, 343.2) | none | 1 (404.4) |
| IQR fences (1.5×) | 11 (257.5, 228.2, 207, 195.7 …) | 5 (219, 254.8, 223.5, 218.3 …) | 5 (282.5, 234.6, 235.8, 242.4 …) | 5 (258.3, 288.7, 252.9, 269.1 …) | 4 (282.4, 280.7, 294.6, 295.4) | 11 (285.8, 304.4, 283.5, 279.8 …) | 3 (351.1, 315.4, 341.1) | 1 (404.4) |
LabTools calls (4)
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 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
- Flagged points are candidates, not verdicts, and nothing has been removed. Look for a physical cause before excluding anything; if there is none, keep the point and use a robust test instead. Any exclusion must be reported.
- Grubbs tests only the single most extreme point, so a second outlier can mask the first. On larger samples use method='generalized_esd'.
- The IQR rule is descriptive — it has no p-value and flags roughly 0.7% of a perfectly normal sample by construction.
Confidence intervals for the mean
t-based intervals: the range of population means these data are consistent with. Report them alongside p-values — an interval shows the size of an effect, a p-value does not.
| Group | n | Mean | 95% CI |
|---|---|---|---|
| 0 h | 300 | 108.7 | [104.5, 112.9] |
| 2 h | 300 | 118.6 | [114.3, 122.9] |
| 4 h | 300 | 124.2 | [119.8, 128.7] |
| 8 h | 300 | 135.6 | [130.6, 140.6] |
| 12 h | 300 | 146.2 | [140.8, 151.5] |
| 24 h | 300 | 153.8 | [147.6, 160] |
| 36 h | 300 | 171.4 | [165.3, 177.6] |
| 48 h | 300 | 184.2 | [178, 190.4] |
LabTools calls (2)
stats.cilabtools stats ci --data @0_h.json --conf-level 0.95
stats.cilabtools stats ci --data @48_h.json --conf-level 0.95
The same method is available as an MCP tool (stats_ci) and from the desktop app's statistics panel.
Do the groups differ? (omnibus tests)
One-way ANOVA compares means and assumes normal residuals with equal variances; Kruskal–Wallis compares ranks and assumes neither. Both only say the groups differ somewhere — the pairwise table below says where.
| Test | Statistic | df | p | Effect size |
|---|---|---|---|---|
| One-way ANOVA | F = 94.6 | 7, 2,392 | 3.7 × 10⁻¹²² | ω² = 0.214 · η² = 0.217 · Cohen's f = 0.526 |
| Kruskal–Wallis H | H = 521.4 | 7 | 2.0 × 10⁻¹⁰⁸ | ε² = 0.217 |
LabTools calls (2)
stats.anovalabtools stats anova --groups @groups.json
stats.kruskallabtools stats kruskal --groups @groups.json
The same method is available as an MCP tool (stats_anova) and from the desktop app's statistics panel.
LabTools notes
- Group '0 h' departs from normality (Shapiro–Wilk W = 0.9412, p = 0.0000 < 0.05). Consider stats.kruskal.
- Group '12 h' departs from normality (Shapiro–Wilk W = 0.9721, p = 0.0000 < 0.05). Consider stats.kruskal.
- Group '2 h' departs from normality (Shapiro–Wilk W = 0.9739, p = 0.0000 < 0.05). Consider stats.kruskal.
- Group '24 h' departs from normality (Shapiro–Wilk W = 0.9595, p = 0.0000 < 0.05). Consider stats.kruskal.
- Group '36 h' departs from normality (Shapiro–Wilk W = 0.9781, p = 0.0002 < 0.05). Consider stats.kruskal.
- Group '4 h' departs from normality (Shapiro–Wilk W = 0.9730, p = 0.0000 < 0.05). Consider stats.kruskal.
- Group '48 h' departs from normality (Shapiro–Wilk W = 0.9869, p = 0.0078 < 0.05). Consider stats.kruskal.
- Group '8 h' departs from normality (Shapiro–Wilk W = 0.9764, p = 0.0001 < 0.05). Consider stats.kruskal.
- Group variances are unequal (Levene W = 14.2577, p = 0.0000 < 0.05); the equal-variance assumption of this test is violated. Use the Welch variant instead.
Which groups differ? (pairwise, corrected)
7 comparisons (each group against 0 h), each run as a Welch t-test and a Mann–Whitney test. Testing many pairs inflates false positives, so every p-value is corrected with Holm (family-wise) and Benjamini–Hochberg (false-discovery rate) through stats.adjust.
| Comparison | Mean diff. | 95% CI | Hedges' g | Welch p | Holm | BH | Mann–Whitney p | Holm | Cliff's δ |
|---|---|---|---|---|---|---|---|---|---|
| 0 h vs 2 h | -9.905 | [-15.95, -3.855] | -0.262 | 0.001 | 0.001 | 0.001 | 0.0004 | 0.0004 | -0.167 |
| 0 h vs 4 h | -15.55 | [-21.7, -9.397] | -0.405 | 9.1 × 10⁻⁷ | 1.8 × 10⁻⁶ | 1.1 × 10⁻⁶ | 1.5 × 10⁻⁷ | 3.0 × 10⁻⁷ | -0.248 |
| 0 h vs 8 h | -26.89 | [-33.41, -20.36] | -0.66 | 3.3 × 10⁻¹⁵ | 1.0 × 10⁻¹⁴ | 4.6 × 10⁻¹⁵ | 6.9 × 10⁻¹⁶ | 2.1 × 10⁻¹⁵ | -0.381 |
| 0 h vs 12 h | -37.46 | [-44.27, -30.65] | -0.881 | 7.3 × 10⁻²⁵ | 2.9 × 10⁻²⁴ | 1.3 × 10⁻²⁴ | 1.8 × 10⁻²⁴ | 7.1 × 10⁻²⁴ | -0.482 |
| 0 h vs 24 h | -45.07 | [-52.55, -37.6] | -0.966 | 6.9 × 10⁻²⁹ | 3.5 × 10⁻²⁸ | 1.6 × 10⁻²⁸ | 9.3 × 10⁻²⁹ | 4.7 × 10⁻²⁸ | -0.525 |
| 0 h vs 36 h | -62.73 | [-70.17, -55.29] | -1.35 | 6.2 × 10⁻⁵⁰ | 3.7 × 10⁻⁴⁹ | 2.2 × 10⁻⁴⁹ | 4.4 × 10⁻⁴⁷ | 2.7 × 10⁻⁴⁶ | -0.68 |
| 0 h vs 48 h | -75.5 | [-83, -68] | -1.61 | 1.7 × 10⁻⁶⁵ | 1.2 × 10⁻⁶⁴ | 1.2 × 10⁻⁶⁴ | 2.9 × 10⁻⁵⁸ | 2.0 × 10⁻⁵⁷ | -0.759 |
LabTools calls (3)
stats.ttestlabtools stats ttest --a @0_h.json --b @2_h.json --test welch --no-assumption-checks
stats.mannwhitneylabtools stats mannwhitney --a @0_h.json --b @2_h.json
stats.adjustlabtools stats adjust --p-values @p_values.json --labels @labels.json --method holm
The same method is available as an MCP tool (stats_ttest) and from the desktop app's statistics panel.
Design sensitivity
LabTools calls (2)
stats.powerlabtools stats power --n1 300 --n2 300 --mode mde --power 0.8
stats.powerlabtools stats power --n1 300 --n2 300 --effect-size 0.5
The same method is available as an MCP tool (stats_power) and from the desktop app's statistics panel.
Methods paragraph
Written to go straight into a manuscript.
Descriptive statistics per time point: median cell area rose from 102.9 µm² (0 h) to 181.0 µm² (48 h), with right-skewed distributions throughout.
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.