在存在/不存在数据帧的所有列上运行Fisher精确测试

时间:2018-04-10 17:53:37

标签: r

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

如下所示:

dd = malloc(2*sizeof(double));

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

我所面临的挑战是将其转化为每个蛋白质序列的应变矩阵,以输入fisher.test。一旦完成,它可以循环除除最后一列之外的所有列,但我不确定这是最有效的方法。

1 个答案:

答案 0 :(得分: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

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

此外,您可能应该关注那些许多测试的错误率。您是否计划通过某种方法调整p值(例如Bonferroni)?