Validation

Benchmarks

BulkSeq Studio is validated by a benchmark suite (B1–B15) that tests the pipeline against simulated ground truth, established tools, and itself across input modes, aligners, differential-expression engines, and organisms. The full benchmark snapshot — tables, figures, and pinned environments — is deposited on Zenodo, and the accompanying manuscript is in preparation for submission to a peer-reviewed journal.

Every number below traces to a checksummed result table in the deposited archive. Cite the snapshot as 10.5281/zenodo.20955660.

B1–B10: the core validation

Ten benchmark families, each probing one part of the default analysis (STAR to featureCounts to DESeq2 to clusterProfiler enrichment). Headline results:

BenchmarkWhat it testsHeadline result
B1Correctness vs simulated ground truth (count- and read-level)Power, precision, and fold-change recovery rise with replication; read-level FDR controlled (0.048 +/- 0.006 over 6 seeds), LFC Pearson 0.976
B2FDR / null calibration under a true nullRaw p-values near nominal 0.05; BH false positives essentially absent at n=10 (mean 0.8 / 12000 genes); inherits DESeq2 small-sample behaviour, motivating the 4-6 replicate guidance
B3Accuracy curves (iCOBRA TPR vs observed FDR)Power ordered n10 > n5 > n3 at every FDR; observed FDR tightens toward nominal as replication grows
B4Concordance vs nf-core/rnaseq 3.14.0LFC Spearman 0.97-0.99, DEG Jaccard 0.81-0.91, CAT top-100 0.85-0.93 across a fly and a fungus; all acceptance criteria met
B5Internal aligner concordance (STAR / HISAT2 / Salmon)STAR and HISAT2 near-identical (LFC r 0.985-0.9997); Salmon agrees on fold change (r 0.94-0.996) with expected boundary-DEG differences
B6Input-mode equivalence (count-matrix, bring-your-own DESeq2)Both entry points reproduce the FASTQ-path DESeq2 exactly (max abs diff = 0 on all result columns; up/down Jaccard 1.0) across three anchors
B7Microarray (limma) route validationvs canonical limma-trend-robust: logFC Pearson 1.0, max abs diff 0, identical DEG sets (440 vs 440), positive control reproduced exactly; cross-platform arm (B7.2) agrees RNA-seq vs microarray (95.7% directional)
B8Multi-organism breadth + non-model enrichmentReal KEGG ORA and STRING networks for a fungus (FGSG_ locus tags) and a crop (RefSeq LOC route) without a Bioconductor OrgDb; g:Profiler fallback recovers 100% of OrgDb GO (exact-or-parent/child)
B9Runtime / memory scaling + large-genome rescueSTAR index RAM scales with genome length (1 to 57.9 GiB) and overflows on wheat; Salmon indexes the same genomes at ~1 GiB, restoring quantification
B10Reproducibility and determinismIdentical sha256 across reruns and thread counts (4 vs 16 cores), max abs LFC diff 0; databases pinned (Ensembl 111, STRING v12.0)

B7.2 and B8: cross-platform and non-model concordance

Two arms within existing families (added in the 0.16.0 revision; still B1–B15, no new families), shown here in benchmark-number order.

B7.2 — cross-platform RNA-seq versus microarray

The microarray and RNA-seq routes were compared on the same biology measured by both technologies: human liver versus kidney (Marioni 2008). The RNA-seq arm (SRA000299, Salmon + DESeq2) and the microarray arm (GSE11045, limma) were joined on gene symbol. Across 16,640 shared genes the per-gene log2 fold changes correlated at Pearson 0.69 (Spearman 0.62), and among the 3,967 genes significant on both platforms the direction agreed for 95.7%. The canonical tissue markers were concordant on both platforms — ALB, APOA1, SERPINA1 up in liver; UMOD, SLC34A1 up in kidney. The moderate fold-change correlation is expected (the two technologies measure expression differently); the strong directional agreement and the marker controls confirm the two routes recover the same biology.

Per-gene log2 fold-change scatter comparing the RNA-seq (DESeq2) and microarray (limma) routes on human liver versus kidney; points follow the identity trend and the tissue markers are labelled
B7.2: cross-platform agreement between the RNA-seq and microarray routes on human liver versus kidney, with the liver and kidney markers labelled.

