问题描述
我在 deseq2 输出的命名(对比)方面遇到了这个问题,其中输出的命名是不可重现的。通常比较看起来像: variable_level2_vs_level1 ("treat_b_vs_a") 但有时它会作为 variable1(“treat1”)返回。我在其他网站上也看到过有关此问题的帖子,但我从未找到合适的解决方案(也没有找到原因)。
直到现在,这一直是一个非常难以捉摸的问题,因为我无法轻松重现它。 但今天我设法弄明白了,并想出了一个最小的可重现代码,导致了下面的问题。
只有当我运行一个对比度不正确的坏素食 adonis 模型时才会出现问题。 也许有人可以帮助我更好地了解问题的根源
library(vegan)
library(DESeq2)
mat <- matrix(sample(1:1000),ncol=10)
var$treat <- c(rep("a",5),rep("b",5))
var$y <- c(rep("a",10))
dds <- DESeq2::DESeqDataSetFromMatrix(mat,colData = var,design = ~ treat)
dds = DESeq(dds,test="Wald",fitType="parametric")
resultsNames(dds)
它给出了treat_b_vs_a,但如果我在阿多尼斯模型之后再次运行它:
adonis(mat~var$y)
dds <- DESeq2::DESeqDataSetFromMatrix(mat,fitType="parametric")
resultsNames(dds)
我得到了treat1。
因此以某种方式触发 adonis 中的对比度错误会导致 DESeq 错误地处理对比度。
解决方法
简短的回答是,当您运行 adonis 函数时,对比度选项会发生变化。您可以查看此 post 以了解有关对比度的信息。下面是重现您的错误,首先我们将默认选项存储在新设置中:
library(DESeq2)
library(vegan)
default_options = options()
mat <- matrix(sample(1:1000),ncol=10)
da = data.frame(treat = c(rep("a",5),rep("b",5)),y= c(rep("a",10)))
dds <- DESeq2::DESeqDataSetFromMatrix(mat,colData = da,design = ~ treat)
dds = DESeq(dds,test="Wald",fitType="parametric")
以上为您提供了带有名称的结果。我们可以看到环境选项和默认设置是一样的,
options()$contrasts
unordered ordered
"contr.treatment" "contr.poly"
default_options$contrasts
unordered ordered
"contr.treatment" "contr.poly"
现在在示例数据集上运行 adonis
,一切正常:
data(dune)
data(dune.env)
adonis(dune ~ dune.env$Management)
unordered ordered
"contr.treatment" "contr.poly"
运行您的示例,这会引发错误:
adonis(mat~da$y)
options()$contrasts
[1] "contr.sum" "contr.poly"
您可以看到它现在已更改。运行 DESeq2 会给你你看到的结果。你需要把它改回来:
options(contrasts = c(unordered = "contr.treatment",ordered = "contr.poly"))
dds <- DESeq2::DESeqDataSetFromMatrix(mat,fitType="parametric")
resultsNames(dds)
[1] "Intercept" "treat_b_vs_a"
,
我认为您遗漏了一条重要信息:在您的示例中,adonis
失败:
> adonis(mat ~ da$y)
Error in `contrasts<-`(`*tmp*`,value = contr.funs[1 + isOF[nn]]) :
contrasts can be applied only to factors with 2 or more levels
您的 y
是常量(只有一个值)并且无法使用。确实,在 vegan 2.5-x 中我们确实设置了对比度(这是用户选项),但我们稍后会重置它们。但是,如果 adonis
由于无效输入而失败,则不会发生这种重置。
这可以修复,这样我们即使在失败时也可以重置对比度,但未来的版本不会设置对比度,因此我没有计划解决这个问题。