Używam ukrytej analizy klas do grupowania próbki obserwacji na podstawie zestawu zmiennych binarnych. Używam R i pakietu poLCA. W LCA musisz określić liczbę klastrów, które chcesz znaleźć. W praktyce ludzie zwykle uruchamiają kilka modeli, z których każdy określa inną liczbę klas, a następnie używają różnych kryteriów, aby ustalić, które jest „najlepszym” wyjaśnieniem danych.
Często uważam, że bardzo przydatne jest przeglądanie różnych modeli, aby spróbować zrozumieć, w jaki sposób obserwacje sklasyfikowane w modelu o klasie = (i) są rozkładane przez model o klasie = (i + 1). Przynajmniej czasami można znaleźć bardzo solidne klastry, które istnieją niezależnie od liczby klas w modelu.
Chciałbym znaleźć sposób na zobrazowanie tych związków, łatwiejsze przekazywanie tych złożonych wyników w artykułach i współpracownikom, którzy nie są zorientowani statystycznie. Wyobrażam sobie, że jest to bardzo łatwe w R przy użyciu jakiegoś prostego pakietu grafiki sieciowej, ale po prostu nie wiem jak.
Czy ktoś mógłby wskazać mi właściwy kierunek. Poniżej znajduje się kod do odtworzenia przykładowego zestawu danych. Każdy wektor xi reprezentuje klasyfikację 100 obserwacji w modelu z możliwymi klasami. Chcę wykreślić, w jaki sposób obserwacje (wiersze) przemieszczają się między klasami w kolumnach.
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)
Wyobrażam sobie, że istnieje sposób na stworzenie wykresu, w którym węzły są klasyfikacjami, a krawędzie odzwierciedlają (według wagi lub może koloru)% obserwacji przechodzących z klasyfikacji z jednego modelu do drugiego. Na przykład
AKTUALIZACJA: Trochę postępu w pakiecie igraph. Począwszy od powyższego kodu ...
Wyniki poLCA przetwarzają te same liczby, aby opisać członkostwo w klasie, więc trzeba trochę przekodować.
N<-ncol(results)
n<-0
for(i in 2:N) {
results[,i]<- (results[,i])+((i-1)+n)
n<-((i-1)+n)
}
Następnie musisz zebrać wszystkie tabele krzyżowe i ich częstotliwości i powiązać je w jedną macierz definiującą wszystkie krawędzie. Prawdopodobnie jest to o wiele bardziej elegancki sposób.
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)
Czas na więcej zabawy z opcjami igraph.
źródło
Odpowiedzi:
Jak dotąd najlepsze opcje, które znalazłem, dzięki twoim sugestiom, to:
Zrobione z igraph
Zrobione z ggparallel
Wciąż zbyt szorstki, by móc go udostępnić w czasopiśmie, ale z pewnością uważam, że rzuciłem okiem na te bardzo przydatne.
Istnieje również możliwa opcja z tego pytania na temat przepełnienia stosu , ale nie miałem jeszcze okazji go wdrożyć; i inna możliwość tutaj .
źródło