Birden fazla gizli sınıf modelinden sonuçları görselleştirme


9

İkili değişkenler kümesine dayalı bir gözlem örneğini kümelemek için gizli sınıf analizi kullanıyorum. R ve poLCA paketini kullanıyorum. LCA'da, bulmak istediğiniz küme sayısını belirtmeniz gerekir. Pratikte, insanlar genellikle her biri farklı sayıda sınıf belirten birkaç model çalıştırır ve daha sonra verilerin hangisinin "en iyi" açıklaması olduğunu belirlemek için çeşitli kriterler kullanırlar.

Class = (i) ile modelde sınıflandırılan gözlemlerin class = (i + 1) ile model tarafından nasıl dağıtıldığını anlamaya çalışmak için çeşitli modellere bakmak genellikle çok yararlı olur. En azından bazen modeldeki sınıf sayısına bakılmaksızın var olan çok sağlam kümeler bulabilirsiniz.

Bu ilişkileri grafiklendirmenin, bu karmaşık sonuçları gazetelerde ve istatistiksel olarak yönlendirilmemiş meslektaşlara daha kolay iletmenin bir yolunu istiyorum. Bunun bir çeşit basit ağ grafik paketi kullanarak R'de yapmanın çok kolay olduğunu düşünüyorum, ancak nasıl yapacağımı bilmiyorum.

Birisi lütfen beni doğru yöne yönlendirebilir mi? Aşağıda örnek bir veri kümesini yeniden oluşturmak için kod bulunmaktadır. Her xi vektörü, olası sınıfları olan bir modelde 100 gözlemin sınıflandırılmasını temsil eder. Gözlemlerin (satırların) sınıftan sınıfa sütunlar arasında nasıl hareket ettiğini grafik olarak çizmek istiyorum.

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)

Düğümlerin sınıflandırma olduğu ve kenarların sınıflandırmalardan bir modelden diğerine hareket eden gözlemlerin yüzdesini yansıttığı (ağırlık veya renkle) bir grafik oluşturmanın bir yolu olduğunu hayal ediyorum. Örneğin

resim açıklamasını buraya girin

GÜNCELLEME: igraph paketinde bazı ilerlemeler olması. Yukarıdaki koddan başlayarak ...

poLCA sonuçları sınıf üyeliğini tanımlamak için aynı sayıları geri dönüştürür, bu nedenle biraz yeniden kodlama yapmanız gerekir.

N<-ncol(results) 
n<-0
for(i in 2:N) {
results[,i]<- (results[,i])+((i-1)+n)
n<-((i-1)+n)
}

Sonra tüm çapraz tabloları ve frekanslarını almanız ve bunları tüm kenarları tanımlayan bir matrise bağlamanız gerekir. Muhtemelen bunu yapmanın çok daha zarif bir yolu var.

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)

resim açıklamasını buraya girin

Sanırım igraph seçenekleriyle daha fazla oynama zamanı.


1
Sizi tatmin edecek bir çözüm bulursanız, kodunuzu yanıt olarak da gönderebilirsiniz
Gala

2
Bu, parsets gibi bir şeye dönüşüyor . R uygulaması için bkz. Ggparallel .
Andy W

1
@ Andy'nin yorumunu fark edene kadar, bir kümelenme (öznelerin kimliği ile no. Kümeler arasında) veya belki bir akış grafiği (birkaç kümeniz varsa muhtemelen daha az çekici ) gibi bir şey düşünüyordum . Bu, elbette, bireysel düzeyde çalışmaya istekli olduğunuzu varsayalım.
chl

Yanıtlar:


3

Şimdiye kadar, önerileriniz sayesinde bulduğum en iyi seçenekler şunlardır:

  library (igraph)
  library (ggparallel)

# Generate random data

  x1 <- sample(1:1, 1000, replace=T)
  x2 <- sample(2:3, 1000, replace=T)
  x3 <- sample(4:6, 1000, replace=T)
  x4 <- sample(7:10, 1000, replace=T)
  x5 <- sample(11:15, 1000, replace=T)
  results <- cbind (x1, x2, x3, x4, x5)
  results <-as.data.frame(results)

# Make a data frame for the edges and counts

  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")

  edges        <- rbind (g1, g2, g3, g4)

# Make a data frame for the class sizes

  h1            <- count (results, c("x1"))

  h2            <- count (results, c("x2"))
  colnames (h2) <- c     ("x1", "freq")

  h3            <- count (results, c("x3"))
  colnames (h3) <- c     ("x1", "freq")

  h4            <- count (results, c("x4"))
  colnames (h4) <- c     ("x1", "freq")

  h5            <- count (results, c("x5"))
  colnames (h5) <- c     ("x1", "freq")

  cSizes        <- rbind (h1, h2, h3, h4, h5)

# Graph with igraph

  gph    <- graph.data.frame (edges, directed=TRUE)

  layout <- layout.reingold.tilford (gph, root = 1)
  plot (gph,
        layout           = layout,
        edge.label       = edges$freq, 
        edge.curved      = FALSE,
        edge.label.cex   = .8,
        edge.label.color = "black",
        edge.color       = "grey",
        edge.arrow.mode  = 0,
        vertex.label     = cSizes$x1 , 
        vertex.shape     = "square",
        vertex.size      = cSizes$freq/20)

# The same idea, using ggparallel

  a <- c("x1", "x2", "x3", "x4", "x5")

  ggparallel (list (a), 
              data        = results, 
              method      = "hammock", 
              asp         = .7, 
              alpha       = .5, 
              width       = .5, 
              text.angle = 0)

İgraph ile işim bitti

Igraph ile

Ggparallel ile yapılır

Ggparallel ile

Bir dergide paylaşmak için hala çok kaba, ama kesinlikle bunlara hızlı bir şekilde baktığımı gördüm.

Yığın taşmasıyla ilgili bu sorudan da olası bir seçenek var, ancak henüz uygulama şansım olmadı; ve burada başka bir olasılık .


1
Örnekleri gönderdiğiniz için teşekkür ederiz. CV ile ilgili bu yazı, R'deki ParSets grafikleri için bazı güzel kodları gösteriyor (üzgünüm ilk önce bunu işaret etmiş olmalı). Ggparallel pakete girmem, şimdiye kadar kenarların etrafında oldukça kaba olduğunu gösteriyor (gösterdiğiniz gibi rastgele veriler ParSets için güzel IMO görünme eğiliminde olmasa da).
Andy W
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.