>RNA-seq 差异表达分析全流程中文助手。基于 PyDESeq2 进行建模,自动完成设计矩阵验证、差异分析、火山图/MA图/PCA图绘制、结果表格导出。
RNA-seq 差异表达分析全流程助手是一项面向实际任务的技能,主要用于参考代码基于以下版本:;pydeseq2 0.4+;
使用前验证环境:;如未安装:;国内加速源:;基于 PyDESeq2(DESeq2 的 Python 实现),对 bulk RNA-seq 原始 count 矩阵进行;差异表达分析,自动完成:设计矩阵验证 → 模型。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
参考代码基于以下版本:
pydeseq2 0.4+pandas 2.2+numpy 1.26+matplotlib 3.8+使用前验证环境:
python -c "import pydeseq2, pandas; print(pydeseq2.__version__, pandas.__version__)"
如未安装:
pip install pydeseq2 pandas numpy matplotlib scipy
国内加速源:
pip install pydeseq2 pandas numpy matplotlib scipy -i https://pypi.tuna.tsinghua.edu.cn/simple
基于 PyDESeq2(DESeq2 的 Python 实现),对 bulk RNA-seq 原始 count 矩阵进行 差异表达分析,自动完成:设计矩阵验证 → 模型拟合 → 显著性筛选 → 可视化出图 → 结果导出。输出可直接用于论文或投稿。
| 重复数 | 建议 |
|---|---|
| 每组 1 个重复 | 不建议做正式差异分析,结果不可靠 |
| 每组 2 个重复 | 可以做,但结论需保守解读 |
| 每组 ≥3 个重复 | 标准分析流程,结果可信 |
| 输入 | 格式 | 说明 |
|---|---|---|
| count 矩阵 | CSV/TSV,行为基因,列为样本 | 必须是原始整数 count,不能是 TPM 或 FPKM |
| 样本元数据 | CSV/TSV | 必须包含分组列(如 condition) |
| gene | sample_1 | sample_2 | sample_3 | sample_4 | sample_5 | sample_6 |
|---|---|---|---|---|---|---|
| ACTB | 1234 | 1156 | 1302 | 980 | 1050 | 1100 |
| IL6 | 45 | 52 | 38 | 890 | 920 | 870 |
| ... | ... | ... | ... | ... | ... | ... |
| sample | condition | batch |
|---|---|---|
| sample_1 | control | B1 |
| sample_2 | control | B1 |
| sample_3 | control | B2 |
| sample_4 | treated | B1 |
| sample_5 | treated | B2 |
| sample_6 | treated | B2 |
在拟合模型前,必须检查:
如果存在混杂因素,必须警告用户并建议重新设计实验。
from pydeseq2.dds import DeseqDataSet
from pydeseq2.ds import DeseqStats
# 读取数据(自动检测分隔符)
import pandas as pd
counts_df = pd.read_csv("counts.csv", index_col=0)
metadata_df = pd.read_csv("metadata.csv", index_col=0)
# 构建 DESeq2 数据集
dds = DeseqDataSet(
counts=counts_df,
metadata=metadata_df,
design_factors=["condition", "batch"], # 根据实际设计调整
)
dds.deseq2()
# 定义比较(treated vs control)
stats = DeseqStats(dds, contrast=("condition", "treated", "control"))
stats.summary()
res = stats.results_df.sort_values("padj")
重要:必须使用 raw count,不能用 TPM / FPKM / log 转换后的值。
# 默认阈值:padj < 0.05 且 |log2FC| >= 1
sig = res[(res["padj"] < 0.05) & (res["log2FoldChange"].abs() >= 1)]
# 导出完整结果
res.to_csv("results/de_results.tsv", sep="t")
# 导出显著差异基因
sig.to_csv("results/de_significant.tsv", sep="t")
# 导出排名基因列表(用于后续富集分析)
res.sort_values("stat", ascending=False).to_csv("results/de_ranked_genes.tsv", sep="t")
用户可通过自然语言指定阈值:
至少绘制以下三张图:
图 1:样本 PCA 图
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
# 使用 DESeq2 标准化后的 count
norm_counts = np.log1p(dds.obsm["design_matrix"] @ dds.varm["disp"]) # 或用 rlog/vst
pca = PCA(n_components=2)
coords = pca.fit_transform(norm_counts.T)
fig, ax = plt.subplots(figsize=(8, 6))
for cond in metadata_df["condition"].unique():
mask = metadata_df["condition"] == cond
ax.scatter(coords[mask, 0], coords[mask, 1], label=cond, s=80, alpha=0.7)
ax.set_xlabel(f"PC1 ({pca.explained_variance_ratio_[0]*100:.1f}%)")
ax.set_ylabel(f"PC2 ({pca.explained_variance_ratio_[1]*100:.1f}%)")
ax.legend()
ax.set_title("Sample PCA")
plt.savefig("figures/sample_pca.pdf", bbox_inches="tight")
图 2:火山图(Volcano Plot)
fig, ax = plt.subplots(figsize=(8, 6))
ax.scatter(res["log2FoldChange"], -np.log10(res["padj"]),
c="#cccccc", s=10, alpha=0.5)
sig_up = res[(res["padj"] < 0.05) & (res["log2FoldChange"] >= 1)]
sig_dn = res[(res["padj"] < 0.05) & (res["log2FoldChange"] <= -1)]
ax.scatter(sig_up["log2FoldChange"], -np.log10(sig_up["padj"]), c="#e74c3c", s=15, label="Up")
ax.scatter(sig_dn["log2FoldChange"], -np.log10(sig_dn["padj"]), c="#2980b9", s=15, label="Down")
ax.axhline(-np.log10(0.05), color="gray", linestyle="--", linewidth=0.8)
ax.axvline(-1, color="gray", linestyle="--", linewidth=0.8)
ax.axvline(1, color="gray", linestyle="--", linewidth=0.8)
ax.set_xlabel("log2 Fold Change")
ax.set_ylabel("-log10(adjusted P-value)")
ax.legend()
ax.set_title("Volcano Plot")
plt.savefig("figures/volcano.pdf", bbox_inches="tight")
图 3:MA Plot
fig, ax = plt.subplots(figsize=(8, 6))
ax.scatter(res["baseMean"], res["log2FoldChange"], c="#cccccc", s=10, alpha=0.5)
sig = res[res["padj"] < 0.05]
ax.scatter(sig["baseMean"], sig["log2FoldChange"], c="#e74c3c", s=15)
ax.set_xscale("log")
ax.axhline(0, color="gray", linewidth=0.5)
ax.set_xlabel("Mean of normalized counts")
ax.set_ylabel("log2 Fold Change")
ax.set_title("MA Plot")
plt.savefig("figures/ma_plot.pdf", bbox_inches="tight")
生成排序基因列表,可直接用于:
ranked = res.sort_values("stat", ascending=False)
ranked["gene"] = ranked.index
ranked[["gene", "stat"]].to_csv("results/ranked_genes_for_GSEA.tsv", sep="t", header=False, index=False)
results/ ├── de_results.tsv # 全部基因的完整结果 ├── de_significant.tsv # 显著差异基因(padj < 0.05 & |log2FC| >= 1) ├── de_ranked_genes.tsv # 按统计量排序的基因列表 └── ranked_genes_for_GSEA.tsv # GSEA 格式(基因 + 统计量) figures/ ├── sample_pca.pdf # 样本 PCA 图 ├── volcano.pdf # 火山图 └── ma_plot.pdf # MA 图
分析完成后,输出以下摘要:
=== 差异表达分析摘要 === 数据集:X 个基因 × Y 个样本 比较组:treated vs control 模型:~ condition + batch 显著差异基因(padj < 0.05 & |log2FC| >= 1):Z 个 上调:A 个 | 下调:B 个 Top 5 上调基因: Gene1 (log2FC=+3.2, padj=1.2e-10) Gene2 (log2FC=+2.8, padj=5.6e-08) ... Top 5 下调基因: Gene3 (log2FC=-3.5, padj=2.1e-12) Gene4 (log2FC=-2.9, padj=8.7e-09) ...
分析完成后,逐项确认:
| 错误 | 后果 | 正确做法 |
|---|---|---|
| 用 TPM 代替 raw count 做差异分析 | 结果不可靠 | 必须用原始整数 count |
| 忽略 batch 效应 | 假阳性增多 | 在 design 中加入 batch |
| 只展示显著基因,隐藏完整表 | 无法评估分析质量 | 同时导出全表和显著基因表 |
| 只看 pvalue 不看 log2FC | 选出大量差异很小但显著的基因 | 必须同时考虑效应量 |
原始技能来源:Bioclaw_Skills_Hub(MIT 协议) 本版本在原始基础上进行了中文化、可视化增强和国内环境适配。
相关专题
热门下载
相关下载
精品课程
共6课时 | 54.7万人学习
共89课时 | 134.1万人学习
共49课时 | 82.6万人学习