【问题标题】:How to use "if" to overcome data are essentially constant error in r?如何使用“如果”来克服数据本质上是 r 中的恒定错误?
【发布时间】:2019-11-12 21:07:20
【问题描述】:

我需要比较对照和疾病样本之间的细菌基因表达丰度。我有一个 R 读取的大型数据集。它包含 58,000 行不同的基因和 6 列。前三列代表对照值,其余三列来自患病患者。

数据是一个矩阵,所有值都是数字。

我是 R 新手,我试图弄清楚如何包含“如果”以防止出现“数据基本不变”错误,我假设这种错误正在发生,因为很多基因表达值都是疾病组和对照组都相同(两组中的一些基因表达值也是0)。

我使用的代码如下;

pvalues <- apply(finalgenecount, 1, function(currRow)
    { t.test(currRow[4:6], currRow[1:3])$p.value } )

我基本上需要找出疾病组和对照组中哪些基因最丰富,并且打算根据上述代码中的 p 值使用倍数变化来识别疾病组中哪些基因增加。

我正在努力正确地包含“如果”以克服我的错误。

如果您有任何建议,请告诉我。 谢谢你

确切的错误信息:

Error in t.test.default(currRow[4:6], currRow[1:3]) : 
  data are essentially constant is the error message.

【问题讨论】:

  • 您好,这是可行的,所以如果无法测试,您想要 NA 吗?一个稍微偏离主题的建议是您可以尝试 DESeq 或 edgeR 之类的东西?给你更多的力量

标签: r


【解决方案1】:

我发现解决这个问题的最佳方法是单独编写函数,然后使用apply 函数。

首先,我们有代表数据。

dat <- structure(c(37L, 1L, 187L, 97L, 162L, 16L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 
                   0L, 3L, 6L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
                   0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), 
                 .Dim = c(6L, 6L), 
                 .Dimnames = list( c("gene1_36040_cov_12.4365_1", 
                                     "gene2_36040_cov_12.4365_3", 
                                     "gene3_32139_cov_10.3119_1", 
                                     "gene4_32139_cov_10.3119_2", 
                                     "gene5_32139_cov_10.3119_3", 
                                     "gene6_27992_cov_10.5976_1" ), 
                                   c("SRR527345", "SRR527312", "SRR527312", 
                                     "SRR52324", "SRR525625", "SRR53526")))

然后我们开发一个函数,再次测试第 4-6 行和第 1-3 行。如果 t 检验失败,它将抛出 NA 而不是错误。

you_function <- function(currRow){

  res <- try(t.test(currRow[4:6], currRow[1:3])$p.value)

  if(grepl(pattern = "Error", x = res)){ 
    return(NA)
  } else {
    res
  }

}

此函数使用try,如果函数失败则返回错误,如果有结果则返回结果。现在你可以应用这个功能了

out <- apply(dat, 1,you_function )

我们还将根据数据中的列名来命名这个新向量。

names(out) <- colnames(dat)

out

这会给我们:

SRR527345 SRR527312 SRR527312  SRR52324 SRR525625  SRR53526 
0.3923287 0.4226497 0.4134629 0.3881068 0.4226497 0.4226497 

现在我们可以添加一个阈值,并且只返回那些满足某个阈值的基因名称。因为上面的值大多>.4,为了说明的目的,我将阈值设置为这个级别。如果您想将阈值降低到 0.05,您可以。


p_thresh <- 0.4

names(out)[out <= p_thresh]

这会给我们:

[1] "SRR527345" "SRR52324" 

对重复相同值的“坏”数据进行测试如下所示:

bad <- matrix(rep(1, 36), ncol = 6)

out <- apply(bad, 1,you_function )

out

输出以下内容。你仍然会收到一条消息,但是


[1] NA NA NA NA NA NA

【讨论】:

  • 谢谢你的上述。我现在有一个错误,上面写着 Error in classes(res) : could not find function "classes"。
  • 抱歉现在试试。应该是类而不是类
  • 感谢您的帮助。我现在正在尝试识别表达存在显着差异的基因(p
  • @Hugh169 现在试试这个
  • @hugh169 没问题。如果解决方案有效,请接受它作为解决方案,以便其他人知道它是有效的解决方案。
【解决方案2】:

您似乎正在将 t.test 应用于两个向量,每行两个三元组。如果任一集合有 3 个相等的值,则会引发错误。

没有您的数据,很难手动定制一个好的解决方案,但您可以只选择这两组元素 1:3 和 4:6 至少有一个元素彼此不同的行。

selection_vector <- !(
finalgenecount[1,] == finalgenecount[2,] | 
finalgenecount[1,] == finalgenecount[3,] | 
finalgenecount[2,] == finalgenecount[3,] | 
finalgenecount[4,] == finalgenecount[5,] | 
finalgenecount[4,] == finalgenecount[6,] | 
finalgenecount[5,] == finalgenecount[6,]
) 

基本上,您只需要使用任一集合上没有值匹配的行。因此“!”在任一集合上的一对列为真的任何情况下反转逻辑检查。可以通过其他方式制作此过滤器,但此方法不需要任何包。

pvalues <- apply(finalgenecount[selection_vector ,], 1, function(currRow)
  {
  t.test(currRow[4:6], currRow[1:3])$p.value})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-29
    • 2022-08-16
    • 2014-05-04
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    相关资源
    最近更新 更多