R "Ошибка в draw.quad.venn, Невозможно: создает отрицательную область", несмотря на правильность чисел - PullRequest
1 голос
/ 14 мая 2019

Я пытаюсь сгенерировать диаграмму Венна с четырьмя путями, используя draw.quad.venn в пакете VennDiagram в R, но он продолжает выдавать сообщение об ошибке:

ERROR [2019-05-14 11:28:24] Impossible: a7  <- n234 - a6 produces negative area
Error in draw.quad.venn(length(gene_lists[[1]]), length(gene_lists[[2]]),  : 
  Impossible: a7  <- n234 - a6 produces negative area

Я использую 4 разных списка генов в качестве входных данных. Функция расчета. перекрытия работает нормально, затем я получаю числа с помощью функции длины (х) над значениями перекрытия, проанализированными в виде списка. Я передаю все значения перекрытия вместе с соответствующими общими размерами группы в функцию draw.quad.venn, но она продолжает утверждать, что одна из групп невозможна, поскольку она генерирует отрицательное число.

Я проверил числа вручную, и они явно складываются в правильные значения. Я также протестировал скрипт на случайном наборе из 20000 генов, сгенерированном с использованием чего-то похожего на скрипт ниже, и он отлично работает, то есть генерирует диаграмму Венна с четырьмя путями. Нет различий между случайно сгенерированными списками генов и списками, которые я курировал из реальных файлов результатов, кроме их размеров. Минимальный рабочий пример можно увидеть ниже:

# working example that fails
# get vector of 10000 elements (representative of gene list)
values <- c(1:10000)
# generate 4 subsets by random sampling
list_1 <- sample(values, size = 5000, replace = FALSE)
list_2 <- sample(values, size = 4000, replace = FALSE)
list_3 <- sample(values, size = 3000, replace = FALSE)
list_4 <- sample(values, size = 2000, replace = FALSE)
# compile them in to a list
lists <- list(list_1, list_2, list_3, list_4)
# find overlap between all possible combinations (11 plus 4 unique to each list = 15 total)
overlap <- calculate.overlap(lists)
# get the lengths of each list - these will be the numbers used for the Venn diagram
overlap_values <- lapply(overlap, function(x) length(x))
# rename overlap values (easier to identify which groups are intersecting)
names(overlap_values) <- c("n1234", "n123", "n124", "n134", "n234", "n12", "n13", "n14", "n23", "n24", "n34", "n1", "n2", "n3", "n4")
# generate the venn diagram
draw.quad.venn(length(lists[[1]]), length(lists[[2]]), length(lists[[3]]), length(lists[[4]]), overlap_values$n12,
               overlap_values$n13, overlap_values$n14, overlap_values$n23, overlap_values$n24, overlap_values$n34,
               overlap_values$n123, overlap_values$n124, overlap_values$n134, overlap_values$n234, overlap_values$n1234)

Я ожидаю четырехстороннюю диаграмму Венна, независимо от того, есть ли у некоторых групп 0, они все еще должны быть там, но помечены как 0. Вот как это должно выглядеть:

Four way Venn diagram, with gene list sizes in each group

Я не уверен, что это потому, что у меня есть 0 значений в реальных данных, то есть определенные группы, где нет перекрытия? Есть ли способ заставить draw.quad.venn () принимать какие-либо значения? Если нет, есть ли другой пакет, который я могу использовать для достижения тех же результатов? Любая помощь с благодарностью!

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Я посмотрел исходный код пакета. Если вы все еще заинтересованы в причине ошибки, есть два способа отправить данные на venn.diagram. Одна форма nxxxx (например, n134), а другая форма an (например, a5). В примерах n134 означает «какие элементы принадлежат по крайней мере к группам 1, 3 и 4». С другой стороны, a5 означает «какие элементы только относятся к группам 1, 3 и 4». Отношения между обеими формами действительно замысловаты, например, a6 соответствует n1234. Это означает, что n134 = a5 + a6. Проблема в том, что calculate.overlap дает числа в форме an, тогда как по умолчанию draw.quad.venn ожидает числа в форме nxxxx. Чтобы использовать значения из calculate.overlap, вы можете установить direct.area в true и предоставить результат calculate.overlap в параметре area.vector. Например,

tmp <- calculate.overlap(list(a=c(1, 2, 3, 4, 10), b=c(3, 4, 5, 6), c=c(4, 6, 7, 8, 9), d=c(4, 8, 1, 9)))
overlap_values <- lapply(tmp, function(x) length(x))
draw.quad.venn(area.vector = c(overlap_values$a1, overlap_values$a2, overlap_values$a3, overlap_values$a4, 
                               overlap_values$a5, overlap_values$a6, overlap_values$a7, overlap_values$a8, 
                               overlap_values$a9, overlap_values$a10, overlap_values$a11, overlap_values$a12, 
                               overlap_values$a13, overlap_values$a14, overlap_values$a15), direct.area = T, category = c('a', 'b', 'c', 'd'))

vd2

Если вас интересует что-то более простое и гибкое, я сделал пакет nVennR для задач такого типа:

library(nVennR)
g1 <- c('AF029684', 'M28825', 'M32074', 'NM_000139', 'NM_000173', 'NM_000208', 'NM_000316', 'NM_000318', 'NM_000450', 'NM_000539', 'NM_000587', 'NM_000593', 'NM_000638', 'NM_000655', 'NM_000789', 'NM_000873', 'NM_000955', 'NM_000956', 'NM_000958', 'NM_000959', 'NM_001060', 'NM_001078', 'NM_001495', 'NM_001627', 'NM_001710', 'NM_001716')
g2 <- c('NM_001728', 'NM_001835', 'NM_001877', 'NM_001954', 'NM_001992', 'NM_002001', 'NM_002160', 'NM_002162', 'NM_002258', 'NM_002262', 'NM_002303', 'NM_002332', 'NM_002346', 'NM_002347', 'NM_002349', 'NM_002432', 'NM_002644', 'NM_002659', 'NM_002997', 'NM_003032', 'NM_003246', 'NM_003247', 'NM_003248', 'NM_003259', 'NM_003332', 'NM_003383', 'NM_003734', 'NM_003830', 'NM_003890', 'NM_004106', 'AF029684', 'M28825', 'M32074', 'NM_000139', 'NM_000173', 'NM_000208', 'NM_000316', 'NM_000318', 'NM_000450', 'NM_000539')
g3 <- c('NM_000655', 'NM_000789', 'NM_004107', 'NM_004119', 'NM_004332', 'NM_004334', 'NM_004335', 'NM_004441', 'NM_004444', 'NM_004488', 'NM_004828', 'NM_005214', 'NM_005242', 'NM_005475', 'NM_005561', 'NM_005565', 'AF029684', 'M28825', 'M32074', 'NM_005567', 'NM_003734', 'NM_003830', 'NM_003890', 'NM_004106', 'AF029684', 'NM_005582', 'NM_005711', 'NM_005816', 'NM_005849', 'NM_005959', 'NM_006138', 'NM_006288', 'NM_006378', 'NM_006500', 'NM_006770', 'NM_012070', 'NM_012329', 'NM_013269', 'NM_016155', 'NM_018965', 'NM_021950', 'S69200', 'U01351', 'U08839', 'U59302')
g4 <- c('NM_001728', 'NM_001835', 'NM_001877', 'NM_001954', 'NM_005214', 'NM_005242', 'NM_005475', 'NM_005561', 'NM_005565', 'ex1', 'ex2', 'NM_003890', 'NM_004106', 'AF029684', 'M28825', 'M32074', 'NM_000139', 'NM_000173', 'NM_000208', 'NM_000316', 'NM_000318', 'NM_000450', 'NM_000539')
myV <- plotVenn(list(g1=g1, g2=g2, g3=g3, g4=g4))
myV <- plotVenn(nVennObj = myV)
myV <- plotVenn(nVennObj = myV)

Последняя команда повторяется специально. Результат: nvennr_vd2

Затем вы можете исследовать перекрестки:

> getVennRegion(myV, c('g1', 'g2', 'g4'))
[1] "NM_000139" "NM_000173" "NM_000208" "NM_000316" "NM_000318" "NM_000450" "NM_000539"

Существует виньетка с дополнительной информацией.

1 голос
/ 14 мая 2019

Так что ничто из того, что я пробовал, не могло устранить ошибку с помощью draw.quad.venn в пакете VennDiagram.Там что-то не так с тем, как это написано.Пока все числа в каждом из 4 эллипсов составляют общее количество элементов в этом конкретном списке, диаграмма Венна действительна.По какой-то причине VennDiagram будет принимать данные только в том случае, если меньшее количество пересечений приводит к большим числам, например, пересечение групп 1, 2 и 3 ДОЛЖНО быть выше, чем пересечение всех 4 групп.Это не представляет данные реального мира.Для групп 1, 2 и 3 вполне возможно, что они вообще не пересекаются, тогда как все 4 группы пересекаются.На диаграмме Венна все числа независимы и представляют общее количество элементов, общих на каждом пересечении.Они не должны иметь никакого отношения друг к другу.

Я посмотрел на пакет eulerr, но на самом деле нашел очень простой способ построения диаграммы Венна с использованием venn в gplots, как показано ниже:

# simple 4 way Venn diagram using gplots
# get some mock data
values <- c(1:20000)
list_1 <- sample(values, size = 5000, replace = FALSE)
list_2 <- sample(values, size = 4000, replace = FALSE)
list_3 <- sample(values, size = 3000, replace = FALSE)
list_4 <- sample(values, size = 2000, replace = FALSE)
lists <- list(list_1, list_2, list_3, list_4)
# name thec list (required for gplots)
names(lists) <- c("G1", "G2", "G3", "G4")
# get the venn table
v.table <- venn(lists)
# show venn table
print(v.table)
# plot Venn diagram
plot(v.table)

Теперь я считаю, что вопрос решен.Спасибо zx8754 за помощь!

...