【问题标题】:compare co-occurrence matrices比较共现矩阵
【发布时间】:2019-06-06 19:09:12
【问题描述】:

我不确定表达这一点的最佳方式,也许我的目标比我努力实现它更容易。我正在尝试比较两个共现矩阵(MatA 和 MatB),它们的站点为行,每个站点出现的物种为列,1=存在,0=不存在。这是一些较小的假数据:

>MatA
        G. magnirostris  G. fortis  G. fuliginosa G. difficilis
Site1        0           0              1            1 
Site2        1           0              1            1
Site3        0           1              1            0

>MatB 
           G. magnirostris  G. fortis   G. fuliginosa   G. difficilis
Jefferson    1               1           0               0 
Hillsdale    0               1           1               1

对于 MatB 中的每一行(站点),我想搜索 MatA 中的每一行(站点),并首先计算有多少物种同时出现,如果可能的话,跟踪哪些物种。因此,对于 Jefferson 站点,在 MatA 中,G. magnirostris 和 G. fortis 物种的组合从未发生过。所以结果=0。 对于 Hillsdale,这 3 个物种(G. fuliginosa、G. fortis 和 G. difficilis)从未像所有 3 个物种一样出现,但有两种组合: G. fortis & G. fuliginosa,然后是 G. fuliginosa & G. difficilis。

我应该提到我有数百列(物种)和数千行(站点)。我尝试使用 MatA %*% t(MatB) 进行矩阵乘法作为开始的一种方式,但它错误为不合格,我认为这不是我想要的。任何有关如何设置的建议都会非常有帮助。这几天一直在为此苦苦挣扎!

编辑:我编写了 MatA (MatA.probs) 的成对共现概率矩阵。我现在想计算 MatB 中每行(站点)的物种匹配的组合概率。例如:

>MatA.prob
                G. magnirostris   G. fortis    G. fuliginosa  G. difficilis
G. magnirostris       NA          0                 1           1
G. fortis             0          NA                 1           2
G. fuliginosa         1          1                  NA          2
G. difficilis         1          0                  2           NA

然后,在 Jefferson 中,物种组合的组合概率将 = 0,因为该组合从未发生,但在 Hillsdale,对于三种可能的组合中的每一种,它将是 1 * 0* 2。我如何逐行匹配 MatB 中的物种组合来计算这个?

【问题讨论】:

  • 如果您在有数百列时关心all possible combinations,我不确定这是否可以解决,即使您只考虑每行中存在的物种。
  • 感谢您的回复并帮助我思考这个问题!我做了一些更新,将 MatA 转换为概率矩阵。我想我可以计算每行 MatB 的组合概率。见编辑。我现在仍然确定如何将 colnames 与代码匹配...
  • 我意识到你可以以不同的方式看待这个问题,我已经更新了我的答案。

标签: r dplyr lookup binary-data


【解决方案1】:

我意识到您不必计算所有组合, 这是您可以解决原始问题的一种方法, 其中每一行都是来自MatB(或其中的一个子集)的样本,出现在MatA

library(dplyr)

ans <- apply(MatB, 1L, function(r) {
  matching_names <- colnames(MatA)[r == 1L]
  nonmatching_names <- setdiff(colnames(MatA), matching_names)

  MatA %>%
    filter_at(vars(!!nonmatching_names), all_vars(. == 0L)) %>%
    filter_at(vars(!!matching_names), any_vars(. == 1L)) %>%
    mutate(site_total = nrow(.))
}) %>%
  bind_rows(.id = "site")
       site G.magnirostris G.fortis G.fuliginosa G.difficilis site_total
1 Hillsdale              0        0            1            1          2
2 Hillsdale              0        1            1            0          2

【讨论】:

  • 非常感谢!您如何看待尝试使用我的概率矩阵来修改它?因此,您可以在 MatB 中按行(或按站点分组)匹配物种 ==1,而不是生成的 0/1 表,并从 MatA.prob 中对所有匹配的物种共现概率进行多个匹配。然后我可以 group_by 站点或跨它们的逐行倍数以获得组合概率。我喜欢 R 和 dplyr,但学习曲线陡峭。
  • 对不起,你把我弄丢了,我不确定你是如何计算最后一个矩阵的。
猜你喜欢
  • 1970-01-01
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多