如何生成组间成对共享矩阵并将其可视化

How to generate a matrix of pairwise sharing between groups and visualise it

我有一个 table,其中包含与不同组相关的观察列表。

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 的图块)。

在此先感谢您的帮助。

我不确定这是否是您要找的。以下是基于 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

和热图