B8 — g:Profiler-versus-OrgDb GO concordance

The g:Profiler route (the fallback used for non-model organisms) was checked against the gold-standard clusterProfiler + Bioconductor-OrgDb route on one identical gene set, using an organism that has both (the human airway differentially expressed genes). The OrgDb route returned 33 significant GO:BP terms and g:Profiler 69. Exact-term overlap was moderate (Jaccard 0.19), as expected from the different multiple-testing corrections, GO snapshots, and identifier mapping — but every OrgDb term was recovered by g:Profiler at the exact or parent/child level (100%), the two routes ranked the shared terms almost identically (Spearman 0.86), and identifier mapping was high both ways (97% and 99%). The fallback therefore recovers the same GO biology as the OrgDb route, over a somewhat broader term set — support for its use on the non-model organisms that lack an OrgDb.

Venn diagram of significant GO biological-process terms from the OrgDb route and the g:Profiler route on the same human airway gene set, sharing 16 terms
B8: overlap of significant GO:BP terms between the clusterProfiler + OrgDb route and the g:Profiler fallback on one identical gene set (33 vs 69 terms, 16 shared; 100% recovered at the exact or parent/child level).

New in 0.15.0 (B11-B13)

The 0.15.0 snapshot adds three benchmarks covering the analytical surfaces introduced since 0.12.1: the STAR gene-counts quantifier, custom gene-set enrichment, and the rRNA-filtering path. Each was adversarially reviewed before deposit.

B11 — STAR gene-counts vs featureCounts

