如何生成组间成对共享矩阵并将其可视化
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
和热图
我有一个 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
和热图