/ / Диаграма на Вен от списъка на клъстерите и съпътстващите фактори - r, комбинации, визуализация на данни, фактор-анализ

Venn диаграма от списъка на клъстерите и съпътстващите ги фактори - r, комбинации, визуализация на данни, факторен анализ

Имам входен файл с списък от ~ 50000 клъстера и наличие на редица фактори във всяка от тях (общо 10 милиона записи), виж по-малък пример по-долу:

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 във всеки клъстер, за да бъде взета под внимание.

Опитах се да намеря начин да направя преброяването на таблицата с агрегат, но не успях да го накарам да работи.

Отговори:

21 за отговор № 1

Предложих две решения, използвайки два различни пакета с възможности на диаграмата на Вен. Както очаквахте, и двете включват начална стъпка, използвайки aggregate() функция.

Склонен съм да предпочитам резултатите от venneuler пакет. Позициите на етикетите по подразбиране не са идеални, но можете да ги настроите, като погледнете свързаните plot метод (евентуално използване locator() , за да изберете координатите).

Решение 1-ви:

Една възможност е да се използва venneuler() в venneuler пакет, за да нарисувате диаграмата на Venn.

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", Очевидно можете да промените това обратно.

  • Изисквах само всеки фактор да присъства> = 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")

въведете описанието на изображението тук