Does the new STAR gene-counts quantifier (counts from STAR's --quantMode GeneCounts) agree with the default featureCounts? Both arms ran on the same BAM and through the identical DESeq2 path, so only the counting algorithm differs.

DatasetStrandCount r (log2)LFC PearsonDEG Jaccard (padj<0.05)DEG Jaccard (+|LFC|≥1)
fgval (F. graminearum)unstranded0.99970.99990.99500.9956
fghs (F. graminearum)reverse1.00001.00000.99930.9991
pasilla (D. melanogaster)unstranded0.99810.99690.96190.9463

The two quantifiers are effectively interchangeable on these data: per-gene counts correlate at r ≥ 0.998, fold changes at Pearson ≥ 0.997, and DEG sets overlap at Jaccard 0.95-1.0. The reverse-stranded case is exact (1.0000). pasilla is the most divergent arm, reflecting its small DEG set, and is reported as-is. The claim is equivalence on these three datasets (two organisms, strand 0 and 2, paired-end), not a universal guarantee.

Log2 fold-change scatter comparing STAR gene-counts against featureCounts for three datasets; points hug the identity line
B11: log2 fold-change agreement between STAR gene-counts and featureCounts across the three datasets.

B12 — custom gene-set enrichment (equivalence check)

This benchmark is an implementation-equivalence / regression check, not an independent validation of the enrichment statistics. A gene set built from the same KEGG sets the built-in route uses is fed back through the custom enrichment engine, and the output is compared to the built-in KEGG result.

  • GSEA reproduces the built-in KEGG GSEA exactly (12 of 12 terms, Jaccard 1.0).
  • ORA reproduces the built-in 4 terms exactly when the universe is matched to the KEGG-annotated background (2619 genes).
  • With its own default universe (all 8280 tested genes) the custom ORA returns 0 terms — the more conservative, defensible background. This is the genuinely informative result, not a discrepancy.
  • A wrong-namespace input (human symbols against FGSG_ ids, 0 overlap) returns REVIEW_REQUIRED rather than a silent empty result — the namespace-mismatch guard fires.

B13 — rRNA filtering (SortMeRNA)

The shipped SortMeRNA command filtered rRNA from six fungal total-RNA samples, then STAR, featureCounts, and DESeq2 ran on the filtered reads. The unfiltered arm is the B11 fghs result, so the two arms differ only in rRNA filtering.

MetricValue
Mean rRNA removed13.1% (11.65-16.09%)
LFC Pearson / Spearman (filtered vs unfiltered)1.000 / 1.000
DEG count padj<0.05 (unfiltered → filtered)5836 → 5827
DEG Jaccard padj<0.050.9978
DEG Jaccard +|LFC|≥10.9963

Removing ~13% of reads as rRNA leaves the differential-expression result essentially unchanged (DEG Jaccard 0.998, fold-change correlation 1.0). The mechanism is direct: although SortMeRNA flagged 12-16% of reads as rRNA, the featureCounts-assigned read pairs fell by only 0.27-0.49% per sample. The rRNA reads were landing on rRNA loci or NoFeatures, not in the protein-coding gene counts that feed DESeq2, so the count matrix is barely perturbed.

Log2 fold-change scatter comparing rRNA-filtered against unfiltered analysis; points fall on the identity line
B13: fold changes are unchanged after rRNA filtering on this library.
Scope This is one fungal total-RNA library with a modest (~13%) rRNA fraction. The supported claim is "filtering had no effect here", not "filtering is unnecessary". Filtering would matter for heavily rRNA-contaminated libraries (degraded, FFPE, or meta-transcriptomic, 50-80% rRNA) and is near-moot for poly-A-selected libraries.

New in 0.16.0 (B14-B15)

The 0.16.0 snapshot adds two benchmarks: concordance of the two optional differential-expression engines against DESeq2, and an applicability check on a human dataset. Both were reviewed before deposit.

B14 — differential-expression engine concordance

The two optional engines (limma-voom and edgeR quasi-likelihood) are validated against DESeq2 on identical count matrices, so only the engine differs. On the Fusarium graminearum spore-versus-mycelium set:

Engine vs DESeq2LFC SpearmanTop-DEG JaccardDirection agreement
limma-voom0.9970.94100%
edgeR quasi-likelihood1.0000.97100%

The two alternatives track DESeq2 closely and agree with it on the direction of every shared differentially expressed gene. DESeq2 remains the default and its result on this set is byte-for-byte unchanged (2,723 up / 2,478 down), so the alternative engines add a cross-check without altering the validated default.

Per-gene log2 fold-change scatter of limma-voom and edgeR against DESeq2; points lie on the identity line
B14: log2 fold-change agreement of limma-voom and edgeR quasi-likelihood against DESeq2 on identical count matrices (Spearman 0.997 and 1.000).

B15 — human-dataset applicability

The other benchmarks use a fungus, a crop, and model animals; B15 checks that the human annotation path runs end to end and recovers known biology. The airway smooth-muscle dexamethasone study (two treated, two control) was processed through the Salmon route against GRCh38 (Ensembl release 111) with org.Hs.eg.db-based enrichment and a STRING network at taxon 9606. Reads were subsampled to about two million pairs per sample, so this is a signature-recovery check on reduced depth, not a full-depth reanalysis.

Under that constraint the pipeline recovered the canonical glucocorticoid-response programme: the most strongly up-regulated genes were the expected dexamethasone targets FKBP5 (adjusted p ~5 × 10⁻²⁴), ZBTB16, KLF15, and SPARCL1, while the pro-inflammatory adhesion molecule VCAM1 was down-regulated, consistent with the known anti-inflammatory action of glucocorticoids. The enrichment step returned GO and KEGG terms and the STRING network built to 117 nodes, so the human path delivers the same enrichment and network outputs as the non-human organisms and confirms the human GRCh38 / Salmon / org.Hs.eg.db route end to end.

Volcano plot of the human airway dexamethasone contrast with canonical glucocorticoid-response genes labelled: FKBP5, ZBTB16, KLF15, SPARCL1 up and VCAM1 down
B15: volcano of the human airway dexamethasone contrast; the canonical glucocorticoid-response signature is recovered (FKBP5, ZBTB16, KLF15, SPARCL1 up; VCAM1 down).
Default pipeline unchanged The 0.13-0.16 features are additive, so B1-B10 carry over without re-running. The core scripts (DESeq2, enrichment, limma, salmon/tximport, count ingest, strandedness inference) are unchanged, the environment lock changed by addition only (no package removed or downgraded), and the F. graminearum baseline of 2723 up / 2478 down reproduces exactly.