All examples · Example 22 of 34
Line Chart: Bacterial Growth Curve
OD600 of bacterial cultures in three media over 24 h (mean ± SD of 3 replicate cultures).

Key findings
- Two-way ANOVA: medium F = 8,399, time F = 876.5, and a medium × time interaction p = 7.8 × 10⁻⁸⁶ — the curves diverge over time, not just in height.
- Final OD600 at 24 h differs between media (one-way ANOVA p = 7.7 × 10⁻⁷, ω² = 0.986), with n = 3 cultures per medium.
Two-way ANOVA: Medium × Time
Every medium is sampled at the same 25 time points in triplicate, so medium and time are crossed factors. The interaction term asks the growth-curve question: do the media grow at different rates, not just to different heights? (Replicate cultures are followed over time, so a repeated-measures model would be stricter; the two-way ANOVA is shown as the standard factorial summary.)
| Source | SS | df | MS | F | p | Partial η² |
|---|---|---|---|---|---|---|
| Medium | 61.286 | 2 | 30.643 | 8,399 | 1.1 × 10⁻¹⁵⁴ | 0.991 |
| Time | 76.742 | 24 | 3.1976 | 876.5 | 1.3 × 10⁻¹⁴⁸ | 0.993 |
| Medium × Time | 14.025 | 48 | 0.29218 | 80.09 | 7.8 × 10⁻⁸⁶ | 0.962 |
| Residual | 0.54724 | 150 | 0.0036483 |
LabTools call
stats.anovalabtools stats anova --design two-way --cells @cells.json --factor-a-name Medium --factor-b-name Time
The same method is available as an MCP tool (stats_anova) and from the desktop app's statistics panel.
LabTools notes
- The interaction is significant, so the main effects are not interpretable on their own — the effect of one factor depends on the level of the other. Report simple effects at each level instead.
Final OD600 at 24 h
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 |
|---|---|---|---|---|---|---|---|---|---|
| LB | 3 | 1.608 | 0.05916 | 0.03416 | 1.631 | 1.586 – 1.642 | 1.541 – 1.652 | -1.5 | — |
| TB | 3 | 2.389 | 0.1045 | 0.06036 | 2.358 | 2.331 – 2.432 | 2.303 – 2.505 | 1.2 | — |
| M9 minimal | 3 | 0.9061 | 0.02925 | 0.01689 | 0.91 | 0.8925 – 0.9216 | 0.8751 – 0.9332 | -0.589 | — |
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.
Equal variances at the final time point
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) | 0.6587 | 0.55 | 12.8 | Homogeneous |
| Bartlett | 2.286 | 0.32 | 12.8 | Homogeneous |
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
- Group 'LB' has n = 3; normality screening has very low power at this size, so a non-significant Shapiro–Wilk is weak evidence of normality.
- Group 'M9 minimal' has n = 3; normality screening has very low power at this size, so a non-significant Shapiro–Wilk is weak evidence of normality.
- Group 'TB' has n = 3; normality screening has very low power at this size, so a non-significant Shapiro–Wilk is weak evidence of normality.
- Non-significant. This test has low power on small samples, so treat this as 'no evidence against equal variances', not as evidence for them.
- Bartlett's test assumes normality and is badly inflated when that fails — confirm with stats.normality, or use method='levene'.
Final yield: do the media differ at 24 h?
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 = 323.9 | 2, 6 | 7.7 × 10⁻⁷ | ω² = 0.986 · η² = 0.991 · Cohen's f = 10.4 |
| Kruskal–Wallis H | H = 7.2 | 2 | 0.027 | ε² = 0.9 |
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 'LB' has n = 3; normality screening has very low power at this size, so a non-significant Shapiro–Wilk is weak evidence of normality.
Which groups differ? (pairwise, corrected)
3 comparisons (every pair), 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 δ |
|---|---|---|---|---|---|---|---|---|---|
| LB vs TB | -0.7807 | [-0.9952, -0.5663] | -7.35 | 0.001 | 0.002 | 0.001 | 0.081 | 0.24 | -1 |
| LB vs M9 minimal | 0.702 | [0.5789, 0.8251] | 12 | 0.0004 | 0.001 | 0.001 | 0.081 | 0.24 | 1 |
| TB vs M9 minimal | 1.483 | [1.245, 1.72] | 15.5 | 0.0008 | 0.002 | 0.001 | 0.081 | 0.24 | 1 |
LabTools calls (3)
stats.ttestlabtools stats ttest --a @LB.json --b @TB.json --test welch --no-assumption-checks
stats.mannwhitneylabtools stats mannwhitney --a @LB.json --b @TB.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 3 --n2 3 --mode mde --power 0.8
stats.powerlabtools stats power --n1 3 --n2 3 --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.
Final OD600 at 24 h differed between media (one-way ANOVA, F(2,6) = 323.9, p < 0.0001, ω² = 0.99): TB 2.39 ± 0.10, LB 1.61 ± 0.06, M9 0.91 ± 0.03.
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.