J'utilise l'analyse de classe latente pour regrouper un échantillon d'observations basé sur un ensemble de variables binaires. J'utilise R et le package poLCA. Dans LCA, vous devez spécifier le nombre de clusters que vous souhaitez rechercher. Dans la pratique, les gens exécutent généralement plusieurs modèles, chacun spécifiant un nombre différent de classes, puis utilisent divers critères pour déterminer quelle est la "meilleure" explication des données.
Je trouve souvent très utile de parcourir les différents modèles pour essayer de comprendre comment les observations classées dans le modèle de classe = (i) sont distribuées par le modèle de classe = (i + 1). À tout le moins, vous pouvez parfois trouver des clusters très robustes qui existent quel que soit le nombre de classes dans le modèle.
Je voudrais un moyen de représenter graphiquement ces relations, de communiquer plus facilement ces résultats complexes dans des articles et à des collègues qui ne sont pas statistiquement orientés. J'imagine que c'est très facile à faire dans R en utilisant une sorte de package graphique réseau simple, mais je ne sais tout simplement pas comment.
Quelqu'un pourrait-il m'orienter dans la bonne direction? Ci-dessous, le code pour reproduire un exemple de jeu de données. Chaque vecteur xi représente la classification de 100 observations, dans un modèle avec i classes possibles. Je veux représenter graphiquement comment les observations (lignes) se déplacent d'une classe à l'autre à travers les colonnes.
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)
J'imagine qu'il existe un moyen de produire un graphique où les nœuds sont des classifications et les bords reflètent (en poids, ou en couleur peut-être) le% d'observations passant des classifications d'un modèle au suivant. Par exemple
MISE À JOUR: Avoir des progrès avec le package igraph. À partir du code ci-dessus ...
Les résultats poLCA recyclent les mêmes nombres pour décrire l'appartenance à la classe, vous devez donc faire un peu de recodage.
N<-ncol(results)
n<-0
for(i in 2:N) {
results[,i]<- (results[,i])+((i-1)+n)
n<-((i-1)+n)
}
Ensuite, vous devez obtenir toutes les tabulations croisées et leurs fréquences, et les lier dans une matrice définissant tous les bords. Il existe probablement une manière beaucoup plus élégante de procéder.
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)
Il est temps de jouer plus avec les options igraph, je suppose.
la source
Réponses:
Jusqu'à présent, les meilleures options que j'ai trouvées, grâce à vos suggestions, sont les suivantes:
Fait avec igraph
Fait avec ggparallel
Encore trop difficile à partager dans un journal, mais j'ai certainement trouvé utile de les consulter rapidement.
Il y a aussi une option possible de cette question sur le débordement de pile , mais je n'ai pas encore eu l'occasion de l'implémenter; et une autre possibilité ici .
la source