All examples · Example 2 of 34
Bimodal DNA Content (Cell Cycle)
DNA content per cell (n = 1,500) showing G1 (2N) and G2/M (4N) populations; Gaussian mixture components and their sum are overlaid.

Key findings
- Normality is rejected by every test (Shapiro–Wilk p = 6.6 × 10⁻⁴⁴): the overall mean of 259.3 a.u. falls between the two populations and describes neither.
- BIC selects k = 2: 70.0% of cells at 198.9 a.u. (G1) and 30.0% at 400.3 a.u. (G2/M), a ratio of 2.01.
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 |
|---|---|---|---|---|---|---|---|---|---|
| DNA content | 1,500 | 259.3 | 94.12 | 2.43 | 206.6 | 193.8 – 377 | 151 – 482.9 | 0.894 | -1.03 |
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 |
|---|---|---|---|---|---|---|---|---|
| DNA content | 1,500 | 0.7311 | 6.6 × 10⁻⁴⁴ | 196.1 | 3.7 × 10⁻²⁴ | 0.3208 | < 10⁻³⁰⁰ | 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 'DNA content' rejects normality (p = 0.0000); prefer a rank-based test.
- Group 'DNA content' has n = 1500; at this size a normality test flags departures far too small to affect a t-test. Judge by the skewness/kurtosis and a QQ plot instead.
Cell-cycle populations (Gaussian mixture)
The question a DNA-content histogram asks: how many populations are there, and in what proportions? The mixture is fitted for k = 1–3 and compared by BIC. With diploid G1 and tetraploid G2/M cells, k = 2 should win and the two means should sit in a ~2 : 1 ratio.
DNA content (n = 1,500) — best k by BIC = 2, by AIC = 2
| k | log-likelihood | AIC | BIC | Converged | Components (weight, mean, SD) |
|---|---|---|---|---|---|
| 1 | -8,944.71 | 17,893.4 | 17,904 | yes | 100.0% at μ = 259.3 (σ = 94.09) |
| 2 ★ | -7,270.71 | 14,551.4 | 14,578 | yes | 70.0% at μ = 198.9 (σ = 13.98); 30.0% at μ = 400.3 (σ = 25.45) |
| 3 | -7,269.95 | 14,555.9 | 14,598.4 | no | 70.0% at μ = 198.9 (σ = 13.98); 17.9% at μ = 398.2 (σ = 28.46); 12.1% at μ = 403.5 (σ = 19.79) |
LabTools call
stats.gmmlabtools stats gmm --groups @groups.json --k-max 3
The same method is available as an MCP tool (stats_gmm) and from the desktop app's statistics panel.
LabTools notes
- 'DNA content': BIC prefers 2 components over 1 — the column looks like a mixture, not a single population.
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 | DNA content |
|---|---|
| Grubbs | none |
| Generalised ESD | none |
| Modified z (MAD) | 450 (389.9, 406.2, 468.1, 469.3 …) |
| IQR fences (1.5×) | none |
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
- Grubbs tests only the single most extreme point, so a second outlier can mask the first. On larger samples use method='generalized_esd'.
- 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.
- The IQR rule is descriptive — it has no p-value and flags roughly 0.7% of a perfectly normal sample by construction.
Methods paragraph
Written to go straight into a manuscript.
A 1-D Gaussian mixture was fitted for k = 1–3 (EM, 10 restarts, seed 42). BIC selected k = 2 (BIC 14,578 vs 17,904 for k = 1): G1 70.0% (mean 198.9, σ 14.0) and G2/M 30.0% (mean 400.3, σ 25.5).
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.