2011-11-14 36 views
12

Tôi có một tệp đầu vào với danh sách ~ 50000 cụm và sự hiện diện của một số yếu tố trong mỗi nhóm (~ 10 triệu mục trong tổng số), xem ví dụ nhỏ dưới đây:Sơ đồ Venn từ danh sách các cụm và các yếu tố đồng xuất hiện

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) 

với một chút sự giúp đỡ từ một câu hỏi khác, tôi đã nhận nó để tạo ra một piechart cho đồng xảy ra các yếu tố như thế này:

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

Nhưng bây giờ tôi muốn có một sơ đồ venn cho sự xuất hiện của các yếu tố. Lý tưởng nhất, cũng theo cách có thể mất một ngưỡng cho số lượng tối thiểu cho mỗi yếu tố. Ví dụ, một biểu đồ venn cho các yếu tố khác nhau sao cho mỗi một trong số chúng phải có mặt n> 10 trong mỗi cụm được tính đến.

Tôi đã cố gắng tìm cách tạo ra tổng số bảng với tổng hợp, nhưng không thể làm cho nó hoạt động.

+2

bạn đã xem xét bất kỳ gói R cho sơ đồ Venn? Xem [ví dụ gần đây này] (http://stats.stackexchange.com/questions/16802/derive-pc-ab-from-coxs-two-rules/18209#18209) bởi G. Jay Kerns bằng cách sử dụng thư viện 'venneuler' hoặc bài viết ngắn này trong Tạp chí Phần mềm Stat bằng cách sử dụng thư viện 'venn' ([Murdoch, 2004] (http://www.jstatsoft.org/v11/c01)). Nếu điều này hoàn toàn là về lập trình R, nó nên được di chuyển sang SO. –

+1

Avilella, câu hỏi này có thể không nhận được bất kỳ câu trả lời nào vì nó không nằm trong chủ đề. Bạn có thể làm tốt hơn trên SO, trong đó có một cộng đồng người dùng R đang hoạt động. Nhưng xin đừng qua đường bưu điện: chỉ cần gắn cờ câu hỏi cho sự chú ý của người kiểm duyệt nếu bạn muốn nó di chuyển. – whuber

+0

Tôi đã gắn cờ nó, nhưng tôi không thể thấy nó được chuyển sang SO ... – 719016

Trả lời

20

Tôi đã cung cấp hai giải pháp, sử dụng hai gói khác nhau có khả năng biểu đồ Venn. Như bạn mong đợi, cả hai đều liên quan đến bước đầu tiên bằng cách sử dụng hàm aggregate().

Tôi có xu hướng thích kết quả từ gói venneuler. Đó là vị trí nhãn mặc định không lý tưởng, nhưng bạn có thể điều chỉnh chúng bằng cách xem phương thức plot được liên kết (có thể sử dụng locator() để chọn tọa độ).

Solution ngày 1:

Một khả năng là sử dụng venneuler() trong gói venneuler để vẽ biểu đồ Venn của bạn.

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) 

Một vài lưu ý về sự lựa chọn tôi lập thành văn bản mã này:

  • Tôi đã thay đổi tên của các yếu tố "factor-a"-"a". Bạn rõ ràng có thể thay đổi điều đó trở lại.

  • Tôi chỉ yêu cầu mỗi yếu tố có mặt> = 2 lần (thay vì> 10) để được tính trong mỗi cụm. (Đó là để chứng minh mã với tập con nhỏ này của dữ liệu của bạn.)

  • Nếu bạn nhìn vào đối tượng trung gian counts, bạn sẽ thấy nó chứa phần tử không tên ban đầu. Phần tử đó là số cụm chứa ít hơn 2 của bất kỳ chữ cái nào. Bạn có thể quyết định tốt hơn tôi có muốn bao gồm những người đó trong việc tính toán đối tượng ps ('tỷ lệ') tiếp theo hay không.

enter image description here

Giải pháp thứ 2:

Một khả năng khác là sử dụng vennCounts()vennDiagram() trong Bioconductor gói limma. Để tải xuống gói, follow the instructions here. Không giống như giải pháp venneuler ở trên, chồng chéo trong biểu đồ kết quả không tỷ lệ thuận với mức giao cắt thực tế. Thay vào đó, nó chú thích sơ đồ với các tần số thực tế.(Lưu ý rằng giải pháp này không liên quan đến bất kỳ sửa đổi để cột 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") 

enter image description here

Các vấn đề liên quan