我在下面有一个来自大型数据集的示例数据,其中每个参与者都有多个评分条件。
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聚类来分割不同组中的参与者,有没有什么好方法可以做到这一点,考虑到条件不是数字?
谢谢!
答案 0 :(得分:4)
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)
您应该转动您的数据,以便
试用reshape2
包。
答案 2 :(得分:1)