DESeq2 的名称在 vegan adonis 出错后发生变化

问题描述

我在 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 由于无效输入而失败,则不会发生这种重置。

这可以修复,这样我们即使在失败时也可以重置对比度,但未来的版本不会设置对比度,因此我没有计划解决这个问题。