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 均值聚类将参与者分成不同的组,考虑到条件不是数字,有什么好的方法吗?
谢谢!
@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/。