Aquí hay un script para usar el modelo de mezcla usando mcluster.
X <- c(rnorm(200, 10, 3), rnorm(200, 25,3), rnorm(200,35,3), rnorm(200,65, 3), rnorm(200,80,5))
Y <- c(rnorm(1000, 30, 2))
plot(X,Y, ylim = c(10, 60), pch = 19, col = "gray40")
require(mclust)
xyMclust <- Mclust(data.frame (X,Y))
plot(xyMclust)
En una situación donde hay menos de 5 grupos:
X1 <- c(rnorm(200, 10, 3), rnorm(200, 25,3), rnorm(200,35,3), rnorm(200,80,5))
Y1 <- c(rnorm(800, 30, 2))
xyMclust <- Mclust(data.frame (X1,Y1))
plot(xyMclust)
xyMclust4 <- Mclust(data.frame (X1,Y1), G=3)
plot(xyMclust4)
En este caso estamos ajustando 3 grupos. ¿Qué pasa si encajamos 5 grupos?
xyMclust4 <- Mclust(data.frame (X1,Y1), G=5)
plot(xyMclust4)
Se puede forzar a hacer 5 grupos.
También introduzcamos algo de ruido aleatorio:
X2 <- c(rnorm(200, 10, 3), rnorm(200, 25,3), rnorm(200,35,3), rnorm(200,80,5), runif(50,1,100 ))
Y2 <- c(rnorm(850, 30, 2))
xyMclust1 <- Mclust(data.frame (X2,Y2))
plot(xyMclust1)
mclust
permite la agrupación basada en modelos con ruido, es decir, observaciones periféricas que no pertenecen a ningún grupo. mclust
permite especificar una distribución previa para regularizar el ajuste a los datos. Se priorControl
proporciona una función en mclust para especificar el previo y sus parámetros. Cuando se llama con sus valores predeterminados, invoca otra función llamada defaultPrior
que puede servir como plantilla para especificar alternativas anteriores. Para incluir el ruido en el modelado, se debe proporcionar una estimación inicial de las observaciones de ruido a través del componente de ruido del argumento de inicialización en Mclust
o mclustBIC
.
La otra alternativa sería usar un mixtools
paquete que le permita especificar la media y la sigma para cada componente.
X2 <- c(rnorm(200, 10, 3), rnorm(200, 25,3), rnorm(200,35,3),
rnorm(200,80,5), rpois(50,30))
Y2 <- c(rnorm(800, 30, 2), rpois(50,30))
df <- cbind (X2, Y2)
require(mixtools)
out <- mvnormalmixEM(df, lambda = NULL, mu = NULL, sigma = NULL,
k = 5,arbmean = TRUE, arbvar = TRUE, epsilon = 1e-08, maxit = 10000, verb = FALSE)
plot(out, density = TRUE, alpha = c(0.01, 0.05, 0.10, 0.12, 0.15), marginal = TRUE)