9 votos

Visualización de resultados de múltiples modelos de clases latentes

Estoy utilizando el análisis de clase latente para clúster de una muestra de observaciones basadas en un conjunto de variables binarias. Yo estoy usando el R y el paquete de la poLCA. En la ECV, se debe especificar el número de grupos que desea encontrar. En la práctica, las personas que generalmente se ejecuta en varios modelos, cada uno de especificar un número diferente de clases, y, a continuación, utilizar varios criterios para determinar cual es el "mejor" explicación de los datos.

A menudo me resulta muy útil para buscar a través de los diferentes modelos para tratar de entender cómo las observaciones clasificadas en el modelo con clase=(i) son distribuidas por el modelo con clase = (i+1). Al menos, a veces se puede encontrar muy robusta a las agrupaciones que existen independientemente del número de clases en el modelo.

Me gustaría una forma gráfica de estas relaciones, a comunicarse más fácilmente estos resultados complejos en los artículos y a los colegas que no son estadísticamente orientado. Me imagino que esto es muy fácil de hacer en R mediante algún tipo de red simple paquete de gráficos, pero yo simplemente no saben cómo.

Podría alguien por favor me apunte en la dirección correcta. A continuación es el código para reproducir un ejemplo de conjunto de datos. Cada vector xi representa la clasificación de los 100 observaciones, en un modelo con las clases posibles. Quiero gráfico de cómo las observaciones (filas) pasar de una clase a través de las columnas.

x1 <- sample(1:1, 100, replace=T)
x2 <- sample(1:2, 100, replace=T)
x3 <- sample(1:3, 100, replace=T)
x4 <- sample(1:4, 100, replace=T)
x5 <- sample(1:5, 100, replace=T)

results <- cbind (x1, x2, x3, x4, x5)

Me imagino que hay una manera para producir un grafo donde los nodos son las clasificaciones y los bordes de reflejar (pesos, o el color tal vez) el % de las observaciones se mueve a partir de las clasificaciones de un modelo al siguiente. E. g.

enter image description here

ACTUALIZACIÓN: después de Haber algún progreso con el igraph paquete. A partir del código anterior...

la poLCA de los resultados de reciclar los mismos números para describir la pertenencia a la clase, por lo que necesita para hacer un poco de recodificación.

N<-ncol(results) 
n<-0
for(i in 2:N) {
results[,i]<- (results[,i])+((i-1)+n)
n<-((i-1)+n)
}

Entonces usted necesita para obtener todos los de tabulaciones cruzadas y sus frecuencias, y rbind en una matriz de definición de todos los bordes. Probablemente hay una manera mucho más elegante manera de hacer esto.

results <-as.data.frame(results)

g1           <- count(results,c("x1", "x2"))

g2           <- count(results,c("x2", "x3"))
colnames(g2) <- c("x1", "x2", "freq")

g3           <- count(results,c("x3", "x4"))
colnames(g3) <- c("x1", "x2", "freq")

g4           <- count(results,c("x4", "x5"))
colnames(g4) <- c("x1", "x2", "freq")

results <- rbind(g1, g2, g3, g4)

library(igraph)

g1 <- graph.data.frame(results, directed=TRUE)

plot.igraph(g1, layout=layout.reingold.tilford)

enter image description here

Tiempo para jugar más con el igraph opciones, supongo.

3voto

gauss Puntos 110

Hasta ahora, las mejores opciones que he encontrado, gracias a sus sugerencias, son estos:

  library (igraph)
  library (ggparallel)

# Generate random data

  x1 <- sample(1:1, 1000, replace=T)
  x2 <- sample(2:3, 1000, replace=T)
  x3 <- sample(4:6, 1000, replace=T)
  x4 <- sample(7:10, 1000, replace=T)
  x5 <- sample(11:15, 1000, replace=T)
  results <- cbind (x1, x2, x3, x4, x5)
  results <-as.data.frame(results)

# Make a data frame for the edges and counts

  g1           <- count (results, c("x1", "x2"))

  g2           <- count (results, c("x2", "x3"))
  colnames(g2) <- c     ("x1", "x2", "freq")

  g3           <- count (results, c("x3", "x4"))
  colnames(g3) <- c     ("x1", "x2", "freq")

  g4           <- count (results, c("x4", "x5"))
  colnames(g4) <- c     ("x1", "x2", "freq")

  edges        <- rbind (g1, g2, g3, g4)

# Make a data frame for the class sizes

  h1            <- count (results, c("x1"))

  h2            <- count (results, c("x2"))
  colnames (h2) <- c     ("x1", "freq")

  h3            <- count (results, c("x3"))
  colnames (h3) <- c     ("x1", "freq")

  h4            <- count (results, c("x4"))
  colnames (h4) <- c     ("x1", "freq")

  h5            <- count (results, c("x5"))
  colnames (h5) <- c     ("x1", "freq")

  cSizes        <- rbind (h1, h2, h3, h4, h5)

# Graph with igraph

  gph    <- graph.data.frame (edges, directed=TRUE)

  layout <- layout.reingold.tilford (gph, root = 1)
  plot (gph,
        layout           = layout,
        edge.label       = edges$freq, 
            edge.curved      = FALSE,
            edge.label.cex   = .8,
            edge.label.color = "black",
            edge.color       = "grey",
            edge.arrow.mode  = 0,
            vertex.label     = cSizes$x1 , 
        vertex.shape     = "square",
        vertex.size      = cSizes$freq/20)

# The same idea, using ggparallel

  a <- c("x1", "x2", "x3", "x4", "x5")

  ggparallel (list (a), 
              data        = results, 
              method      = "hammock", 
              asp         = .7, 
              alpha       = .5, 
              width       = .5, 
              text.angle = 0)

Hecho con igraph

With Igraph

Hecho con ggparallel

With ggparallel

Muy basto para compartir en una revista, pero ciertamente he encontrado tener un rápido vistazo a estas muy útil.

También hay una opción posible a partir de esta pregunta en stack overflow, pero no he tenido la oportunidad de implementar todavía; y otra posibilidad aquí.

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