PyDESeq2 差分表达分析工作流完全指南:从数据预处理到结果可视化与排错实战
【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000+ scientists worldwide. 165 ready-to-use validated skills plus 100+ scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skills
本篇指南以当前仓库中 PyDESeq2 技能(skill)的完整工作流文档为核心,系统讲解基于 pydeseq2 的 bulk RNA-seq 差分表达分析(Differential Expression Analysis, DEA)全流程。全文覆盖 12 步双阶段分析框架、数据加载与过滤、单因素与多因素实验设计、Wald 检验与多重检验校正、LFC 收缩、结果导出与火山图/MA 图绘制,并结合仓库内的命令行脚本 run_deseq2_analysis.py 与测试用例 test_scripts.py 给出源码级佐证。读完本文,你将能够独立完成从 counts.csv 到显著差异基因列表的完整分析闭环,并掌握常见错误的定位与修复方法。
一、分析框架总览:12 步双阶段流程
一个标准的 PyDESeq2 分析由两个阶段、12 个主要步骤构成,理解这条主线有助于你把握每一步代码在整体流程中的位置。
阶段一:Read Counts 建模(第 1–7 步)
- 归一化(size factor 估计)与离散度(dispersion)估计
- Log 折叠变化(log fold-change, LFC)拟合
- 离群值检测(基于 Cook's distance)
阶段二:统计分析(第 8–12 步)
- Wald 检验
- 多重检验校正(Benjamini-Hochberg FDR 控制)
- 可选的 LFC 收缩(apeGLM shrinkage)
仓库的核心步骤文档 core_workflow_steps.md 将deseq2()方法内部的拟合过程进一步细化为 8 个子步骤,与上文框架一一对应:
- 计算 size factors(归一化)
- 拟合逐基因离散度(genewise dispersions)
- 拟合离散度趋势曲线(dispersion trend curve)
- 计算离散度先验(dispersion priors)
- 拟合 MAP 离散度(即离散度收缩)
- 拟合 log fold changes
- 计算 Cook's distance(离群值检测)
- 若检测到离群值则可选地重新拟合(
refit_cooks=True时)
而命令行脚本 run_deseq2_analysis.py 在执行dds.deseq2()前,会打印这 7 个主要阶段的进度提示(size factors → genewise dispersions → dispersion trend curve → dispersion priors → MAP dispersions → log fold changes → Cook's distances),运行时可据此判断拟合进度。
二、完整工作流代码(可复制运行)
以下是一段覆盖数据加载、过滤、拟合、检验、收缩与结果访问的端到端代码,是全篇文章的“总纲”,后续各节会对其中的每个环节逐一深入:
import pandas as pd from pydeseq2.dds import DeseqDataSet from pydeseq2.default_inference import DefaultInference from pydeseq2.ds import DeseqStats # 加载数据 counts_df = pd.read_csv("counts.csv", index_col=0).T # 按需转置为 samples × genes metadata = pd.read_csv("metadata.csv", index_col=0) # 过滤低表达基因(总计数 < 10 的基因被剔除) genes_to_keep = counts_df.columns[counts_df.sum(axis=0) >= 10] counts_df = counts_df[genes_to_keep] # 移除元数据缺失的样本 samples_to_keep = ~metadata.condition.isna() counts_df = counts_df.loc[samples_to_keep] metadata = metadata.loc[samples_to_keep] # 初始化 DeseqDataSet:显式指定参考水平 metadata["condition"] = pd.Categorical( metadata["condition"], categories=["control", "treated"] ) inference = DefaultInference(n_cpus=4) dds = DeseqDataSet( counts=counts_df, metadata=metadata, design="~condition", refit_cooks=True, inference=inference, ) # 运行归一化与拟合 dds.deseq2() # 执行统计检验(treated vs control) ds = DeseqStats( dds, contrast=["condition", "treated", "control"], alpha=0.05, cooks_filter=True, independent_filter=True, inference=inference, ) ds.summary() # 可选:为可视化应用 LFC 收缩 ds.lfc_shrink(coeff="condition[T.treated]") # 访问结果 results = ds.results_df print(results.head())几点关键说明:
metadata["condition"] = pd.Categorical(..., categories=["control", "treated"])中,categories列表的第一个元素"control"即参考水平(reference level),对比检验都以此为基准;DefaultInference(n_cpus=4)是可并行化的推断后端,建议按机器可用核心数调整;- PyDESeq2 0.5.x 已不再支持“默认 contrast”,必须显式传入
contrast(见 api_reference.md 中的版本兼容说明)。
三、数据加载与预处理
3.1 从 CSV / TSV 加载
计数数据常见的落盘格式是genes × samples(基因行为),而 PyDESeq2 要求samples × genes(样本行为、基因列为列),因此通常需要转置:
import pandas as pd # 加载计数矩阵(genes × samples) counts_df = pd.read_csv("counts.csv", index_col=0) # 转置为 samples × genes counts_df = counts_df.T # 加载元数据(本身就是 samples × variables 格式) metadata = pd.read_csv("metadata.csv", index_col=0)从 TSV 加载(只需指定分隔符):
counts_df = pd.read_csv("counts.tsv", sep="\t", index_col=0).T metadata = pd.read_csv("metadata.tsv", sep="\t", index_col=0)3.2 从 AnnData / H5AD 加载
import anndata as ad adata = ad.read_h5ad("counts_and_metadata.h5ad") counts_df = pd.DataFrame(adata.X, index=adata.obs_names, columns=adata.var_names) metadata = adata.obs安全提醒:不要从未受信任的来源加载 pickle 文件(pickle 反序列化可能执行任意代码)。跨工具、跨 Agent、跨协作者传递数据时,优先使用 CSV/TSV 或.h5ad这类可移植格式。
3.3 数据过滤
过滤低计数基因(总 reads < 阈值即剔除,阈值默认 10):
# 移除总 reads 少于 10 的基因 genes_to_keep = counts_df.columns[counts_df.sum(axis=0) >= 10] counts_df = counts_df[genes_to_keep]过滤元数据缺失的样本:
# 移除 'condition' 列为 NA 的样本 samples_to_keep = ~metadata.condition.isna() counts_df = counts_df.loc[samples_to_keep] metadata = metadata.loc[samples_to_keep]多条件组合过滤:
# 只保留同时满足所有条件的样本 mask = ( ~metadata.condition.isna() & (metadata.batch.isin(["batch1", "batch2"])) & (metadata.age >= 18) ) counts_df = counts_df.loc[mask] metadata = metadata.loc[mask]3.4 数据校验
在进入模型拟合前,务必确认数据形态与取值合法:
print(f"Counts shape: {counts_df.shape}") # 应为 (samples, genes) print(f"Metadata shape: {metadata.shape}") # 应为 (samples, variables) print(f"Indices match: {all(counts_df.index == metadata.index)}") # 检查负值:负计数在负二项模型中没有意义 assert (counts_df >= 0).all().all(), "Counts must be non-negative" # 检查非整数值:DESeq2 需要原始整数 read counts assert counts_df.applymap(lambda x: x == int(x)).all().all(), "Counts must be integers"源码级印证:命令行脚本的load_and_validate_data()函数(见 run_deseq2_analysis.py)把这一逻辑固化为自动化检查:
- 用
counts_df.index.equals(metadata.index)做精确对齐判断(该函数注释明确指出:Index.equals同时覆盖长度不一致的情况,而逐元素比较index_a == index_b在长度不同时直接抛错,会导致后续取交集的分支永远走不到); - 检测到负值时抛出
ValueError("Count matrix contains negative values"); - 索引不完全匹配时自动取两个 DataFrame 的交集并对齐。
对应测试 test_scripts.py 中的LoadAndValidateTests进一步验证了这些边界行为:负计数被拒绝(test_negative_counts_are_rejected)、零计数合法(test_zero_counts_are_accepted)、元数据与计数索引乱序时会被重新对齐而不是错位匹配(test_a_reordered_metadata_index_is_realigned_not_left_shuffled)。
四、单因素分析(Single-Factor Analysis)
4.1 简单的两组比较
最常见的情景:处理组 vs 对照组。设计公式~condition表示“基因表达仅由 condition 解释”:
from pydeseq2.dds import DeseqDataSet from pydeseq2.default_inference import DefaultInference from pydeseq2.ds import DeseqStats # 设计:把表达建模为 condition 的函数 inference = DefaultInference(n_cpus=4) dds = DeseqDataSet( counts=counts_df, metadata=metadata, design="~condition", inference=inference, ) dds.deseq2() # 检验 treated vs control ds = DeseqStats( dds, contrast=["condition", "treated", "control"], inference=inference, ) ds.summary() # 结果 results = ds.results_df significant = results[results.padj < 0.05] print(f"Found {len(significant)} significant genes")contrast=["condition", "treated", "control"]的语义是“比较 condition 变量下 treated 相对 control 的变化”,格式固定为[变量, 检验水平, 参考水平]。注意显著性判定应使用校正后的padj < 0.05而非原始pvalue(Benjamini-Hochberg 程序控制错误发现率,参见 SKILL.md 的 Key Reminders)。
4.2 多个两两比较
当存在多个处理组(如 treated_A、treated_B、treated_C)时,可以对同一个dds反复构造DeseqStats,分别与 control 对比:
# 每个处理组分别 vs control treatments = ["treated_A", "treated_B", "treated_C"] all_results = {} for treatment in treatments: ds = DeseqStats( dds, contrast=["condition", treatment, "control"] ) ds.summary() all_results[treatment] = ds.results_df # 横向对比各组显著基因数 for name, results in all_results.items(): sig = results[results.padj < 0.05] print(f"{name}: {len(sig)} significant genes")注意:多次调用DeseqStats并各自summary()时,每次检验都基于同一个拟合好的dds,无需重复执行deseq2()。此模式在 analysis_patterns.md 的 “Multiple Comparisons” 一节中也有等价实现。
五、多因素分析(Multi-Factor Analysis)
5.1 双因素设计:控制批次效应
当样本来自不同批次(batch)时,把batch作为调整变量放入设计公式,再检验 condition 的效应:
# 设计公式同时包含 batch 与 condition dds = DeseqDataSet( counts=counts_df, metadata=metadata, design="~batch + condition" ) dds.deseq2() # 在控制 batch 的前提下检验 condition 效应 ds = DeseqStats( dds, contrast=["condition", "treated", "control"] ) ds.summary()5.2 交互效应(Interaction Effects)
当需要检验“处理效应是否在不同分组间有差异”时(即交互项,例如某药物只在特定基因型下有效),使用冒号语法加入交互项:
# 设计包含交互项 group:condition dds = DeseqDataSet( counts=counts_df, metadata=metadata, design="~group + condition + group:condition" ) dds.deseq2() # 使用与设计矩阵列数严格对应的 numpy 对比向量检验交互项 print(dds.obsm["design_matrix"].columns) interaction_contrast_vector = ... # 例如 np.array([...]),长度等于设计矩阵列数 ds = DeseqStats(dds, contrast=interaction_contrast_vector) ds.summary()交互项通常无法用[变量, 检验水平, 参考水平]三元组表达,因此这里需要构造显式的数值对比向量。关键技巧:先通过dds.obsm["design_matrix"].columns查看 PyDESeq2 实际构建的设计矩阵列名(例如["Intercept", "group[T.g2]", "condition[T.treated]", "group[T.g2]:condition[T.treated]"]),再按列生成向量,长度必须与设计矩阵列数完全一致。
5.3 连续协变量(Continuous Covariates)
年龄、剂量等连续变量可直接放入设计公式,前提是元数据中该列确为数值类型:
# 确保 age 在元数据中是数值型 metadata["age"] = pd.to_numeric(metadata["age"]) dds = DeseqDataSet( counts=counts_df, metadata=metadata, design="~age + condition" ) dds.deseq2()关于连续变量的自动识别,core_workflow_steps.md 指出:连续变量由设计公式自动检测;分类变量可通过C(variable)语法或 pandas 的 category dtype 强制指定。当前仓库的 PyDESeq2 0.5.x 已弃用design_factors、continuous_factors、ref_level等旧构造参数,新工作流一律使用 formulaic/Wilkinson 风格的设计字符串。
六、结果导出与可视化
6.1 保存结果
导出为 CSV:
# 保存全部统计结果 ds.results_df.to_csv("deseq2_results.csv") # 只保存显著基因 significant = ds.results_df[ds.results_df.padj < 0.05] significant.to_csv("significant_genes.csv") # 按 padj 排序后保存 sorted_results = ds.results_df.sort_values("padj") sorted_results.to_csv("sorted_results.csv")保存 DeseqDataSet 为可移植 AnnData:
# 保存为 AnnData/H5AD 供后续检查 dds.to_picklable_anndata().write_h5ad("dds_result.h5ad")读取已保存的结果:
# 读取结果 results = pd.read_csv("deseq2_results.csv", index_col=0) # 读取 AnnData import anndata as ad adata = ad.read_h5ad("dds_result.h5ad")命令行脚本的save_results()函数(run_deseq2_analysis.py)把上述输出固化为四个标准产物:deseq2_results.csv(全量结果)、significant_genes.csv(padj < 0.05)、results_sorted_by_padj.csv(按 padj 升序)、deseq_dataset.h5ad(可移植数据集)。对应测试SaveResultsTests(见 test_scripts.py)还验证了两个细节:padj 恰好等于 0.05 的基因不计入显著(显著性判定是严格的小于号),以及 padj 为 NaN 的被过滤基因在排序时必须排到末尾而非最前。
6.2 基础可视化
火山图(Volcano plot):横轴为 log2 折叠变化,纵轴为-log10(padj),直观展示显著性 vs 效应量:
import matplotlib.pyplot as plt import numpy as np results = ds.results_df.copy() results["-log10(padj)"] = -np.log10(results.padj) plt.figure(figsize=(10, 6)) plt.scatter( results.log2FoldChange, results["-log10(padj)"], alpha=0.5, s=10 ) plt.axhline(-np.log10(0.05), color='red', linestyle='--', label='padj=0.05') plt.axvline(1, color='gray', linestyle='--') plt.axvline(-1, color='gray', linestyle='--') plt.xlabel("Log2 Fold Change") plt.ylabel("-Log10(Adjusted P-value)") plt.title("Volcano Plot") plt.legend() plt.savefig("volcano_plot.png", dpi=300)MA 图:展示折叠变化 vs 平均表达量,可用于观察低表达基因的 LFC 波动:
plt.figure(figsize=(10, 6)) plt.scatter( np.log10(results.baseMean + 1), results.log2FoldChange, alpha=0.5, s=10, c=(results.padj < 0.05), cmap='bwr' ) plt.xlabel("Log10(Base Mean + 1)") plt.ylabel("Log2 Fold Change") plt.title("MA Plot") plt.savefig("ma_plot.png", dpi=300)实现细节:仓库脚本的create_plots()函数(run_deseq2_analysis.py)在绘制前先用-np.log10(results.padj.fillna(1))处理被独立过滤(independent filtering)剔除的基因——它们的 padj 是 NaN,若不填充则-log10(NaN)仍是 NaN,matplotlib 会静默丢弃这些点。测试 test_scripts.py 专门验证了“padj 全为 NaN 时火山图仍能正常生成”这一场景。
七、常见模式与最佳实践
7.1 数据预处理清单
运行 PyDESeq2 之前逐项核对:
- 计数为非负整数
- 矩阵方向为 samples × genes
- counts 与 metadata 的样本名完全一致
- 缺失的元数据值已处理或移除
- 已过滤低计数基因(通常为总计数 < 10)
- 实验因素已正确编码(分类变量用 category dtype 或
C()语法)
7.2 设计公式最佳实践
变量顺序很重要:调整变量放在关注变量之前。
# 正确:先控制 batch,再检验 condition design = "~batch + condition" # 不够理想:condition 排在前面 design = "~condition + batch"离散变量使用分类类型:
metadata["condition"] = metadata["condition"].astype("category") metadata["batch"] = metadata["batch"].astype("category")使用 formulaic 设计语法(PyDESeq2 0.5.x 推荐):
design = "~batch + condition" # 避免使用已弃用的构造参数: # design_factors, continuous_factors, ref_level7.3 统计检验准则
设置合适的 alpha(显著性阈值):
# 标准显著性阈值 ds = DeseqStats(dds, contrast=["condition", "treated", "control"], alpha=0.05) # 探索性分析可用更严格的阈值 ds = DeseqStats(dds, contrast=["condition", "treated", "control"], alpha=0.01)启用独立过滤(independent filtering):过滤低检验功效的基因可以提升整体检验功效,建议默认开启:
# 推荐:过滤低功效检验 ds = DeseqStats(dds, contrast=["condition", "treated", "control"], independent_filter=True) # 仅在有特定理由时关闭 ds = DeseqStats(dds, contrast=["condition", "treated", "control"], independent_filter=False)DeseqStats的完整参数(lfc_null、alt_hypothesis等)可查阅 api_reference.md。其中lfc_null指定零假设下的 log2 折叠变化(默认 0.0),alt_hypothesis支持阈值化检验("greaterAbs"、"lessAbs"、"greater"、"less")。
7.4 LFC 收缩(Shrinkage)的使用时机
何时使用:
- 可视化(火山图、热图)
- 按效应量排序基因
- 为后续验证实验筛选候选基因
何时不使用:
- 报告统计显著性(应使用未收缩的 p 值)
- 基因集富集分析(通常使用未收缩值)
# 同时保存收缩前后两个版本 ds.results_df.to_csv("results_unshrunken.csv") ds.lfc_shrink(coeff="condition[T.treated]") ds.results_df.to_csv("results_shrunken.csv")lfc_shrink(coeff, adapt=True)使用 apeGLM 方法(见 api_reference.md),coeff必须与dds.obsm["design_matrix"]中的实际列名一致(如"condition[T.treated]"),adapt控制是否从 MLE 估计自适应先验尺度。收缩只改变log2FoldChange列,p 值与 padj 保持不变——因此收缩值仅用于可视化/排序,显著性判定始终基于未收缩的统计检验结果。
源码级印证:脚本的infer_shrink_coeff()函数(run_deseq2_analysis.py)会根据 contrast 自动拼接f"{变量}[T.{检验水平}]",然后到真实的设计矩阵dds.obsm["design_matrix"].columns中验证该系数是否存在;若不存在(例如把参考水平当成了检验水平)则抛出带全部可用列名的 ValueError,并提示用--shrink-coeff显式指定或--no-shrink跳过。测试 test_scripts.py 专门覆盖了这一行为。
7.5 内存管理
对于大规模数据集:
# 使用并行处理 inference = DefaultInference(n_cpus=4) dds = DeseqDataSet( counts=counts_df, metadata=metadata, design="~condition", inference=inference, # 根据可用核心数调整 ) # 必要时分批处理 # (把基因拆成若干子集分别分析,最后合并结果)内存优化相关的更多参数还包括DeseqDataSet(low_memory=True)(用后即弃中间结构)以及fit_type("parametric"/"mean")、size_factors_fit_type("ratio"/"poscounts"/"iterative")等建模参数,完整说明见 api_reference.md。
八、排错指南(Troubleshooting)
8.1 报错:counts 与 metadata 索引不匹配
KeyError: Sample names in counts and metadata don't match排查与解决:
# 检查索引 print("Counts samples:", counts_df.index.tolist()) print("Metadata samples:", metadata.index.tolist()) # 需要时对齐 common_samples = counts_df.index.intersection(metadata.index) counts_df = counts_df.loc[common_samples] metadata = metadata.loc[common_samples]8.2 报错:所有基因的总计数为零
ValueError: All genes have zero total counts通常是数据方向问题(忘了转置)。基因数大于样本数时基本可以判定需要转置:
# 检查数据方向 print(f"Counts shape: {counts_df.shape}") # 如果基因 > 样本,很可能需要转置 if counts_df.shape[1] < counts_df.shape[0]: counts_df = counts_df.T8.3 警告:大量基因被过滤掉
先观察基因计数的分布再决定是否调整阈值:
# 查看基因总计数分布 print(counts_df.sum(axis=0).describe()) # 可视化 import matplotlib.pyplot as plt plt.hist(counts_df.sum(axis=0), bins=50, log=True) plt.xlabel("Total counts per gene") plt.ylabel("Frequency") plt.show()必要时放宽过滤阈值:
genes_to_keep = counts_df.columns[counts_df.sum(axis=0) >= 5]注意测试 test_scripts.py 验证了阈值语义:过滤判定是>=(含边界),即总计数恰好等于 10 的基因会被保留。
8.4 报错:设计矩阵不满秩(not full rank)
典型原因是混淆设计(confounded design),例如所有处理组样本都来自同一个批次。
排查:
# 检查设计混淆:交叉表可直观看出 batch 与 condition 是否完全对应 print(pd.crosstab(metadata.condition, metadata.batch))解决:要么删除混淆变量,要么加入交互项:
design = "~condition" # 去掉 batch # 或 design = "~condition + batch + condition:batch" # 加入交互项8.5 没有找到显著基因
可能原因:效应量太小、生物学变异过高、样本量不足、技术问题(批次效应、离群值)。
诊断步骤:
# 检查离散度估计 import matplotlib.pyplot as plt dispersions = dds.var["dispersions"] plt.hist(dispersions, bins=50) plt.xlabel("Dispersion") plt.ylabel("Frequency") plt.show() # 检查 size factors(应接近 1) print("Size factors:", dds.obs["size_factors"]) # 即使不显著,也看看按原始 p 值排名最靠前的基因 top_genes = ds.results_df.nsmallest(20, "pvalue") print(top_genes)额外诊断(来自 SKILL.md 的 Result Interpretation 一节):绘制 p 值分布直方图,健康的结果应“大部分平坦、在 0 附近有尖峰”;padj与|log2FoldChange|组合打分排序(score = -log10(padj) * abs(log2FoldChange))也有助于在弱信号中优先候选基因。
8.6 大数据集上的内存错误
解决方案(按优先级):
# 1. 减少 CPU 核数(看似矛盾,但有时有效) inference = DefaultInference(n_cpus=1) dds = DeseqDataSet(..., inference=inference) # 2. 更激进地过滤 genes_to_keep = counts_df.columns[counts_df.sum(axis=0) >= 20] # 3. 分批处理 # 按基因子集拆分分析,最后合并结果九、命令行脚本:一键完成全流程
除逐段编写 Python 代码外,仓库还提供了开箱即用的 CLI 脚本 run_deseq2_analysis.py,它整合了数据加载校验、过滤、拟合、检验、收缩、导出与可视化:
# 基本用法 python scripts/run_deseq2_analysis.py \ --counts counts.csv \ --metadata metadata.csv \ --design "~condition" \ --contrast condition treated control \ --output results/ # 进阶用法 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 \ --shrink-coeff "condition[T.treated]" \ --plots完整参数表(与脚本argparse定义一致):
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
--counts | 必填 | — | 计数矩阵 CSV 路径 |
--metadata | 必填 | — | 元数据 CSV 路径 |
--design | 必填 | — | 设计公式(如~condition) |
--contrast | 必填 | — | 对比规格:变量 + 检验水平 + 参考水平(三个值) |
--output | 可选 | results | 输出目录 |
--min-counts | 可选 | 10 | 基因过滤的最小总计数阈值 |
--alpha | 可选 | 0.05 | 显著性阈值 |
--no-transpose | 开关 | 关闭 | 若输入已是 samples × genes 则跳过转置 |
--no-shrink | 开关 | 关闭 | 跳过 LFC 收缩 |
--shrink-coeff | 可选 | 自动推断 | 要收缩的设计矩阵系数(如condition[T.treated]) |
--n-cpus | 可选 | 1 | 并行 CPU 核数 |
--plots | 开关 | 关闭 | 生成火山图与 MA 图 |
脚本会打印完整的分析摘要(测试基因总数、显著基因数、上下调基因数、Top 10 显著基因),方便直接判断结果质量。
十、安装与运行环境
本仓库的 PyDESeq2 技能面向 0.5.x 版本,推荐使用 uv 安装:
uv pip install pydeseq2==0.5.4系统与依赖要求(依据 SKILL.md 与 api_reference.md):
- Python 3.11+(PyDESeq2 0.5.3 起已放弃 Python 3.10 支持)
- PyDESeq2 0.5.4
- pandas 2.2.0+
- numpy 2.0.0+
- scipy 1.12.0+
- scikit-learn 1.4.0+
- anndata 0.11.0+
- formulaic 1.0.2+ 与 formulaic-contrasts 0.2.0+
- 可视化可选:matplotlib、seaborn
关于端到端正确性的验证:测试 test_scripts.py 中的EndToEndFitTests构造了一个已知答案的合成数据集——将某个基因在处理组中人为放大 8 倍(即真实 log2 折叠变化为 3),随后验证:(1) 推断出的收缩系数确实存在于 PyDESeq2 实际构建设计矩阵的列中;(2) 拟合恢复出的 LFC 在 log2(8)=3 附近(允许 0.5 的收缩偏移);(3) 该“种植”基因是全表唯一显著的基因;(4) 每个被测基因在结果表中都有对应行。这一测试意味着本文中的工作流在“数据方向 → 对齐 → 阈值 → 收缩系数 → 显著性判定”每一个环节都有自动化回归保障,可以直接作为你自己分析管线的正确性参照。
【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000+ scientists worldwide. 165 ready-to-use validated skills plus 100+ scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考