depinwang/jinyang-omentum-subtype-artifact-mechanism-canary-expression-arm-test-v1
jinyang-omentum-subtype-artifact-mechanism-canary-expression-arm-test-v1 Per-gene differential expression between the two canary arms (20 NovaSeq vs 20 non-NovaSeq), from the TPM matrix in jinyang-omentum-subtype-artifact-mechanism-canary-expression-matrix-v1. 78,724 genes, Mann-Whitney U (two-sided, asymptotic), BH-FDR adjusted. Read the composition warning before using any gene from this table. The arm contrast is not a clean platform contrast — see below. Headline… See the full description on the dataset page: https://huggingface.co/datasets/depinwang/jinyang-omentum-subtype-artifact-mechanism-canary-expression-arm-test-v1.
jinyang-omentum-subtype-artifact-mechanism-canary-expression-arm-test-v1
Per-gene differential expression between the two canary arms (20 NovaSeq vs 20 non-NovaSeq), from the TPM matrix in jinyang-omentum-subtype-artifact-mechanism-canary-expression-matrix-v1. 78,724 genes, Mann-Whitney U (two-sided, asymptotic), BH-FDR adjusted.
Read the composition warning before using any gene from this table. The arm contrast is not a clean platform contrast — see below.
Headline
- 12,663 / 78,724 genes (16%) at BH q < 0.05 (11,241 higher on NovaSeq, 858 higher on non-NovaSeq)
- 3 of 6 housekeeping genes differ at raw p < 0.05 (GAPDH p = 0.018, HPRT1 p = 2.7e-06, TUBB p = 0.036)
A Mann-Whitney U test on 20 vs 20 samples with TPM values rounded to 2 decimal places produces heavy ties, which makes the asymptotic test conservative rather than anti-conservative — so 12,663 is, if anything, a lower bound, not an inflated count. The method="asymptotic" choice is stated explicitly rather than left to scipy's "auto", so the exact-vs-asymptotic behaviour cannot silently depend on the tie pattern of a particular matrix.
Why "arms" and not "platforms"
The same comparison at full cohort scale (n = 160) shows the platform split is entangled with clinical and processing variables:
Two of these cannot be adjusted away by including a covariate: seq_set is nested perfectly inside platform (so platform and sequencing batch are one variable here), and DECIDER contributes zero non-NovaSeq samples. The treatment confound is already documented in the red-team brief (item 6), which is why the full analysis carries a treatment-adjusted secondary test; the survival difference (63/113 vs 4/47 alive) is larger than the treatment difference and is recorded here as a new finding.
The practical consequence: 12,663 genes is a list of genes that differ between two groups that differ by platform, sequencing set, cohort, treatment and survival at once. It is not a platform-effect estimate, and it should not be described as one.
Method
- statistic:
scipy.stats.mannwhitneyu(alternative="two-sided", method="asymptotic") - adjustment: Benjamini-Hochberg over all 78,724 genes (cross-checked against
statsmodels.stats.multitest.multipletests(method="fdr_bh")on the same vector, max |diff| = 1.11e-16) - input: TPM, 2 dp. Genes where both arms are constant and equal are left at p = 1.0 rather than being dropped, so every gene in the matrix appears exactly once here.
log2_fc_medianuses a pseudocount of 0.01 TPM to keep zero-valued medians finite; it is a convenience column, and the raw medians are alongside it.
Generated by scripts/analyze_expression.py (wilcoxon_by_arm) from job ePouta 2602738. Source table gates_arm_diff.tsv is attached to the matrix artifact.
