0

我的问题是我有研究结果,我想找到最大的集群并将其绘制为高斯分布。我用 mclust 和 flexmix 包尝试了不同的东西,但有时最大的集群似乎不正确。所以,我希望这里有人可以帮助我优化我的代码。

对于一个可重现的示例,我使用 rnorm() 创建了数据,因为我无法上传我的数据。

例子:

library(mclust)
set.seed(42)
dat <- c(rnorm(15000,50,2), rnorm(3000,52,1), rnorm(1000,55,2), rnorm(500,60,2), rnorm(50,60,4), rnorm(500,45,2), rnorm(250,40,2), rnorm(50,40,4))
mc <- densityMclust(dat, modelNames="V", warn = FALSE, G=1:9)
mat <- matrix(0, mc$G, 3)
colnames(mat) <- c("mean", "sd", "proportion")
for (i in 1 : mc$G){
  mat[i, 1] <- mc$parameters$mean[i]
  mat[i, 2] <- sqrt(mc$parameters$variance$sigmasq[i])
  mat[i, 3] <- mc$parameters$pro[i]
}
max <- which.max(mat[, 3])
results_of_max <- mat[max, 1 : 3]

d <- density(dat)
d1 <- dnorm(d$x, results_of_max[1], results_of_max[2])* results_of_max[3]
plot(d$x, d$y, type = "l", xlab = "result", ylab = "density")
lines(d$x, d1, col = "red", lwd = 2)

这是我得到的结果:

在此处输入图像描述

但我想要的更像是这样的:

在此处输入图像描述

这只是一个例子。我知道我创建此示例的方式可能会导致此结果,但我只想说明我的问题。我有几个数据集。有时 mclust 会找到最大的集群,但有时结果有点偏离,就像我的例子一样。我拥有的数据集相似,但高斯分布的形状和大小可能会有所不同。我需要找到一个可用于所有数据集并始终获得满意结果的解决方案。

我喜欢设置 modelNames="V" 因为高斯分布的方差可能会有所不同,如果可能的话,我想设置 G=1:9,因为我知道我的数据有一个大集群,但也有几个较小的集群。

所以我的问题是,我能用这个函数做些什么来保证我总是得到我想要的结果,还是有其他包可以更好地解决我的问题?

我知道最大的集群至少有 70% 的数据。我可以将此作为知识来获得我想要的东西,还是可以使用该模式以某种方式优化我的代码?

任何帮助,将不胜感激。

4

0 回答 0