複数の潜在クラスモデルからの結果の視覚化


9

潜在クラス分析を使用して、バイナリ変数のセットに基づいて観測値のサンプルをクラスター化しています。私はRとパッケージpoLCAを使用しています。LCAでは、検索するクラスターの数を指定する必要があります。実際には、人々は通常、それぞれが異なる数のクラスを指定する複数のモデルを実行し、さまざまな基準を使用して、データの「最良の」説明を決定します。

さまざまなモデルを調べて、class =(i)のモデルに分類された観測値がclass =(i + 1)のモデルによってどのように分布されるかを理解しようとすることが非常に役立つことがよくあります。少なくとも、モデル内のクラスの数に関係なく、非常に堅牢なクラスターが見つかることがあります。

これらの関係をグラフ化し、これらの複雑な結果をより簡単に論文で伝えたり、統計学に向いていない同僚に伝えたりしたいのですが。これは、Rである種の単純なネットワークグラフィックパッケージを使用して非常に簡単に実行できると思いますが、その方法がわかりません。

誰かが私を正しい方向に向けてくれませんか?以下は、サンプルデータセットを再現するコードです。各ベクトルxiは、可能性のあるi個のクラスを持つモデルで、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)

ノードが分類であり、エッジが(重みまたは色によって)モデル間で分類から移動する観測の%を反映するグラフを作成する方法があると思います。例えば

ここに画像の説明を入力してください

更新:igraphパッケージでいくつかの進歩があります。上記のコードから始めます...

poLCAの結果は、クラスメンバーシップを説明するために同じ番号をリサイクルするため、少し再コーディングする必要があります。

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

次に、すべてのクロス集計とその頻度を取得し、それらをすべてのエッジを定義する1つの行列に変換する必要があります。これを行うには、おそらくもっとエレガントな方法があるでしょう。

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のようなものに変わります。Rの実装については、ggparallelを参照してください。
アンディW

1
@Andyのコメントに気付くまで、私はクラスターグラム(被験者のIDとクラスターではない)またはストリームグラフ(クラスターが少ない場合はおそらくあまり魅力的ではない)のようなものを考えていました。もちろん、これはあなたが個人レベルで働きたいと思っていることを前提としています。
2013年

回答:


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を使用

まだ大まかなのでジャーナルで共有することはできませんが、これらを手早く見てみると非常に便利です。

スタックオーバーフローに関するこの質問からの可能なオプションもありますが、まだ実装する機会がありませんでした。ここで別の可能性。


1
例を投稿していただきありがとうございます。CVに関するこの投稿は、RParSetsプロットのより良いコードを示しています(申し訳ありませんが、最初にそれを指摘しておく必要がありました)。ggparallelパッケージへの進出は、それが今のところかなり粗いことを示唆しています(ただし、表示されているようなランダムデータは、ParSetsのIMOの見栄えはよくありません)。
アンディW
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.