使用 dplyr::mutate 对数据帧进行 Fisher 的测试统计

Posted

技术标签:

【中文标题】使用 dplyr::mutate 对数据帧进行 Fisher 的测试统计【英文标题】:fisher's test stat on data frame using dplyr::mutate 【发布时间】:2015-05-12 01:48:12 【问题描述】:

如何从 R 中的测试中获取测试统计信息,例如'fisher.test()' 当使用选定的列应用于整个数据框时。我知道如何手动操作,例如获取 p.value:

fisher.test(matrix(c(9,0,1,1),ncol=2))$p.value

给予:

[1] 0.1818182

我需要在数据框上从 fisher.test() 获取 p.value 和估计值,然后看着 this SE question 我受到启发,制作了这样的函数:

fisher <- function(a,b,c,d)
  data <- matrix(c(a,b,c,d),ncol=2)
  c(p = fisher.test(data)$p.value,
    OR = fisher.test(data)$estimate)

这也适用于:

fisher(9,0,1,1)[[1]]

并给我与上面相同的内容。 但是,如何让它在 data.frame 上工作,例如使用 mutate 添加一个名为“p”的列?

require(plyr)
require(dplyr)
data <- 
  data.frame(v1=c(9,10,2,2),
             v2=c(0,8,0,0),
             v3=c(1,1,0,9),
             v4=c(1,2,3,4))
data %>%
mutate(p=fisher(v1,v2,v3,v4)[[1]])

不起作用(它为所有行提供相同的值)。我需要以某种方式“申请”还是可以通过dplyr::do 完成?

【问题讨论】:

您要对什么进行测试? v1 与 v2? v1 + v2 与 v3 + v4?所有组合? 我猜应该是 v1 + v2 vs. v3 + v4 【参考方案1】:

像这样使用“rowwise()”:

fisher <- function(a,b,c,d)
  data <- matrix(c(a,b,c,d),ncol=2)
  c(p = fisher.test(data)$p.value,
    OR = fisher.test(data)$estimate)

data %>%
  rowwise()%>%
  mutate(p=fisher(v1,v2,v3,v4)[[1]],
         OR=fisher(v1,v2,v3,v4)[[2]])

并且 - 从上面的数据 - 我们得到:

  v1 v2 v3 v4         p       OR
1  9  0  1  1 0.1818182      Inf
2 10  8  1  2 0.5864662 2.394164
3  2  0  0  3 0.1000000      Inf
4  2  0  9  4 1.0000000      Inf 

【讨论】:

以上是关于使用 dplyr::mutate 对数据帧进行 Fisher 的测试统计的主要内容,如果未能解决你的问题,请参考以下文章

在 dplyr mutate_at 调用中使用多列的函数

在具有包含数据帧的列表列的小标题中,如何使用自定义函数包装 mutate(foo = map2(...))?

dplyr mutate 中的 for 循环

使用dplyr :: mutate后,为什么给定的属性会消失?

使用 dplyr mutate 函数根据当前行有条件地创建新变量

你能让 dplyr::mutate 和 dplyr::lag 默认 = 自己的输入值吗?