【问题标题】:Running Fisher’s exact test on all columns of presence/absence data frame对存在/不存在数据框的所有列运行 Fisher 精确检验
【发布时间】:2023-03-22 05:14:01
【问题描述】:

我有一个数据框,其中包含每个样本中是否存在蛋白质序列,每一行是不同的样本,每列是蛋白质序列,除了最后一列对每个样本进行分组分配。

如下所示:

df <- data.frame(c(0,1,1,1,0,0), c(0,1,0,1,0,1), c(1,0,1,0,0,0), c(0, 0,0,1,1,1)
rownames(df) <- c(“AA”, “AB”, “AC”, “STATUS”)

我想计算每个蛋白质序列(列)的 p 值,以参考相同的状态(最后一列)进行 Fisher 精确检验。我的实际数据集有超过 100000 列,所以我需要一个有效的解决方案。

我面临的挑战是将其输入到每个蛋白质序列的权变矩阵中,以便输入到 Fisher.test 中。完成此操作后,可以对除最后一列之外的所有列进行循环,但我不确定这是最有效的方法。

【问题讨论】:

    标签: r


    【解决方案1】:

    lapply 迭代数据框的列,因此您可以执行以下操作:

    l1 <- lapply(df, fisher.test, y = df$STATUS)
    l1
    
    $AA
    
      Fisher's Exact Test for Count Data
    
    data:  X[[i]] and .$STATUS
    p-value = 1
    alternative hypothesis: true odds ratio is not equal to 1
    95 percent confidence interval:
      0.002852567 14.836128998
    sample estimates:
    odds ratio 
     0.3219834 
    
    
    $AB
    # output truncated...
    

    要仅获取 p 值,请再次使用 lapply

    lapply(l1, function(x) x$p.value)
    
    $AA
    [1] 1
    
    $AB
    [1] 1
    
    $AC
    [1] 0.4
    
    $STATUS
    [1] 0.1
    

    要以可用的形式获得它,您可以unlist它:

    unlist(lapply(l1, function(x) x$p.value))
    
        AA     AB     AC STATUS 
       1.0    1.0    0.4    0.1
    

    显然你想抛弃 STATUS 值,因为这没有多大意义。

    “整洁”的做法是使用purrrbroom

    purrr::map(df, ~fisher.text(.x, df$STATUS)) %>% 
      purrr::map_dfr(broom::tidy, .id = "sequence")
    
      sequence  estimate p.value    conf.low  conf.high                             method alternative
    1       AA 0.3219834     1.0 0.002852567  14.836129 Fisher's Exact Test for Count Data   two.sided
    2       AB 3.1057504     1.0 0.067403027 350.561487 Fisher's Exact Test for Count Data   two.sided
    3       AC 0.0000000     0.4 0.000000000   4.922984 Fisher's Exact Test for Count Data   two.sided
    4   STATUS       Inf     0.1 0.647974586        Inf Fisher's Exact Test for Count Data   two.sided
    

    但我不知道对于那么多列,哪种方法会更快。

    此外,您可能应该关心您在进行这么多测试时的错误率。您是否打算通过某种方法(例如 Bonferroni)调整 p 值?

    【讨论】:

    • 我想用它作为一种特征选择方法来识别在基于 p 值的分类中最有用的变量。我对统计数据不太熟悉,所以您会建议对此进行 p 值校正吗?如果您能用这种方法解释高(?)错误率的原因,我将不胜感激。
    • @JackArnestad,这是stats.stackexchange.com 的问题,在那里人们可能更精通您的领域。
    • 使用测试作为过滤器而不是假设测试可能没问题,但请确保您正确地使用它来实现您的目标。你可以在 research gate 上找到关于这个确切主题的很好的讨论,并且像 @Brian 建议的那样,查看来自 cross-validated 的输入。
    • R 有一个p.adjust 函数。
    猜你喜欢
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    相关资源
    最近更新 更多