两步集群
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
好像都换了簇。
我有一个这种格式的数据集:
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
好像都换了簇。