All examples · Example 18 of 34
Bubble Chart: Biomarker Discovery
Forty candidate biomarkers plotted by log2 fold change and −log10 p; dashed lines mark p = 0.05 and ±1 log2 fold change.

Key findings
- 19 of 40 biomarkers have raw p < 0.05; 15 survive Benjamini–Hochberg, 9 Holm and 9 Bonferroni.
- The choice of correction changes the hit list — which is why LabTools reports which error rate each method controls.
Forty candidates, four ways to correct
Screening 40 biomarkers at α = 0.05 would produce two false positives by chance alone. The same 40 p-values are corrected four ways: Bonferroni and Holm control the chance of even one false positive; Benjamini–Hochberg and Benjamini–Yekutieli control the expected share of false discoveries and keep far more power in a screen.
40 tests, α = 0.05
| Correction | Controls | Tests | Raw p < 0.05 | Significant after correction |
|---|---|---|---|---|
| Bonferroni | family-wise error | 40 | 19 | 9 |
| Holm | family-wise error | 40 | 19 | 9 |
| Benjamini–Hochberg | false discovery rate | 40 | 19 | 15 |
| Benjamini–Yekutieli | false discovery rate | 40 | 19 | 10 |
LabTools calls (4)
stats.adjustlabtools stats adjust --p-values @p_values.json --labels @labels.json --method bonferroni --alpha 0.05
stats.adjustlabtools stats adjust --p-values @p_values.json --labels @labels.json --method holm --alpha 0.05
stats.adjustlabtools stats adjust --p-values @p_values.json --labels @labels.json --method benjamini-hochberg --alpha 0.05
stats.adjustlabtools stats adjust --p-values @p_values.json --labels @labels.json --method benjamini-yekutieli --alpha 0.05
The same method is available as an MCP tool (stats_adjust) and from the desktop app's statistics panel.
Top 15 by raw p
| Biomarker | log2 FC | Cohort n | Raw p | Bonferroni | Holm | BH | BY |
|---|---|---|---|---|---|---|---|
| BM-34 | -2.74 | 49 | 1.8 × 10⁻⁷ | 7.2 × 10⁻⁶ | 7.2 × 10⁻⁶ | 6.4 × 10⁻⁶ | 2.7 × 10⁻⁵ |
| BM-40 | -2.68 | 234 | 4.1 × 10⁻⁷ | 1.6 × 10⁻⁵ | 1.6 × 10⁻⁵ | 6.4 × 10⁻⁶ | 2.7 × 10⁻⁵ |
| BM-38 | 2.8 | 68 | 4.8 × 10⁻⁷ | 1.9 × 10⁻⁵ | 1.8 × 10⁻⁵ | 6.4 × 10⁻⁶ | 2.7 × 10⁻⁵ |
| BM-33 | 2.19 | 76 | 6.0 × 10⁻⁶ | 0.0002 | 0.0002 | 6.0 × 10⁻⁵ | 0.0003 |
| BM-32 | -1.63 | 145 | 6.4 × 10⁻⁵ | 0.003 | 0.002 | 0.0005 | 0.002 |
| BM-35 | -1.7 | 99 | 0.0003 | 0.011 | 0.009 | 0.002 | 0.008 |
| BM-31 | 1.22 | 132 | 0.0003 | 0.013 | 0.011 | 0.002 | 0.008 |
| BM-39 | -1.76 | 86 | 0.0006 | 0.026 | 0.021 | 0.003 | 0.014 |
| BM-36 | 1.43 | 114 | 0.0008 | 0.033 | 0.026 | 0.004 | 0.015 |
| BM-37 | -1.32 | 95 | 0.002 | 0.098 | 0.076 | 0.010 | 0.042 |
| BM-18 | 0.69 | 126 | 0.006 | 0.22 | 0.17 | 0.020 | 0.087 |
| BM-04 | -1 | 45 | 0.007 | 0.28 | 0.20 | 0.023 | 0.10 |
| BM-27 | 0.57 | 162 | 0.009 | 0.36 | 0.25 | 0.026 | 0.11 |
| BM-22 | 0.68 | 86 | 0.009 | 0.37 | 0.25 | 0.026 | 0.11 |
| BM-19 | 0.8 | 112 | 0.011 | 0.42 | 0.27 | 0.028 | 0.12 |
LabTools notes
- 10 comparison(s) were significant on the raw p-values but are not after correction. Report the adjusted values.
- Holm controls the same familywise error rate as Bonferroni and rejects at least as much, so there is no statistical reason to prefer bonferroni.
- 4 comparison(s) were significant on the raw p-values but are not after correction. Report the adjusted values.
- 9 comparison(s) were significant on the raw p-values but are not after correction. Report the adjusted values.
Effect size vs evidence
Is the evidence for a biomarker just a matter of cohort size? Rank correlations between |log2 fold change|, −log10 p and cohort size.
|log2 fold change| vs −log10 p
| Coefficient | Estimate | r² | n | p |
|---|---|---|---|---|
| Pearson r (linear) | 0.98 | 0.9603 | 40 | 3.1 × 10⁻²⁸ |
| Spearman ρ (monotonic, rank) | 0.9335 | — | 40 | 1.6 × 10⁻¹⁸ |
| Kendall τ (rank, tie-robust; normal-approximation p) | 0.8 | — | 40 | 3.6 × 10⁻¹³ |
LabTools calls (3)
stats.correlationlabtools stats correlation --a @|log2_FC|.json --b @-log10_p.json --method pearson
stats.correlationlabtools stats correlation --a @|log2_FC|.json --b @-log10_p.json --method spearman
stats.correlationlabtools stats correlation --a @|log2_FC|.json --b @-log10_p.json --method kendall
The same method is available as an MCP tool (stats_correlation) and from the desktop app's statistics panel.
LabTools notes
- Pearson's r measures LINEAR association only, and is sensitive to outliers. A scatter plot (plot.create kind='scatter') is worth a look before reporting it; use method='spearman' if the relationship is monotonic but curved.
Cohort size vs −log10 p
| Coefficient | Estimate | r² | n | p |
|---|---|---|---|---|
| Pearson r (linear) | -0.1461 | 0.02134 | 40 | 0.37 |
| Spearman ρ (monotonic, rank) | -0.1674 | — | 40 | 0.30 |
| Kendall τ (rank, tie-robust; normal-approximation p) | -0.1308 | — | 40 | 0.23 |
LabTools calls (3)
stats.correlationlabtools stats correlation --a @Cohort_n.json --b @-log10_p.json --method pearson
stats.correlationlabtools stats correlation --a @Cohort_n.json --b @-log10_p.json --method spearman
stats.correlationlabtools stats correlation --a @Cohort_n.json --b @-log10_p.json --method kendall
The same method is available as an MCP tool (stats_correlation) and from the desktop app's statistics panel.
LabTools notes
- Pearson's r measures LINEAR association only, and is sensitive to outliers. A scatter plot (plot.create kind='scatter') is worth a look before reporting it; use method='spearman' if the relationship is monotonic but curved.
Methods paragraph
Written to go straight into a manuscript.
p-values for the 40 candidates were adjusted by Benjamini–Hochberg; 15 of 40 remained significant at FDR 5% (19 before correction).
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.