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.
fonte
Respostas:
Até agora, as melhores opções que encontrei, graças às suas sugestões, são estas:
Feito com igraph
Feito com ggparallel
Ainda é muito difícil compartilhar em um diário, mas certamente achei muito útil dar uma olhada nelas.
Também existe uma opção possível dessa pergunta no estouro de pilha , mas ainda não tive a chance de implementá-la; e outra possibilidade aqui .
fonte