寻找相似的二进制序列

Finding Similar Binary Sequences

考虑以下数据集:

id = c(rep("aa", 3), rep("bb", 3), rep("cc", 3))
item = rep(c("run", "jump", "clap"), 3)
day = paste0('Day',1:5)

df = data.frame(id, item)
df[,day] <- c(rbinom(5, 1, 0.5), 
              rbinom(5, 1, 0.5), 
              rbinom(5, 1, 0.5), 
              rbinom(5, 1, 0.5), 
              rbinom(5, 1, 0.5), 
              rbinom(5, 1, 0.5), 
              rbinom(5, 1, 0.5), 
              rbinom(5, 1, 0.5), 
              rbinom(5, 1, 0.5)
              )

产生这个:

  id item Day1 Day2 Day3 Day4 Day5
1 aa  run    0    1    0    0    0
2 aa jump    0    1    0    1    0
3 aa clap    0    0    0    0    0
4 bb  run    0    0    1    1    1
5 bb jump    1    1    0    1    1
6 bb clap    0    1    0    1    1
7 cc  run    1    1    1    1    1
8 cc jump    0    1    1    1    1
9 cc clap    0    1    0    1    0

我想确定三个对象 (aa, bb, cc) 中哪一个在日常拍手、运行 和跳跃习惯方面具有相似的模式。

我在寻找某种聚类方法吗?我试过的一件事是把每个二进制序列分开,把它们变成5个字符串,然后排序。这提供了一个不错的视觉效果,但我正在寻找更多程序化和更少手动的东西。

有什么想法吗?谢谢!

您可以使用 cluster 包中的曼哈顿距离尝试 daisy

set.seed(1)
df[,day] <- c(rbinom(5, 1, 0.5), 
          rbinom(5, 1, 0.5), 
          rbinom(5, 1, 0.5), 
          rbinom(5, 1, 0.5), 
          rbinom(5, 1, 0.5), 
          rbinom(5, 1, 0.5), 
          rbinom(5, 1, 0.5), 
          rbinom(5, 1, 0.5), 
          rbinom(5, 1, 0.5)
          )
df
  id item Day1 Day2 Day3 Day4 Day5
1 aa  run    0    0    0    0    1
2 aa jump    0    0    1    1    0
3 aa clap    1    0    1    0    1
4 bb  run    1    1    0    0    0
5 bb jump    0    0    1    1    1
6 bb clap    1    1    0    0    1
7 cc  run    1    0    0    0    1
8 cc jump    1    1    0    1    1
9 cc clap    1    1    0    1    1

我们将通过运行、跳跃和拍手来比较三个科目。

require(cluster)

lapply(split(df, df$item), function(xx) {
    xx <- data.frame(xx[, -c(1, 2)], row.names=xx$id)
    daisy(xx, metric="manhattan")
})

$clap
Dissimilarities :
   aa bb
bb  2   
cc  3  1

Metric :  manhattan 
Number of objects : 3

$jump
Dissimilarities :
   aa bb
bb  1   
cc  4  3

Metric :  manhattan 
Number of objects : 3

$run
Dissimilarities :
   aa bb
bb  3   
cc  1  2

更高的成对数字意味着更不相似。例如,对 aa/bb for 运行 有数字 3,它是每一天的差异。