การแสดงผลลัพธ์จากโมเดลคลาสแฝงหลายตัว


9

ฉันใช้การวิเคราะห์ชั้นแฝงเพื่อจัดกลุ่มตัวอย่างของการสังเกตตามชุดของตัวแปรไบนารี ฉันใช้ R และแพคเกจ poLCA ใน LCA คุณต้องระบุจำนวนกลุ่มที่คุณต้องการค้นหา ในทางปฏิบัติผู้คนมักใช้โมเดลหลายแบบแต่ละคนระบุจำนวนคลาสที่แตกต่างกันแล้วใช้เกณฑ์ต่าง ๆ เพื่อกำหนดว่าคำอธิบายใดที่ "ดีที่สุด" ของข้อมูล

ฉันมักจะพบว่ามันมีประโยชน์มากที่จะมองข้ามแบบจำลองต่างๆเพื่อพยายามทำความเข้าใจว่าการสังเกตที่จำแนกในโมเดลที่มี class = (i) นั้นถูกกระจายโดยโมเดลที่มี class = (i + 1) อย่างไร อย่างน้อยที่สุดบางครั้งคุณสามารถค้นหากลุ่มที่แข็งแกร่งมากซึ่งมีอยู่โดยไม่คำนึงถึงจำนวนคลาสในโมเดล

ฉันต้องการวิธีสร้างกราฟความสัมพันธ์เหล่านี้เพื่อสื่อสารผลลัพธ์ที่ซับซ้อนเหล่านี้ในเอกสารและเพื่อนร่วมงานที่ไม่ได้มุ่งเน้นเชิงสถิติได้ง่ายขึ้น ฉันคิดว่านี่เป็นเรื่องง่ายมากที่จะทำใน R โดยใช้แพ็คเกจกราฟิกเครือข่ายแบบง่าย ๆ แต่ฉันก็ไม่รู้เหมือนกัน

ใครช่วยกรุณาชี้ฉันในทิศทางที่ถูกต้อง ด้านล่างเป็นรหัสในการทำซ้ำชุดข้อมูลตัวอย่าง เวกเตอร์ xi แต่ละอันแสดงถึงการจำแนก 100 การสังเกตการณ์ในแบบจำลองที่มีคลาสที่เป็นไปได้ ฉันต้องการกราฟวิธีการสังเกต (แถว) ย้ายจากชั้นหนึ่งไปอีกชั้นข้ามคอลัมน์

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)

ฉันจินตนาการว่ามีวิธีในการสร้างกราฟที่มีการจัดประเภทโหนดและขอบสะท้อน (โดยน้ำหนักหรือสีอาจ)% ของการสังเกตย้ายจากการจำแนกจากแบบจำลองหนึ่งไปยังอีก เช่น

ป้อนคำอธิบายรูปภาพที่นี่

UPDATE: มีความคืบหน้ากับแพคเกจ 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 ฉันเดา


1
หากคุณพบทางออกที่ทำให้คุณพึงพอใจคุณสามารถโพสต์โค้ดของคุณเป็นคำตอบได้
Gala

2
นี้จะกลายเป็นสิ่งที่ต้องการparsets ดูggparallelสำหรับการนำไปใช้งาน R
Andy W

1
จนกระทั่งผมสังเกตเห็น @ ความคิดเห็นของแอนดี้ผมคิดว่าสิ่งที่ต้องการclustergram (ที่มี ID กับอาสาสมัครไม่. กลุ่ม) หรืออาจจะstreamgraph (อาจจะน้อยที่น่าสนใจถ้าคุณมีกลุ่มน้อย) แน่นอนว่าสมมุติว่าคุณเต็มใจทำงานในระดับบุคคล
chl

คำตอบ:


3

จนถึงตอนนี้ตัวเลือกที่ดีที่สุดที่ฉันพบขอบคุณคำแนะนำของคุณคือ:

  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)

ทำด้วย igraph

ด้วย Igraph

ทำด้วย ggparallel

ด้วย ggparallel

ยังหยาบเกินไปที่จะแบ่งปันในบันทึกประจำวัน แต่ฉันพบว่ามีประโยชน์อย่างมาก

นอกจากนี้ยังมีตัวเลือกที่เป็นไปได้จากคำถามนี้ใน stack overflowแต่ฉันยังไม่มีโอกาสใช้มัน และเป็นไปได้อีกที่นี่


1
ขอขอบคุณที่โพสต์ตัวอย่าง โพสต์บน CV นี้แสดงรหัสที่ดีกว่าสำหรับการแปลง ParSets ใน R (ขออภัยควรชี้ไปที่ก่อน) การจู่โจมของฉันในแพ็คเกจ ggparallel แสดงว่ามันค่อนข้างหยาบรอบ ๆ ขอบ (แม้ว่าข้อมูลแบบสุ่มอย่างที่คุณแสดงจะไม่ได้ดู IMO ที่ดีสำหรับ ParSets)
Andy W
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.