我正在使用dplyr和broom计算我的数据的kmeans。我的数据包含一组测试和训练集的X和Y坐标,并且根据某个参数值(在这种情况下为lambda)进行分组:
mds.test = data.frame()
for(l in seq(0.1, 0.9, by=0.2)) {
new.dist <- run.distance.model(x, y, lambda=l)
mds <- preform.mds(new.dist, ndim=2)
mds.test <- rbind(mds.test, cbind(mds$space, design[,c(1,3,4,5)], lambda=rep(l, nrow(mds$space)), data="test"))
}
> head(mds.test)
Comp1 Comp2 Transcripts Genes Timepoint Run lambda data
7A_0_AAGCCTAGCGAC -0.06690476 -0.25519106 68125 9324 Day 0 7A 0.1 test
7A_0_AAATGACTGGCC -0.15292848 0.04310200 28443 6746 Day 0 7A 0.1 test
7A_0_CATCTCGTTCTA -0.12529445 0.13022908 27360 6318 Day 0 7A 0.1 test
7A_0_ACCGGCACATTC -0.33015913 0.14647857 23038 5709 Day 0 7A 0.1 test
7A_0_TATGTCGGAATG -0.25826098 0.05424976 22414 5878 Day 0 7A 0.1 test
7A_0_GAAAAAGGTGAT -0.24349387 0.08071162 21907 6766 Day 0 7A 0.1 test
我已经准备好了以上所述的测试数据集,但我还有一个名为mds.train
的数据集,其中包含我的训练数据坐标。我的最终目标是按lambda分组对两个数据集运行k-means,然后计算测试数据在训练中心处的内部平方和(within.ss)、外部平方和(between.ss)和总平方和(total.ss)。感谢broom的一个很棒的资源,我可以通过简单地执行以下操作来为每个lambda在测试集上运行kmeans:
test.kclusts = mds.test %>%
group_by(lambda) %>%
do(kclust=kmeans(cbind(.$Comp1, .$Comp2), centers=length(unique(design$Timepoint))))
那么我可以计算每个 $\lambda$ 中每个聚类的数据中心:
test.clusters = test.kclusts %>%
group_by(lambda) %>%
do(tidy(.$kclust[[1]]))
我现在遇到了瓶颈。如何像参考页面上所示计算特征分配(例如 kclusts %>% group_by(k) %>% do(augment(.$kclust[[1]], points.matrix))
),其中我的 points.matrix
是 mds.test
,它是一个数据框,行数应该是 length(unique(mds.test$lambda))
倍。是否有一种方法可以使用来自训练集的中心来计算基于测试分配的glance()
统计信息?
非常感谢任何帮助!谢谢!
编辑:更新进展。我已经找出了如何聚合测试/训练分配,但仍然无法尝试从两个集合(基于测试中心的训练分配和基于训练中心的测试分配)计算k均值统计信息。下面是更新后的代码:
test.kclusts = mds.test %>% group_by(lambda) %>% do(kclust=kmeans(cbind(.$Comp1, .$Comp2), centers=length(unique(design$Timepoint))))
test.clusters = test.kclusts %>% group_by(lambda) %>% do(tidy(.$kclust[[1]]))
test.clusterings = test.kclusts %>% group_by(lambda) %>% do(glance(.$kclust[[1]]))
test.assignments = left_join(test.kclusts, mds.test) %>% group_by(lambda) %>% do(augment(.$kclust[[1]], cbind(.$Comp1, .$Comp2)))
train.kclusts = mds.train %>% group_by(lambda) %>% do(kclust=kmeans(cbind(.$Comp1, .$Comp2), centers=length(unique(design$Timepoint))))
train.clusters = train.kclusts %>% group_by(lambda) %>% do(tidy(.$kclust[[1]]))
train.clusterings = train.kclusts %>% group_by(lambda) %>% do(glance(.$kclust[[1]]))
train.assignments = left_join(train.kclusts, mds.train) %>% group_by(lambda) %>% do(augment(.$kclust[[1]], cbind(.$Comp1, .$Comp2)))
test.assignments$data = "test"
train.assignments$data = "train"
merge.assignments = rbind(test.assignments, train.assignments)
merge.assignments %>% filter(., data=='test') %>% group_by(lambda) ... ?
我在下面附上了一张图表,展示了我到目前为止的进展。再次强调,我想计算kmeans统计量(组内平方和、总平方和和组间平方和)应用于测试分配/坐标的训练数据中心(中心看起来不准确的那些图表):
![enter image description here](https://istack.dev59.com/Pfd8x.webp)