Я использую скрытый анализ классов для кластеризации выборки наблюдений на основе набора двоичных переменных. Я использую R и пакет poLCA. В LCA необходимо указать количество кластеров, которые вы хотите найти. На практике люди обычно запускают несколько моделей, каждая из которых задает разное количество классов, а затем используют различные критерии, чтобы определить, какое «лучшее» объяснение данных.
Я часто нахожу очень полезным просматривать различные модели, чтобы попытаться понять, как наблюдения, классифицированные в модели с классом = (i), распределяются моделью с классом = (i + 1). По крайней мере, иногда вы можете найти очень надежные кластеры, которые существуют независимо от количества классов в модели.
Я хотел бы, чтобы график этих отношений, чтобы легче сообщать эти сложные результаты в документах и коллегам, которые не ориентированы на статистику. Я полагаю, что это очень легко сделать в R, используя какой-то простой сетевой графический пакет, но я просто не знаю как.
Может ли кто-нибудь, пожалуйста, указать мне в правильном направлении. Ниже приведен код для воспроизведения примера набора данных. Каждый вектор xi представляет классификацию 100 наблюдений в модели с i возможными классами. Я хочу изобразить, как наблюдения (строки) перемещаются из класса в класс по столбцам.
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)
Я предполагаю, что есть способ создать график, где узлы являются классификациями, а ребра отражают (по весам или, возможно, по цвету)% наблюдений, переходящих из классификаций от одной модели к другой. Например
ОБНОВЛЕНИЕ: Имея некоторый прогресс с пакетом igraph. Начиная с кода выше ...
Результаты poLCA перезаписывают одни и те же числа, чтобы описать членство в классе, поэтому вам нужно немного перекодировать.
N<-ncol(results)
n<-0
for(i in 2:N) {
results[,i]<- (results[,i])+((i-1)+n)
n<-((i-1)+n)
}
Затем вам нужно получить все перекрестные таблицы и их частоты и объединить их в одну матрицу, определяющую все ребра. Вероятно, есть гораздо более элегантный способ сделать это.
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)
Думаю, пора больше играть с опциями igraph.
источник
Ответы:
Пока что, благодаря вашим предложениям, я нашел лучшие варианты:
Сделано с игрой
Сделано с ggparallel
Все еще слишком грубо, чтобы делиться этим в журнале, но я определенно обнаружил, что быстрый взгляд на них очень полезен.
В этом вопросе также есть вариант переполнения стека , но у меня еще не было возможности его реализовать; и еще одна возможность здесь .
источник