【问题标题】:R: How to subset data by two factor columns, then run Fisher's Exact Test for each subset?R:如何按两个因子列对数据进行子集化,然后对每个子集运行 Fisher 精确检验?
【发布时间】:2015-12-22 22:53:00
【问题描述】:

我有一个如下所示的数据框:

Spec.   Month      SampleMethod    Prey1     Prey2 
 AR     April         Opp          37.2      23.2
 AR     April         Clu          40.1      19.2
 AR     April         Hom          2.4       70.1
 MR     April         Opp          34.2      27.2
 MR     April         Clu          48.1      13.2
 MR     April         Hom          10.4      5.4
 AR     May           Opp          32.2      21.2
 AR     May           Clu          42.1      11.2
 AR     May           Hom          8.9       71.1

我想做的是在每个月对每个物种的 SampleMethod 的每个组合进行 Fisher 精确检验(例如“Clu”与“Opp”;“Opp”与“Hom”;“Hom”与.“克鲁”)。我知道如何通过选择每一对并使每一对成为新数据框然后运行 ​​Fisher 测试来做到这一点。但是,我想在这个数据框中以一种有效的方式进行操作。例如,如何指定我想从物种“AR”中选择“四月”月份的“Opp”样本方法,并将其与 Spec 中“四月”月份的“Clu”样本方法进行比较。 “AR”。我基本上是在尝试这样做,然后对这两个选定的行运行 Fisher 精确测试。然后,我必须在 6 个不同的月份对 7 个不同的物种重复这一点,所以任何关于如何做到这一点的帮助都会很棒。

【问题讨论】:

  • 请贴出你写的代码。
  • @user2923027 我要做的基本上是将每个月的每个物种分开,以便每个物种都有自己的数据框。代码(使用 dplyr 包)将是 AR

标签: r subset


【解决方案1】:

通过使用嵌套的sapply 函数,我们将对Spec.Month 的每个组合以及每个子集中SampleMethod 的每个成对组合的数据子集执行Fisher 精确检验。

下面的代码在一个列表中返回所有结果,其中包含Spec.Month 的每个组合的元素,以及每对SampleMethod 的子元素。正是这些子元素包含了测试的输出。

FT.list = sapply(split(DF, list(DF$Spec., DF$Month)), function(dat) {

  # If there are at least two rows in a data subset, then proceed with Fisher Test
  if(nrow(dat)>=2) {

    # Get all pairwise combinations of SampleMethod
    SMs = combn(unique(dat$SampleMethod), 2, simplify=FALSE)

    # Name each element of SMs so that sapply will return the names in each list element
    names(SMs) = lapply(SMs, paste, collapse=", ")

    # For each pair of SampleMethod, run Fisher's Exact Test
    sapply(SMs, function(methods) {
      dat = dat[dat$SampleMethod %in% methods, ]
      fisher.test(dat[, grep("Prey", names(dat))])
    }, simplify=FALSE)

  }
}) 

【讨论】:

  • 不幸的是,这对我不起作用。使这个具有挑战性的一个问题是我正在尝试使用频率数据来运行 fisher.test 而不是计数数据。因此,我的因变量 Prey1 和 Prey2 是不同的独立变量。因此,我需要一种方法来指定我在一个月内以一种样本方法将饮食(它们都是 Prey1 和 Prey2 项目)从一个物种与同一个月同一物种但来自不同样本的饮食进行比较方法。
  • 我可以用来执行此操作的代码只是手动输入每个值,然后运行 ​​Fisher 测试。代码看起来像“fisher.test (rbind (c(37.2, 23.1,9.1, etc.), c(40.1,19.2,3.2, etc.))”。但这需要很长时间并且效率低下。我该怎么做就像指定我要比较的“单元格”一样简单?在 excel 中,它将是 B4:B7(所有猎物变量)与 C4:C7 相比。我不知道如何在 R 中指定它,尽管我是新手。有什么建议吗?
  • 您能否在您的问题中粘贴您将为数据子集的这些 Fisher 测试之一运行的确切代码?不是您评论中的手动方法,而是提取数据的一个相关子集,然后对该子集运行测试。 (理想情况下,您也可以使用 dput 粘贴该子集的数据样本。)然后我想我可以用在每个子集上运行测试的代码填写我的答案。
  • 不确定我是否理解你想要的,但这里有一个我一直在使用的代码示例,虽然效率也很低。 fisher.test(rbind(DF[2,4:7],DF[3,4:7]))...我必须验证这是否正确运行测试,但我相信这是比较第二次和第二次的饮食第三行(假设标题是第一行)
  • 只需通过将结果与手动输入数据进行比较来仔细检查这一点,它就可以工作。然而,问题是它需要我手动完成每一个并跟踪哪个与哪个进行比较!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
  • 2014-11-13
  • 1970-01-01
  • 2014-11-22
  • 2019-07-14
  • 2016-09-28
相关资源
最近更新 更多