本系列[1]将开展全新的转录组分析专栏,主要针对使用DESeq2时可能出现的问题和方法进行展开。
对于大多数分析任务,上述步骤的耗时通常不会超过30秒。然而,面对那些设计复杂且样本众多的实验(比如,涉及几十个系数和大约100个样本),用户可能需要比DESeq默认运行更快的计算速度。为此,提供两点建议:
library("BiocParallel")
register(MulticoreParam(4))
可以根据最小的P值对结果表格进行排序。
resOrdered <- res[order(res$pvalue),]
可以使用汇总函数总结一些基本的计数。
summary(res)
image-20241123180220726
有多少个调整后的 p 值小于 0.1?
sum(res$padj < 0.1, na.rm=TRUE)
## [1] 1069
结果函数提供了多种参数,用于定制生成的结果表格。你可以通过查询 ?results 来获取这些参数的详细信息。需要注意的是,结果函数会自动根据每个基因的标准化计数均值进行独立筛选,以优化在给定的假发现率(FDR)阈值,即 α 下,拥有调整后 p 值低于该阈值的基因数量。独立筛选的更多细节将在后文讨论。默认情况下,参数 α 被设定为 0.1。如果调整后的 p 值阈值不是 0.1,那么应该将 α 设置为那个特定的值。
res05 <- results(dds, alpha=0.05)
summary(res05)
image-20241123180339717
sum(res05$padj < 0.05, na.rm=TRUE)
## [1] 853
p值筛选概念的一个扩展是,通过对假设进行权重分配来提升检测能力。Bioconductor 提供了一个名为 IHW 的包,该包实现了独立假设权重(IHW)的方法。在此,展示了如何利用 IHW 对 DESeq2 的结果进行 p 值校正。
# (unevaluated code chunk)
library("IHW")
resIHW <- results(dds, filterFun=ihw)
summary(resIHW)
sum(resIHW$padj < 0.1, na.rm=TRUE)
metadata(resIHW)$ihwResult
高级用户须知,DESeq2 包计算出的所有数据均保存在 DESeqDataSet 或 DESeqResults 对象中,如何获取这些数据的讨论将在后文展开。
在 DESeq2 中,plotMA 函数用于展示在 DESeqDataSet 中所有样本的标准化计数均值基础上,由特定变量引起的 log2 倍数变化。如果调整后的 p 值小于 0.1,相应的点将以蓝色标出。超出视窗范围的点将以空心的向上或向下的三角形表示。
plotMA(res, ylim=c(-2,2))
image-20241123180424090
可视化缩小的 log2 倍数变化的 MA 图更有用,它可以消除与低计数基因的 log2 倍数变化相关的噪声,而不需要任意的过滤阈值。
plotMA(resLFC, ylim=c(-2,2))
在执行了 plotMA 函数之后,用户可以利用 identify 函数通过点击图表来交互式地确定特定基因的行号。接着,用户可以通过保存这些索引值来检索基因的标识符。
idx <- identify(res$baseMean, res$log2FoldChange)
rownames(res)[idx]
Love、Huber 和 Anders提出的调整对数倍数变化(log fold changes)基于一个以零为中心的正态先验分布,其尺度参数会根据数据进行适配。这种收缩后的对数倍数变化有助于进行排序和可视化,且无需对低计数基因设置任意的筛选阈值。然而,正态先验在某些数据集上可能会导致过度收缩。
在上述的 LFC 收缩代码示例中,明确指定了系数为 "
condition_treated_vs_untreated"。或者,也可以通过系数在 resultsNames(dds) 中的顺序来指定它,例如这里可以简单地使用 coef=2。
resultsNames(dds)
## [1] "Intercept" "condition_treated_vs_untreated"
# because we are interested in treated vs untreated, we set 'coef=2'
resNorm <- lfcShrink(dds, coef=2, type="normal")
resAsh <- lfcShrink(dds, coef=2, type="ashr")
par(mfrow=c(1,3), mar=c(4,4,2,1))
xlim <- c(1,1e5); ylim <- c(-3,3)
plotMA(resLFC, xlim=xlim, ylim=ylim, main="apeglm")
plotMA(resNorm, xlim=xlim, ylim=ylim, main="normal")
plotMA(resAsh, xlim=xlim, ylim=ylim, main="ashr")
image-20241123180701044
提示:已经优化了 apeglm 方法,现在它的运行时间与 normal 方法相近,例如,处理大约包含 10,000 个基因和 7 个样本的 pasilla 数据集大约需要 5 秒。如果需要快速估算 LFC 的收缩值,但又不需要后验标准差,可以将 apeMethod 设置为 "nbinomC",这将大幅提升速度(约 10 倍),但会导致 lfcSE 列的值变为不可用(NA)。apeMethod 的另一个选项 "nbinomC*" 包含了随机启动,是一种快速方法的变体。
提示:如果数据中存在不希望的变异(例如,批次效应),建议进行校正。在 DESeq2 中,可以通过在设计中包含已知的批次变量,或者使用 sva 包中的 svaseq 函数/包或 RUVSeq 中的 RUV 函数来估计并校正这些不希望的变异。ashr 的开发者还提供了一种特别的方法,用于结合 ashr 来处理不希望的变异。
检查单个基因在不同组中的读数计数有时也是有益的。plotCounts 函数可以简单地实现这一绘图功能,它根据估计的大小因子(或如果使用了这些,则是归一化因子)来归一化计数,并添加一个 1/2 的伪计数以支持对数刻度绘图。计数会根据 intgroup 中的变量进行分组,允许指定多个变量。在此,选择了上述结果表中 p 值最小的基因。你可以通过基因名称或数字索引来选择要绘制的基因。
plotCounts(dds, gene=which.min(res$padj), intgroup="condition")
对于自定义绘图,参数 returnData 指定该函数应仅返回用于使用 ggplot 绘图的 data.frame。
d <- plotCounts(dds, gene=which.min(res$padj), intgroup="condition",
returnData=TRUE)
library("ggplot2")
ggplot(d, aes(x=condition, y=count)) +
geom_point(position=position_jitter(w=0.1,h=0)) +
scale_y_log10(breaks=c(25,100,400))