5 votos

cómo descartar los valores que están lejos del centro del cluster en el modelo de mezcla

Estoy intentando ajustar un modelo de conglomerados bivariante con X e Y. Lo que me gustaría hacer es descartar (hacer no conglomerados / no agrupados) los que están lejos del centro del conglomerado (por ejemplo $\mu$ + 2*desviación estándar) en cada dirección.

X2 <- c(rnorm(150, 10, 1),rnorm(50, 10, 5),  rnorm(150, 25,1),
    rnorm(50, 25, 20), rnorm(200,35,1),  rnorm(200,80,1), rpois(50,30))
Y2 <- c(rnorm(800, 30, 2), rpois(50,30))
df <- cbind (X2, Y2)
plot(df, pch = 20, col = "gray40", ylim = c(15,45), xlim = c(-10, 90))

enter image description here

Estoy esperando 4 clusters aquí y me gustaría agrupar sólo aquellos dentro de la elipse que tiene alta probabilidad (digamos con en $\mu$ + 2*desviación estándar tanto en X como en Y) y hacer el resto sin agrupar.

Esto es lo que se intentó con el modelo de mezcla:

require(mixtools)
out <- mvnormalmixEM(df, lambda = NULL, mu = NULL, sigma = NULL, k = 4,
 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)

No sé cómo poner tal umbral aquí.

enter image description here

2voto

Ashish Puntos 11

Aquí está la solución utilizando el modelo de mezcla con el paquete mcluster . La idea es proporcionar valores atípicos previos que se ajusten al criterio de la media de la variable Y o X más el doble de la sd de la variable X o Y.

 X2 <- c(rnorm(150, 10, 1),rnorm(50, 10, 5),  rnorm(150, 25,1),
    rnorm(50, 25, 20), rnorm(200,35,1),  rnorm(200,60,1), rpois(50,30))
Y2 <- c(rnorm(800, 30, 3), rpois(50,30))
df <- cbind (X2, Y2)
plot(df, pch = 20, col = "gray40", ylim = c(15,45), xlim = c(-10, 90))

cálculo de la media y la varianza:

Xvar = sd(X2)
Xmean <- mean(X2)
Yvar = sd(Y2)
Ymean = mean (Y2))

Ahora se identifican los posibles valores atípicos:

noiseINIT <- X2 > (Xmean + Xvar*2) & Y2 >(Ymean + Yvar*2)

Aquí hay que tener en cuenta que la variación no es para la varianza de un clúster en particular, sino que media y varianza global no dentro de cada grupo.

dfbic <- mclustBIC(df,G=4,
initialization = list(noise = noiseINIT))

dfsummary <- summary(dfbic, df)
dfsummary
mclust2Dplot(df, classification=dfsummary$classification,
parameters=dfsummary$parameters,  symbols = 18)

enter image description here

Si desea realizar una agrupación previa y encontrar la media y la covarianza para la predicción del ruido, puede hacerlo utilizando mixtools de la siguiente manera:

require(mixtools)
out <- mvnormalmixEM(df, lambda = NULL, mu = NULL, sigma = NULL, k = 4,
 arbmean = TRUE, arbvar = TRUE, epsilon = 1e-08,  maxit = 10000, verb = FALSE)
    out$mu 

[[1]]
[1] 10.03088 29.73584

[[2]]
[1] 23.25702 30.02964

[[3]]
[1] 34.92314 29.87429

[[4]]
[1] 59.86794 29.77950

out$sigma
[[1]]
           [,1]       [,2]
[1,]  0.9130767 -0.2981406
[2,] -0.2981406  7.4559937

[[2]]
           [,1]      [,2]
[1,] 100.751791 -1.319039
[2,]  -1.319039 12.157087

[[3]]
          [,1]      [,2]
[1,] 0.9950905 0.7062686
[2,] 0.7062686 8.8444094

[[4]]
           [,1]       [,2]
[1,]  1.0882691 -0.4201116
[2,] -0.4201116  9.4550932

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X