Sto usando l'analisi di classe latente per raggruppare un campione di osservazioni basate su una serie di variabili binarie. Sto usando R e il pacchetto poLCA. In LCA, è necessario specificare il numero di cluster che si desidera trovare. In pratica, le persone di solito eseguono diversi modelli, ognuno dei quali specifica un diverso numero di classi e quindi utilizza vari criteri per determinare quale sia la "migliore" spiegazione dei dati.
Trovo spesso molto utile guardare attraverso i vari modelli per cercare di capire come le osservazioni classificate nel modello con class = (i) sono distribuite dal modello con class = (i + 1). Per lo meno, a volte puoi trovare cluster molto robusti che esistono indipendentemente dal numero di classi nel modello.
Vorrei un modo per rappresentare graficamente queste relazioni, per comunicare più facilmente questi risultati complessi nei documenti e ai colleghi che non sono orientati statisticamente. Immagino che sia molto facile farlo in R usando una sorta di semplice pacchetto grafico di rete, ma semplicemente non so come.
Qualcuno potrebbe indicarmi la giusta direzione. Di seguito è riportato il codice per riprodurre un set di dati di esempio. Ogni vettore xi rappresenta la classificazione di 100 osservazioni, in un modello con i possibili classi. Voglio rappresentare graficamente come le osservazioni (righe) si spostano da una classe all'altra attraverso le colonne.
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)
Immagino che ci sia un modo per produrre un grafico in cui i nodi sono classificazioni e i bordi riflettono (in base al peso o forse al colore) la percentuale di osservazioni che si spostano da classificazioni da un modello a quello successivo. Per esempio
AGGIORNAMENTO: Avere qualche progresso con il pacchetto igraph. A partire dal codice sopra ...
I risultati di poLCA riciclano gli stessi numeri per descrivere l'appartenenza alla classe, quindi devi fare un po 'di ricodifica.
N<-ncol(results)
n<-0
for(i in 2:N) {
results[,i]<- (results[,i])+((i-1)+n)
n<-((i-1)+n)
}
Quindi è necessario ottenere tutte le tabulazioni incrociate e le relative frequenze e raggrupparle in una matrice che definisca tutti i bordi. C'è probabilmente un modo molto più elegante per farlo.
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)
È ora di giocare di più con le opzioni di igraph immagino.