13

〜50000のクラスターのリストと、各クラスターに多数の要素(合計で〜1,000万のエントリ)が存在する入力ファイルがあります。以下の小さな例を参照してください。

set.seed(1)
x = paste("cluster-",sample(c(1:100),500,replace=TRUE),sep="")
y = c(
  paste("factor-",sample(c(letters[1:3]),300, replace=TRUE),sep=""),
  paste("factor-",sample(c(letters[1]),100, replace=TRUE),sep=""),
  paste("factor-",sample(c(letters[2]),50, replace=TRUE),sep=""),
  paste("factor-",sample(c(letters[3]),50, replace=TRUE),sep="")
)
data = data.frame(cluster=x,factor=y)

別の質問から少し助けを借りて、次のような要因の共起の円グラフを作成することができました。

counts = with(data, table(tapply(factor, cluster, function(x) paste(as.character(sort(unique(x))), collapse='+'))))
pie(counts[counts>1])

しかし、今、私は要因の共起のためのベン図を持ちたいと思います。理想的には、各要素の最小カウントのしきい値を取ることができる方法でも。たとえば、さまざまな要因のベン図。考慮に入れるには、各要因が各クラスターにn>10存在する必要があります。

集計を使用してテーブルカウントを生成する方法を見つけようとしましたが、機能させることができませんでした。

4

1 に答える 1

22

ベン図機能を備えた 2 つの異なるパッケージを使用して、2 つのソリューションを提供しました。ご想像のとおり、どちらもaggregate()関数を使用した最初のステップを伴います。

venneuler私はパッケージからの結果を好む傾向があります。デフォルトのラベルの位置は理想的ではありませんが、関連する方法を見て調整することができますplot(おそらく を使用locator()して座標を選択します)。

1番目のソリューション:

1 つの可能性は、ベン図を描くためにパッケージvenneuler()で使用することです。venneuler

library(venneuler)

## Modify the "factor" column, by renaming it and converting
## it to a character vector.
levels(data$factor) <- c("a", "b", "c")
data$factor <- as.character(data$factor)

## FUN is an anonymous function that determines which letters are present
## 2 or more times in the cluster and then pastes them together into 
## strings of a form that venneuler() expects.
##
inter <- aggregate(factor ~ cluster, data=data,
                   FUN = function(X) {
                       tab <- table(X)
                       names <- names(tab[tab>=2])
                       paste(sort(names), collapse="&")
                   })            
## Count how many clusters contain each combination of letters
counts <- table(inter$factor)
counts <- counts[names(counts)!=""]  # To remove groups with <2 of any letter
#  a   a&b a&b&c   a&c     b   b&c     c 
# 19    13    12    14    13     9    12 

## Convert to proportions for venneuler()
ps <- counts/sum(counts)

## Calculate the Venn diagram
vd <- venneuler(c(a=ps[["a"]], b = ps[["b"]], c = ps[["c"]],
                  "a&b" = ps[["a&b"]],
                  "a&c" = ps[["a&c"]],
                  "b&c" = ps[["b&c"]],
                  "a&b&c" = ps[["a&b&c"]]))
## Plot it!
plot(vd)

このコードを書く際に私が行った選択についてのいくつかのメモ:

  • 因子の名前を から"factor-a"に変更しました"a"。明らかに元に戻すことができます。

  • 各クラスター内でカウントするために、各因子が (>10 回ではなく) >=2 回存在することのみを要求しました。(これは、データのこの小さなサブセットを使用してコードを示すためのものでした。)

  • 中間オブジェクトcountsを見ると、名前のない最初の要素が含まれていることがわかります。その要素は、2 つ未満の文字を含むクラスターの数です。ps後続の(「比率」)オブジェクトの計算にそれらを含めるかどうかは、私よりもよく決めることができます。

ここに画像の説明を入力

2番目のソリューション:

もう 1 つの可能性は、Bioconductor パッケージでvennCounts()とを使用することです。パッケージをダウンロードするには、こちらの手順に従ってください。上記のソリューションとは異なり、結果のダイアグラムの重なりは、実際の交差度に比例しません。代わりに、実際の頻度でダイアグラムに注釈を付けます。(このソリューションには、列の編集は含まれないことに注意してください。)vennDiagram()limmavenneulerdata$factor

library(limma)

out <- aggregate(factor ~ cluster, data=data, FUN=table)
out <- cbind(out[1], data.frame(out[2][[1]]))

counts <- vennCounts(out[, -1] >= 2)
vennDiagram(counts, names = c("Factor A", "Factor B", "Factor C"),
            cex = 1, counts.col = "red")

ここに画像の説明を入力

于 2011-11-17T19:01:08.927 に答える