两步集群

Two-step cluster

我有一个这种格式的数据集:

structure(list(id = 1:4, var1_before = c(-0.16, -0.31, -0.26, 
-0.77), var2_before = c(-0.7, -1.06, -0.51, -0.81), var3_before = c(2.47, 
2.97, 2.91, 3.01), var4_before = c(-1.08, -1.22, -0.92, -1.16
), var5_before = c(0.54, 0.4, 0.46, 0.79), var1_after = c(-0.43, 
-0.18, -0.59, 0.64), var2_after = c(-0.69, -0.38, -1.19, -0.77
), var3_after = c(2.97, 3.15, 3.35, 1.52), var4_after = c(-1.11, 
-0.99, -1.26, -0.39), var5_after = c(1.22, 0.41, 1.01, 0.24)), class = "data.frame", row.names = c(NA, 
-4L))

每个 id 都是唯一的。

我想做两个集群:

First cluster for variables: var1_before, var2_before, var3_before, var4_before, var5_before
Second cluster for variables: var1_after, var2_after, var3_after, var4_after, var5_after

为此我在 spss 中使用了两步聚类。

如何在 R 中实现?

这个问题很复杂,这就是我解决问题的方式,希望能有所帮助,也许可以开始讨论。

注:

  • 这就是我认为可以解决问题的方法;
  • 我不会两步聚类,所以我用了kmeans;
  • 它基于你的数据,但你可以很容易地概括它:我让它依赖于你的数据,因为它更容易解释。

所以,你用before个变量创建第一个聚类,然后变量的值发生变化(after个变量),你想看看id是否在同一个聚类中.

这让我认为您只需要第一组聚类(对于 before 变量),然后查看 id 是否发生了变化:无需进行第二次聚类,但只需查看是否他们已经从一个集群变成了另一个集群。

# first, you make your model of clustering, I'm using a simple kmeans
set.seed(1234)
model <- kmeans(df[,2:6],2)

# you put the clusters in the dataset
df$before_cluster <- model$cluster

现在的想法是使用新变量(after 变量)计算从 id 到在 before 变量上计算的质心的欧几里德距离:

# for the first cluster
cl1 <- list()
for (i in 1:nrow(df)) {
                      cl1[[i]] <- dist(rbind(df[i,7:11], model$centers[1,] ))
                      }

cl1 <- do.call(rbind, cl1)
colnames(cl1) <- 'first'

# for the second cluster
cl2 <- list()
for (i in 1:nrow(df)) {
                      cl2[[i]] <- dist(rbind(df[i,7:11], model$centers[2,] ))
                      }

cl2 <- do.call(rbind, cl2)
colnames(cl2) <- 'second'

# put them together 
df <- cbind(df, cl1, cl2)

现在是最后一部分,您可以定义是否更改了集群,获取与质心的最小距离(最小 --> 它是新集群),获取 "new" 集群。

df$new_cl <- ifelse(df$first < df$second, 1,2)
df
  id var1_before var2_before var3_before var4_before var5_before var1_after var2_after var3_after var4_after var5_after     first    second before_cluster     first    second new_cl
1  1       -0.16       -0.70        2.47       -1.08        0.54      -0.43      -0.69       2.97      -1.11       1.22 0.6852372 0.8151840              2 0.6852372 0.8151840      1
2  2       -0.31       -1.06        2.97       -1.22        0.40      -0.18      -0.38       3.15      -0.99       0.41 0.7331098 0.5208887              1 0.7331098 0.5208887      2
3  3       -0.26       -0.51        2.91       -0.92        0.46      -0.59      -1.19       3.35      -1.26       1.01 0.6117598 1.1180004              2 0.6117598 1.1180004      1
4  4       -0.77       -0.81        3.01       -1.16        0.79       0.64      -0.77       1.52      -0.39       0.24 2.0848381 1.5994765              1 2.0848381 1.5994765      2

好像都换了簇。