alterlab-pydeseq2 — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited alterlab-pydeseq2 (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
PyDESeq2 is a Python implementation of DESeq2 for differential expression analysis with bulk RNA-seq data. It supports complete workflows from data loading through result interpretation, including single-factor and multi-factor designs, Wald tests with multiple-testing correction, optional apeGLM shrinkage, and integration with pandas and AnnData.
Use this skill when:
uv pip install "pydeseq2>=0.5,<0.6"System requirements (pydeseq2 0.5.x): Python ≥3.11; numpy ≥2.0, pandas ≥2.2, scipy ≥1.12, scikit-learn ≥1.4, anndata ≥0.11, formulaic ≥1.0.2 (parses the ~ design formula), matplotlib ≥3.9. These are pulled in automatically as dependencies.
API note (0.4+): parallelism is configured through an inference object, not a bare n_cpus= kwarg:
from pydeseq2.default_inference import DefaultInference
inference = DefaultInference(n_cpus=8)
dds = DeseqDataSet(counts=counts_df, metadata=metadata, design="~condition", inference=inference)
ds = DeseqStats(dds, contrast=["condition", "treated", "control"], inference=inference).T if loaded genes × samples); filter low-count genes (e.g., total reads < 10); drop samples with missing metadata."~condition", "~batch + condition"); put adjustment variables before the variable of interest.DeseqDataSet(...).deseq2() runs the full pipeline (size factors → dispersions → LFCs → Cook's outliers).DeseqStats(dds, contrast=[var, test, ref]).summary(); read results_df.ds.lfc_shrink() for visualization/ranking only; p-values stay unshrunken.padj < 0.05, plot volcano/MA, save CSV/pickle.Minimal skeleton:
from pydeseq2.dds import DeseqDataSet
from pydeseq2.ds import DeseqStats
dds = DeseqDataSet(counts=counts_df, metadata=metadata, design="~condition")
dds.deseq2()
ds = DeseqStats(dds, contrast=["condition", "treated", "control"])
ds.summary()
significant = ds.results_df[ds.results_df.padj < 0.05]This skill includes a complete standalone script for standard analyses:
python scripts/run_deseq2_analysis.py \
--counts counts.csv \
--metadata metadata.csv \
--design "~batch + condition" \
--contrast condition treated control \
--output results/ \
--min-counts 10 --alpha 0.05 --n-cpus 4 --plotsIt handles data loading/validation, gene+sample filtering, the full DESeq2 pipeline, statistical testing with customizable parameters, result export (CSV, pickle), and optional volcano/MA plots. Refer users to scripts/run_deseq2_analysis.py for batch-processing multiple datasets.
references/pipeline_steps.md.references/interpretation_and_plots.md.references/interpretation_and_plots.md.references/api_reference.md.references/workflow_guide.md..T if needed."~batch + condition").padj < 0.05 (Benjamini-Hochberg FDR), not raw p-values.[variable, test_level, reference_level].~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.