Hiển thị kết quả từ nhiều mô hình lớp tiềm ẩn


9

Tôi đang sử dụng phân tích lớp tiềm ẩn để phân cụm một mẫu quan sát dựa trên một tập hợp các biến nhị phân. Tôi đang sử dụng R và gói poLCA. Trong LCA, bạn phải chỉ định số lượng cụm bạn muốn tìm. Trong thực tế, mọi người thường chạy một số mô hình, mỗi mô hình chỉ định một số lớp khác nhau và sau đó sử dụng các tiêu chí khác nhau để xác định đâu là giải thích "tốt nhất" của dữ liệu.

Tôi thường thấy rất hữu ích khi xem qua các mô hình khác nhau để cố gắng hiểu cách các quan sát được phân loại trong mô hình với class = (i) được phân phối bởi mô hình với class = (i + 1). Ít nhất đôi khi bạn có thể tìm thấy các cụm rất mạnh tồn tại bất kể số lượng các lớp trong mô hình.

Tôi muốn có một cách để vẽ biểu đồ cho các mối quan hệ này, để dễ dàng truyền đạt những kết quả phức tạp này trong các bài báo và cho các đồng nghiệp không định hướng thống kê. Tôi tưởng tượng điều này rất dễ thực hiện trong R bằng cách sử dụng một số loại gói đồ họa mạng đơn giản, nhưng tôi đơn giản là không biết làm thế nào.

Bất cứ ai có thể xin vui lòng chỉ cho tôi đi đúng hướng. Dưới đây là mã để sao chép một tập dữ liệu mẫu. Mỗi vector xi đại diện cho việc phân loại 100 quan sát, trong một mô hình với i các lớp có thể. Tôi muốn vẽ biểu đồ cách các quan sát (hàng) di chuyển từ lớp này sang lớp khác qua các cột.

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)

Tôi tưởng tượng có một cách để tạo ra một biểu đồ trong đó các nút là phân loại và các cạnh phản ánh (theo trọng số hoặc màu sắc có thể)% các quan sát chuyển từ phân loại từ mô hình này sang mô hình tiếp theo. Ví dụ

nhập mô tả hình ảnh ở đây

CẬP NHẬT: Có một số tiến bộ với gói igraph. Bắt đầu từ đoạn mã trên ...

Kết quả poLCA tái chế các số giống nhau để mô tả tư cách thành viên của lớp, vì vậy bạn cần thực hiện một chút mã hóa lại.

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

Sau đó, bạn cần lấy tất cả các bảng chéo và tần số của chúng, và gắn chúng vào một ma trận xác định tất cả các cạnh. Có lẽ có một cách thanh lịch hơn nhiều để làm điều này.

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)

nhập mô tả hình ảnh ở đây

Thời gian để chơi nhiều hơn với các tùy chọn igraph tôi đoán.


1
Nếu bạn tìm thấy một giải pháp thỏa mãn bạn, bạn cũng có thể đăng mã của mình dưới dạng câu trả lời
Gala

2
Điều này đang biến thành một cái gì đó giống như các bảng phân tích . Xem ggabul để thực hiện R.
Andy W

1
Cho đến khi tôi nhận thấy bình luận của @ Andy, tôi đã nghĩ đến một cái gì đó giống như một cụm (với ID của đối tượng so với cụm số) hoặc có thể là một luồng dữ liệu (có thể ít hấp dẫn hơn nếu bạn có một vài cụm). Điều này, tất nhiên, giả sử bạn sẵn sàng làm việc ở cấp độ cá nhân.
chl

Câu trả lời:


3

Cho đến nay, các tùy chọn tốt nhất tôi đã tìm thấy, nhờ các đề xuất của bạn, là:

  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)

Đã hoàn thành với igraph

Với Igraph

Thực hiện với ggabul

Với ggabul

Vẫn còn quá khó khăn để chia sẻ trên một tạp chí, nhưng tôi chắc chắn đã thấy có một cái nhìn nhanh về những điều này rất hữu ích.

Ngoài ra còn có một tùy chọn có thể từ câu hỏi này khi tràn stack , nhưng tôi chưa có cơ hội thực hiện nó; và một khả năng khác ở đây .


1
Cảm ơn đã đăng các ví dụ. Bài đăng này trên CV hiển thị một số mã đẹp hơn cho các ô ParSets trong R (xin lỗi nên đã chỉ vào đó trước). Bước đột phá của tôi vào gói ggabul cho thấy nó khá thô xung quanh các cạnh cho đến nay (mặc dù dữ liệu ngẫu nhiên như bạn hiển thị sẽ không có xu hướng trông IMO đẹp cho ParSets).
Andy W
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.