我有一个数据框,其中包含每个样本中蛋白质序列的存在/不存在,每行是不同的样本,每列是蛋白质序列,除了最后一列具有每个样本的组分配。
如下所示:
dd = malloc(2*sizeof(double));
我想计算Fisher精确检验的每个蛋白质序列(列)的p值,并参考相同的状态(最后一栏)。我的实际数据集有超过100000列,所以我需要一个有效的解决方案。
我所面临的挑战是将其转化为每个蛋白质序列的应变矩阵,以输入fisher.test。一旦完成,它可以循环除除最后一列之外的所有列,但我不确定这是最有效的方法。
答案 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 值,因为这没有多大意义。
执行此操作的“整洁”方法是使用purrr
和broom
:
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)?