719*_*016 13 combinations r data-visualization factor-analysis
我有一个输入文件,其中包含~50000个簇的列表,并且每个簇中都存在多个因子(总共约1000万个条目),请参阅下面的较小示例:
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)
Run Code Online (Sandbox Code Playgroud)
在另一个问题的帮助下,我得到了一个像这样的因素同时出现的饼图:
counts = with(data, table(tapply(factor, cluster, function(x) paste(as.character(sort(unique(x))), collapse='+'))))
pie(counts[counts>1])
Run Code Online (Sandbox Code Playgroud)
但是现在我想得到一个因子共存的维恩图.理想情况下,也可以采用每个因子的最小计数阈值.例如,针对不同因素的维恩图,使得每个因子中的每一个必须在每个群集中存在n> 10以被考虑.
我试图找到一种方法来生成具有聚合的表计数,但无法使其工作.
Jos*_*ien 21
我提供了两个解决方案,使用两个具有维恩图功能的不同包.正如您所料,两者都涉及使用该aggregate()功能的初始步骤.
我倾向于选择venneuler包装的结果.它的默认标签位置并不理想,但您可以通过查看相关plot方法(可能使用locator()选择坐标)来调整它们.
第一解决方案:
一种可能性是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)
Run Code Online (Sandbox Code Playgroud)
关于我在编写此代码时所做选择的一些注意事项:
我从变化的因素的名字"factor-a"来"a".你显然可以改变它.
我只需要在每个群集中计算每个因子> = 2倍(而不是> 10).(那就是用这个小数据子集来演示代码.)
如果你看一下中间对象counts,你会发现它包含一个初始的未命名元素.该元素是包含少于2个字母的簇的数量.您可以更好地决定是否要在计算后续ps('比例')对象时包含它们.

第二个解决方案:
另一种可能性是使用vennCounts()和vennDiagram()在Bioconductor的包limma.要下载软件包,请按照此处的说明进行操作.与上述venneuler解决方案不同,结果图中的重叠与实际交叉度不成比例.相反,它用实际频率注释图表.(请注意,此解决方案不涉及对data$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")
Run Code Online (Sandbox Code Playgroud)

| 归档时间: |
|
| 查看次数: |
10026 次 |
| 最近记录: |