сравнить матрицы совпадений - PullRequest
0 голосов
/ 06 июня 2019

Я не уверен, что лучший способ выразить это, и, возможно, моя цель легче, чем я пытаюсь это сделать. Я пытаюсь сравнить две матрицы вхождения (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 и сначала посчитать, сколько видов встречается вместе, и, если возможно, отследить, какие виды. Так, для сайта Джефферсон в MatA такая комбинация видов G. magnirostris и G. fortis никогда не встречается. Итак, результат = 0. Для Хиллсдейла 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

Тогда, учитывая, что эта объединенная вероятность комбинации видов в Джефферсоне будет равна = 0, поскольку такая комбинация никогда не встречается, но в Хиллсдейле она будет 1 * 0 * 2 для каждой из трех возможных комбинаций. Как я могу по строкам сопоставить комбинации видов в MatB, чтобы вычислить это?

1 Ответ

0 голосов
/ 07 июня 2019

Я понял, что вам не нужно вычислять все комбинации, вот один способ, которым вы могли бы сделать оригинальную задачу, где каждая строка является выборкой из 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
...