Я використовую аналіз прихованого класу для кластеризації вибірки спостережень на основі набору бінарних змінних. Я використовую 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, я думаю.