测试Limma是否不变

时间:2019-01-15 10:18:41

标签: r limma

我正在寻找一种方法来鉴定在各种条件下都非常稳定的基因。换句话说,与标准DE分析相反。

标准DE将基因分为两类:一方面发生显着变化,另一方面则是“其余”。 但是,“其余”既包含实际上不发生变化的基因,也包含对其变化信心不足以称其为差异的基因。 我想要的是找到那些没有变化的东西,换句话说,就是那些我可以确信地说我的情况没有变化的东西。

我知道在DEseq中可以通过提供替代的零假设来实现这一点,但是我必须将此作为额外的步骤集成到已经使用limma的其他人的管道中,我想坚持下去。 理想情况下,我想以类似的方式测试DE和不变基因,这在概念上类似于改变DEseq中的H0。

目前要测试DE的代码如下:

# shaping data
comparison <- eBayes(lmFit(my_data, weights = my.weights^2))
results <- limma::topTable(my_data, sort.by = "t",  
                     coef = 1, number = Inf)

作为示例,我很喜欢以下内容,但是从概念上讲,任何事情都可以。

comparison <- eBayes(lmFit(my_data, weights = my.weights^2), ALTERNATIVE_H0 = my_H0)

我知道treat()允许通过提供倍数变化来指定间隔为零的假设,并引用该手册:“它使用间隔为零的假设,其中间隔为[-lfc,lfc]”。
但是,这仍然测试从0附近的中心间隔开始的变化,而我要测试的间隔是[-inf,-lfc] + [lfc,inf]。

我有没有其他选择?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以尝试使用logFC的置信区间来选择您的基因,但是我必须说,这很大程度上取决于您拥有的样本数量以及生物学差异有多强。下面,我展示了一个示例如何实现:

首先,我们使用DESeq2生成示例数据集,我们设置betaSD以使我们有一小部分应显示条件之间差异的基因

library(DESeq2)
library(limma)
set.seed(100)
dds = makeExampleDESeqDataSet(n=2000,betaSD=1)
#pull out the data
DF = colData(dds)
# get out the true fold change
FC = mcols(dds)

现在我们可以在此数据集上运行limma-voom

V = voom(counts(dds),model.matrix(~condition,data=DF))
fit = lmFit(V,model.matrix(~condition,data=DF))
fit = eBayes(fit)
# get the results, in this case, we are interested in the 2nd coef
res = topTable(fit,coef=2,n=nrow(V),confint=TRUE)

因此,有一个选项可以收集函数topTable中倍数变化的95%置信区间。我们这样做并与真实的FC进行比较:

# fill in the true fold change
res$true_FC = FC[rownames(res),"trueBeta"]

我们可以看看估计值和真实值有何不同:

plot(res$logFC,res$true_FC)

enter image description here

因此,假设我们要寻找基因,我们确信倍数变化<1,我们可以做到:

tabResults = function(tab,fc_cutoff){
true_unchange = abs(tab$true_FC)<fc_cutoff
pred_unchange = tab$CI.L>(-fc_cutoff) & res$CI.R <fc_cutoff
list(
X = table(pred_unchange,true_unchange),
expression_distr = aggregate(
tab$AveExpr ~ pred_unchange+true_unchange,data=tab,mean
))
}

tabResults(res,1)$X

             true_unchange
pred_unchange FALSE TRUE
        FALSE   617 1249
        TRUE      7  127

以上结果告诉我们,如果将其限制为95%置信度在+/- 1 FC之内的基因,我们将获得134次命中,其中7次为假(实际倍数变化> 1)。

我们之所以错过某些真正的不变基因,是因为它们的表达水平较低,而我们正确预测的大多数不变基因却具有高表达:

tabResults(res,1)$expression_distr

  pred_unchange true_unchange tab$AveExpr
1         FALSE         FALSE    7.102364
2          TRUE         FALSE    8.737670
3         FALSE          TRUE    6.867615
4          TRUE          TRUE   10.042866

我们可以降低FC,但最终也会减少基因:

tabResults(res,0.7)

             true_unchange
pred_unchange FALSE TRUE
        FALSE   964 1016
        TRUE      1   19

置信区间很大程度上取决于您拥有的样本数量。因此,对于一个数据集,取值为1的临界值将对另一个数据集有所不同。

因此,我想说的是,如果您手头有一个数据集,则可以首先在该数据集上运行DESeq2,获取均值方差关系,然后像我一样模拟数据,以大致猜出倍数变化截止点是可以的,您可能会得到多少,然后从那里做出决定。