DESeq Desk - notice The app's agent prompt is derived from the agent skill "pydeseq2" (@k-dense-ai/pydeseq2, skill version 1.4, skill author K-Dense Inc., targeting pydeseq2 0.5.4) - its workflow scripts/run_deseq2_analysis.py and its result-interpretation and troubleshooting guidance - in the repository k-dense-ai/scientific-agent-skills. https://github.com/k-dense-ai/scientific-agent-skills (skills/pydeseq2) The skill's front matter declares the MIT license. No text of the skill is redistributed verbatim; the prompt was rewritten for this app. The in-browser analysis (deseq.js, deseqkit.js) is an independent JavaScript implementation of the behaviour of pydeseq2 0.5.4 (PyDESeq2, https://github.com/scverse/PyDESeq2, MIT license; Muzellec et al. 2023, Bioinformatics, doi:10.1093/bioinformatics/btad547), which implements DESeq2 (Love, Huber and Anders 2014, Genome Biology, doi:10.1186/s13059-014-0550-8): median-of-ratios size factors, method-of-moments and gene-wise dispersions with the Cox-Reid term, the parametric dispersion trend with its outlier loop and mean fallback, the dispersion prior, MAP dispersions, IRLS fold changes, Cook's distances with outlier replacement and refit, the Wald test, Cook's filtering, independent filtering with pydeseq2's own lowess rule, Benjamini-Hochberg adjustment and the adaptive-prior LFC shrinkage (including the way pydeseq2 builds the Hessian for the shrunk standard error). No pydeseq2 source code or data is included: the page was written from the documented behaviour and checked against the installed package's outputs. detmath.js computes exp, log, log1p and cos from IEEE-754 basic operations after fdlibm's algorithms, so every browser computes the same numbers (browsers disagree on the last bit of their built-in exp, log and cos). fdlibm notice: Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. Developed at SunSoft, a Sun Microsystems, Inc. business. Permission to use, copy, modify, and distribute this software is freely granted, provided that this notice is preserved. lbfgsb.js is a JavaScript port of the L-BFGS-B implementation in SciPy 1.18.1 (scipy/optimize/src/lbfgsb.c, L-BFGS-B 3.0 by Ciyou Zhu, Richard Byrd, Peihuang Lu and Jorge Nocedal, with modifications by Jose Luis Morales), the optimiser pydeseq2 calls. It is distributed under SciPy's BSD-3-Clause license; see LICENSE-scipy.txt. On 123 test problems it reproduced scipy's iterates, evaluation counts, status and final values bit for bit. Verification (2026-09-27, pydeseq2 0.5.4 with scipy 1.18.1 and numpy 2.5.3 on macOS x86_64): 120 random synthetic experiments (2 to 17 samples, two or three condition levels, with and without a batch term, with outlier counts, all-zero groups and cells large enough for the Cook's refit; 49,206 tested genes) and the page's three example datasets run through the skill's own run_deseq2_analysis.py. Size factors and baseMean agreed to within 1e-15; 99.4% of gene-wise dispersions agreed to within 1e-6; the number of genes significant at padj < 0.05 was identical in 119 of 120 experiments (off by one in the other) and in all three examples; 96.2% of p-values agreed within 1% and 98.4% within 5%. The remaining differences trace to genes whose gene-wise dispersion search starts at pydeseq2's 1e-8 floor, where the negative binomial likelihood is a difference of terms near 1e10 and its last digits are rounding noise from the platform's log, exp and log-gamma routines; the line search then goes wherever that noise sends it, and one such gene can move the dispersion trend - and with it every p-value - by a few percent. Found while checking: the skill's run_deseq2_analysis.py writes its results CSVs but then stops with an IORegistryError when it saves deseq_dataset.h5ad under pydeseq2 0.5.4 (anndata cannot write the pd.Series stored in uns["trend_coeffs"]).