在R

时间:2016-04-25 11:07:43

标签: r for-loop cluster-analysis

作为R相对较新的人,我遇到了创建for循环的问题。

我有一个非常大的数据集,包含9000个观测值和25个分类变量,我已将其转换为二进制数据和预先形成的层次聚类。现在我想尝试K-Modes聚类,使用每个聚类的#34;聚类内简单匹配距离来产生一个弯头图,从kmodes$withindiff输出。我可以对每个k in 1:8星团求和,得到肘部图。

library(klaR)
for(k in 1:8)
{
WCSM[k] <- sum(kmodes(data,k,iter.max=100)$withindiff)
}
plot(1:8,WCSM,type="b", xlab="Number of Clusters",ylab="Within-Cluster 
Simple-Matching Distance Summed", main="K-modes Elbow Plot")

我的问题是我想从k模式进一步输出。对于每个k in 1:8,我想获得整数向量,指示由kmodes$cluster给出的每个对象分配到的集群。我需要创建一个循环遍历每个k in 1:8的for循环,并将每个输出保存到8个单独的向量中。但我不知道怎么做这样的for循环。我可以单独运行8行代码,但每行代码需要花费15分钟才能与iter.max=10一起运行,因此将此值增加到iter.max=100将需要在一夜之间运行,因此循环将非常有用。

cl.kmodes2=kmodes(data, 2,iter.max=100)
cl.kmodes3=kmodes(data, 3,iter.max=100)
cl.kmodes4=kmodes(data, 4,iter.max=100)
cl.kmodes5=kmodes(data, 5,iter.max=100)
cl.kmodes6=kmodes(data, 6,iter.max=100)
cl.kmodes7=kmodes(data, 7,iter.max=100)
cl.kmodes8=kmodes(data, 8,iter.max=100)

最终,我想通过获取调整后的兰德指数,将分层二进制聚类的结果与k模式聚类进行比较。例如,在k=4处为层级集群剪切树,并将其与来自k模式的4集群解决方案进行比较:

dist.binary = dist(data, method="binary")
cl.binary = hclust(dist.binary, method="complete")
hcl.4 = cutree(cl.binary, k = 4)
tab = table(hcl.4, cl.kmodes4$cluster)
library(e1071)
classAgreement(tab)

2 个答案:

答案 0 :(得分:0)

最好的方法是将群集的输出放入命名列表中:

library(klaR)

myClusterList <- list()

for(k in 1:8) {
  myClusterList[[paste0("k.", i)]] <- kmodes(data, i,iter.max=100)
}

然后您可以轻松地提取任何内容:

sum(myClusterList[["k.1"]]$withindiff)

sum(myClusterList[[1]]$withindiff)

您还可以保存列表以便在将来的R会话中使用,请参阅?save

答案 1 :(得分:0)

我同意Imo,使用列表是最好的解决方案。 如果你不想这样做,你也可以使用assign()在每次迭代中创建一个新的向量:

library(klaR)
for(k in 1:8) {
  assign(paste("cl.kmodes", k, sep = ""), kmodes(data, k, iter.max = 100))
}