K表示具有多个值的变量的聚类

时间:2014-11-12 19:59:45

标签: r cluster-analysis k-means mean

我在下面有一个来自大型数据集的示例数据,其中每个参与者都有多个评分条件。

Participant<-c("p1","p1","p2","p2","p3","p3")
Condition<-c( "c1","c2","c1","c2","c1","c2")
Score<-c(4,5, 5,7,8,2)
T<-data.frame(Participant, Condition, Score)

我正在尝试使用K-mean聚类来分割不同组中的参与者,有没有什么好方法可以做到这一点,考虑到条件不是数字?

谢谢!

3 个答案:

答案 0 :(得分:4)

@Anony有正确的想法。你确实有数字数据 - (显然)每个参与者都有一个c1分数和一个c2分数。因此,您需要转换来自&#34; long&#34;的数据。格式(单列(Score)中的数据,第二列(Condition)将分数区分为&#34;宽&#34;格式(不同条件下不同条件下的分数)。你可以在分数上运行kmeans聚类来对参与者进行分组。

以下是如何在R中执行此操作,使用稍大的示例来演示群集。

# example with 100 Participants in 3 clusters
set.seed(1)    # for reproducibble example
T <- data.frame(Participant=rep(paste0("p",sprintf("%03i",1:100)),each=2),
                Condition  =paste0("c",1:2),
                Score      =c(rpois(70,c(10,25)),rpois(70,c(25,10)),rpois(60,c(15,10))))
head(T)
#   Participant Condition Score
# 1        p001        c1     8
# 2        p001        c2    25
# 3        p002        c1     7
# 4        p002        c2    27
# 5        p003        c1    14
# 6        p003        c2    28
library(reshape2)   # for dcast(...)
# convert from long to wide format
result <- dcast(T,Participant~Condition,value.var="Score")
# k-means on the columns containing scores - look for 3 clusters
result$clust <- kmeans(result[,2:ncol(result)],centers=3)$clust
result[sample(1:100,6),]    # just a random sample of 6 rows
#    Participant c1 c2 clust
# 12        p012 13 21     1
# 24        p024  7 32     1
# 85        p085 10  6     2
# 43        p043 27  5     3
# 48        p048 29 11     3
# 66        p066 24 17     3

现在我们可以绘制得分,显示参与者如何聚类。

# plot the scores for each Participant, color coded by cluster.
plot(c2~c1,result,col=result$clust, pch=20)

编辑:回应OP的评论。

OP希望知道如果参与者/条件有多个分数该怎么办。答案取决于为什么有多个分数。如果重复是随机的并且具有集中趋势,则可能采用均值是合理的,尽管理论上具有更多重复的参与者应该更加重要。

另一方面,假设这些是测试分数。然后通常(但不总是),分数会随着多次坐位而上升。所以这些分数是随机的 - 有一个趋势。在这种情况下,获取最新分数可能更有意义。

作为第三个例子,如果分数用于根据某些政策做出决定(例如SAT,大多数大学使用最高分),那么最合适的聚合函数可能是最大值,而不是平均值。

最后,情况可能是重复次数实际上是一个重要的区别特征。在这种情况下,您不仅要包括分数,还要包括群集时每个参与者/条件的重复次数。这与NCLB下的某些标准化测试有关,学生们会一遍又一遍地进行测试直到他们通过。

顺便说一句:这类问题(评论中的那个)肯定是属于https://stats.stackexchange.com/

答案 1 :(得分:2)

您应该转动您的数据,以便

  1. 每个参与者都是一行
  2. 每个条件都是一列
  3. 得分是您的数据
  4. 试用reshape2包。

答案 2 :(得分:1)

您有3个变量将用于分组数据。其中两个是绝对的,可能会导致问题。您可以使用k-means将数据分组,但您需要为分类数据(条件和参与者)制作假人,并缩放连续变量分数。

在K-means中使用分类数据并不是最佳的,因为k-means无法很好地处理它们。虚拟对象将高度相关,这可能会导致算法对它们施加过多的重量并产生不理想的结果。

由于上述原因,您可以使用不同的技术,例如层次聚类或在数据上运行PCA(为了获得连续不相关的数据),然后在PC分数上执行正常的k均值模型。

这些链接给出了很好的答案: link1 link2

希望有所帮助!