Estou usando a análise de classe latente para agrupar uma amostra de observações com base em um conjunto de variáveis binárias. Estou usando R e o pacote poLCA. No LCA, você deve especificar o número de clusters que deseja encontrar. Na prática, as pessoas geralmente executam vários modelos, cada um especificando um número diferente de classes, e depois usam vários critérios para determinar qual é a "melhor" explicação dos dados.
Costumo achar muito útil examinar os vários modelos para tentar entender como as observações classificadas no modelo com classe = (i) são distribuídas pelo modelo com classe = (i + 1). No mínimo, às vezes você pode encontrar clusters muito robustos que existem, independentemente do número de classes no modelo.
Eu gostaria de uma maneira de representar graficamente esses relacionamentos, de comunicar mais facilmente esses resultados complexos em artigos e de colegas que não são estatisticamente orientados. Imagino que isso seja muito fácil de fazer no R usando algum tipo de pacote simples de rede, mas simplesmente não sei como.
Alguém poderia me apontar na direção certa. Abaixo está o código para reproduzir um exemplo de conjunto de dados. Cada vetor xi representa a classificação de 100 observações, em um modelo com i classes possíveis. Quero representar graficamente como as observações (linhas) se movem de uma classe para outra nas colunas.
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)
Imagino que haja uma maneira de produzir um gráfico em que os nós sejam classificações e as bordas reflitam (por pesos ou cor, talvez) a% de observações que passam das classificações de um modelo para o próximo. Por exemplo
ATUALIZAÇÃO: Progredindo com o pacote igraph. A partir do código acima ...
Os resultados do poLCA reciclam os mesmos números para descrever a associação à classe, então você precisa recodificar um pouco.
N<-ncol(results)
n<-0
for(i in 2:N) {
results[,i]<- (results[,i])+((i-1)+n)
n<-((i-1)+n)
}
Então você precisa obter todas as tabulações cruzadas e suas frequências e uni-las em uma matriz definindo todas as arestas. Provavelmente existe uma maneira muito mais elegante de fazer isso.
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)
Hora de jogar mais com as opções de gráficos, eu acho.