Как создать матрицу попарного разделения между группами и визуализировать ее - PullRequest
1 голос
/ 29 апреля 2020

У меня есть таблица со списком наблюдений, связанных с различными группами.

Animal  Sector  Time    Group
Cat 1   Night   A
Cat 1   Night   B
Cat 2   Night   B
Bat 2   Night   A
Bat 3   Night   C
Bat 3   Night   A
Bat 3   Night   B
Mouse   1   Day B
Mouse   2   Night   A
Mouse   2   Night   B
Deer    2   Day A
Deer    2   Night   B
Deer    2   Night   C

Я называю Животное + Сектор + Время, объединенное как наблюдение. В группах нет повторяющихся наблюдений, но в полном наборе данных много групп. Я хотел бы иметь попарную матрицу того, сколько повторяющихся наблюдений сделано между группами. В приведенном выше примере попарно идентичные наблюдения между группами были бы:

Groups A + B:
Cat   1   Night
Bat 3   Night
Mouse   2   Night

Groups A + C:
Bat 3   Night

Groups B + C:
Bat 3   Night
Deer    2   Night

(в группе A и группе B)

Наиболее близким у меня является этот код, он не создает вместо попарной матрицы в ней перечислены общие наблюдения:

df %>% 
  group_by(Animal, Sector, Time) %>% 
  summarise(
    samples = paste(unique(Group), collapse = ""), 
    n = length(unique(Group)))

Меня больше интересует количество общих наблюдений между группами, а не точная идентификация наблюдений.

Если кто-нибудь может дать мне советы о том, как это сделать в dplyr или base R. Это было бы очень полезно.

В конечном итоге цель состоит в том, чтобы визуализировать его с помощью парной матрицы, где каждая плитка дает количество общих наблюдений между 2 группами. Я пытался составить тепловую карту, но я бы предпочел попарную матрицу:

df$observations <- paste(df$Animal,df$Sector,df$Time)
dfpw <- table(df[,c("Group","observations")])
counts <- apply(dfpw,2,sum)
dfpw_shared <- tt[,which(counts>=2)] # shared by at least two groups
heatmap(dfpw_shared ,scale="none")

Эта текущая визуализация идентифицирует наблюдения на оси X и группы на оси Y. Я бы предпочел Группы по осям X и Y и количество наблюдений, совместно используемых в тайлах.

Я бы предпочел, чтобы визуализация показывала попарную матрицу с количеством счетчиков, совместно используемых в тайлах (включая плитки с 0 общими наблюдениями между группами).

Заранее благодарен за любую помощь.

1 Ответ

1 голос
/ 29 апреля 2020

Я не уверен, что это то, что вы ищете. Ниже приведено возможное решение с базой R:

sharedObs <- function(v) {
  p <- do.call(paste,subset(dfs[[v[1]]],select = -Group))
  q <- do.call(paste,subset(dfs[[v[2]]],select = -Group))
  length(intersect(p,q))
}

dfs <- split(df,df$Group)
n <- length(dfs)
mat <- `dimnames<-`(matrix(0,n,n),list(names(dfs),names(dfs)))
mat[lower.tri(mat,diag = FALSE)] <- combn(n,2,sharedObs)
res <- t(mat) + mat

heatmap(res,scale="none")

, которая дает

> res
  A B C
A 0 1 0
B 1 0 0
C 0 0 0

и тепловую карту

enter image description here

...