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

D J*_*Jay 1 r cluster-analysis mean k-means

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

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)
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 K 均值聚类将参与者分成不同的组,考虑到条件不是数字,有什么好的方法吗?

谢谢!

jlh*_*ard 5

@Anony 有正确的想法。您实际上确实有数字数据 - 每个参与者(显然)都有一个 c1 分数和一个 c2 分数。所以,你需要你的数据从“长”格式(在单个列(数据转换Score)和第2列(Condition区分分数),以“宽”格式(在单独的列不同的条件)下得分。然后你可以运行k均值对分数进行聚类以对参与者进行分组。

下面是您在 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
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:对 OP 评论的回应。

OP 想知道如果参与者/条件有多个分数该怎么办。答案取决于为什么有多个分数。如果重复是随机的并且具有集中趋势,那么取平均值可能是合理的,尽管理论上重复次数越多的参与者应该获得更大的权重。

另一方面,假设这些是考试成绩。然后通常(但并非总是如此),分数会随着多次开会而上升。所以这些分数不会是随机的——有一个趋势。在这种情况下,取最近的分数可能更有意义。

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

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

顺便说一句:这种类型的问题(您评论中的问题)绝对属于https://stats.stackexchange.com/