Estoy usando un análisis de clase latente para agrupar una muestra de observaciones basadas en un conjunto de variables binarias. Estoy usando R y el paquete poLCA. En LCA, debe especificar el número de clústeres que desea encontrar. En la práctica, las personas usualmente ejecutan varios modelos, cada uno especificando un número diferente de clases, y luego usan varios criterios para determinar cuál es la "mejor" explicación de los datos.
A menudo me resulta muy útil mirar a través de los diversos modelos para tratar de comprender cómo las observaciones clasificadas en el modelo con clase = (i) se distribuyen por el modelo con clase = (i + 1). Como mínimo, a veces puede encontrar clústeres muy robustos que existen independientemente del número de clases en el modelo.
Me gustaría una forma de graficar estas relaciones, para comunicar más fácilmente estos resultados complejos en documentos y colegas que no están orientados estadísticamente. Me imagino que esto es muy fácil de hacer en R usando algún tipo de paquete de gráficos de red simple, pero simplemente no sé cómo.
¿Podría alguien señalarme en la dirección correcta? A continuación hay un código para reproducir un conjunto de datos de ejemplo. Cada vector xi representa la clasificación de 100 observaciones, en un modelo con i clases posibles. Quiero graficar cómo las observaciones (filas) se mueven de una clase a otra 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 de producir un gráfico donde los nodos son clasificaciones y los bordes reflejan (por pesos, o color tal vez) el% de observaciones que se mueven de clasificaciones de un modelo a otro. P.ej
ACTUALIZACIÓN: Tener algún progreso con el paquete igraph. A partir del código anterior ...
Los resultados de poLCA reciclan los mismos números para describir la membresía de la clase, por lo que debe 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)
}
Luego debe obtener todas las tabulaciones cruzadas y sus frecuencias, y vincularlas en una matriz que defina todos los bordes. Probablemente haya una forma mucho más elegante 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)
Es hora de jugar más con las opciones de igraph, supongo.
fuente
Respuestas:
Hasta ahora, las mejores opciones que he encontrado, gracias a sus sugerencias, son estas:
Hecho con igraph
Hecho con ggparallel
Todavía es demasiado difícil para compartir en un diario, pero ciertamente he echado un vistazo rápido a estos muy útil.
También hay una posible opción de esta pregunta sobre el desbordamiento de la pila , pero aún no he tenido la oportunidad de implementarlo; y otra posibilidad aquí .
fuente