2011-11-14 12 views
12

मुझे ~ 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) 
एक और सवाल से मदद का एक सा के साथ

, मैं समझ गया इस तरह के कारकों में से सह-घटना के लिए एक piechart निर्माण करने के लिए:

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

लेकिन अब मैं करना चाहते हैं कारकों की सह-घटना के लिए एक वेन आरेख। आदर्श रूप में, यह भी एक तरीका है कि प्रत्येक कारक के लिए न्यूनतम गिनती के लिए सीमा तय कर सकते हैं। उदाहरण के लिए, विभिन्न कारकों के लिए एक वेन आरेख ताकि प्रत्येक समूह को प्रत्येक क्लस्टर में एन> 10 उपस्थित होना चाहिए।

मैंने तालिका के साथ कुल गणना करने का एक तरीका खोजने का प्रयास किया है, लेकिन यह काम नहीं कर सका।

+2

आप वेन आरेख के लिए R संकुल में से किसी को देखा है? देखें [यह हालिया उदाहरण] (http://stats.stackexchange.com/questions/16802/derive-pc-ab-from-coxs-two-rules/18209#18209) जी जेन कर्न्स द्वारा 'venneuler' लाइब्रेरी का उपयोग कर देखें , या 'venn' लाइब्रेरी ([मर्डोक, 2004] (http://www.jstatsoft.org/v11/c01) का उपयोग कर जर्नल ऑफ स्टेट सॉफ्टवेयर में यह संक्षिप्त लेख)। यदि यह आर प्रोग्रामिंग के बारे में पूरी तरह से है तो इसे एसओ में माइग्रेट किया जाना चाहिए। –

+1

एविलेला, इस प्रश्न को कोई जवाब नहीं मिल रहा है क्योंकि यह मामूली रूप से विषय से दूर है। आप SO पर बेहतर कर सकते हैं, जिसमें एक सक्रिय आर उपयोगकर्ता समुदाय है। लेकिन कृपया क्रॉस-पोस्ट न करें: अगर आप माइग्रेट करना चाहते हैं तो बस मॉडरेटर ध्यान के लिए प्रश्न को ध्वजांकित करें। – whuber

+0

मैंने इसे ध्वजांकित किया, लेकिन मुझे इसे अभी तक एसओ में स्थानांतरित नहीं किया जा सकता है ... – 719016

उत्तर

20

मैंने वेन आरेख क्षमताओं के साथ दो अलग-अलग पैकेजों का उपयोग करके दो समाधान प्रदान किए हैं। जैसा कि आप उम्मीद करते थे, दोनों में aggregate() फ़ंक्शन का उपयोग करके प्रारंभिक चरण शामिल है।

मैं venneuler पैकेज से परिणाम पसंद करना चाहता हूं। यह डिफ़ॉल्ट लेबल स्थिति आदर्श नहीं है, लेकिन आप संबंधित plot विधि (संभावित रूप से निर्देशांक चुनने के लिए locator() का उपयोग करके) को देखकर उन्हें समायोजित कर सकते हैं।

समाधान 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" करने वाले कारकों में से नाम बदल दिया है। आप स्पष्ट रूप से उस बदलाव को बदल सकते हैं।

  • मुझे प्रत्येक क्लस्टर में केवल प्रत्येक कारक मौजूद होने की आवश्यकता है> = 2 बार (10> के बजाय) प्रत्येक समूह में गिना जाएगा। (यह आपके डेटा के इस छोटे से सबसेट के साथ कोड प्रदर्शित करना था।)

  • यदि आप इंटरमीडिएट ऑब्जेक्ट counts पर एक नज़र डालें, तो आप देखेंगे कि इसमें प्रारंभिक अनाम नाम है। वह तत्व क्लस्टर की संख्या है जिसमें किसी भी अक्षर के 2 से कम होते हैं। आप मुझसे बेहतर निर्णय ले सकते हैं कि आप उन्हें ps ('अनुपात') ऑब्जेक्ट की गणना में शामिल करना चाहते हैं या नहीं।

enter image description here

समाधान 2:

एक और संभावना BioConductor पैकेज limma में vennCounts() और vennDiagram() को रोजगार के लिए है। पैकेज डाउनलोड करने के लिए, follow the instructions here. उपरोक्त 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") 

enter image description here

संबंधित मुद्दे