Changeset 1883:8d992429535b in orange-bioinformatics


Ignore:
Timestamp:
10/11/13 16:42:01 (7 months ago)
Author:
markotoplak
Branch:
default
Message:

GO widget shows p-value and FDR separately.

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • orangecontrib/bio/widgets/OWGOEnrichmentAnalysis.py

    r1874 r1883  
    105105                    "filterByNumOfInstances", "minNumOfInstances", 
    106106                    "filterByPValue", "maxPValue", "selectionDirectAnnotation", 
     107                    "filterByPValue_nofdr", "maxPValue_nofdr", 
    107108                    "selectionDisjoint", "selectionType", 
    108                     "selectionAddTermAsClass", "useAttrNames", "probFunc", 
    109                     "useFDR" 
     109                    "selectionAddTermAsClass", "useAttrNames", "probFunc" 
    110110                    ] 
    111111 
     
    140140        self.filterByPValue = True 
    141141        self.maxPValue = 0.1 
     142        self.filterByPValue_nofdr = False 
     143        self.maxPValue_nofdr = 0.1 
    142144        self.probFunc = 0 
    143         self.useFDR = True 
    144145        self.selectionDirectAnnotation = 0 
    145146        self.selectionDisjoint = 0 
     
    216217                   tooltip="Min. number of input genes mapped to a term") 
    217218         
    218         OWGUI.checkBox(box, self, "filterByPValue", "Significance", 
     219        OWGUI.checkBox(box, self, "filterByPValue_nofdr", "p-value", 
    219220                       callback=self.FilterAndDisplayGraph,  
    220221                       tooltip="Filter by term p-value") 
     222        OWGUI.doubleSpin(OWGUI.indentedBox(box), self, 'maxPValue_nofdr', 1e-8, 1,  
     223                         step=1e-8,  label='p:', labelWidth=15,  
     224                         callback=self.FilterAndDisplayGraph,  
     225                         callbackOnReturn=True,  
     226                         tooltip="Max term p-value") 
     227 
     228        #use filterByPValue for FDR, as it was the default in prior versions 
     229        OWGUI.checkBox(box, self, "filterByPValue", "FDR", 
     230                       callback=self.FilterAndDisplayGraph,  
     231                       tooltip="Filter by term FDR") 
    221232        OWGUI.doubleSpin(OWGUI.indentedBox(box), self, 'maxPValue', 1e-8, 1,  
    222233                         step=1e-8,  label='p:', labelWidth=15,  
     
    224235                         callbackOnReturn=True,  
    225236                         tooltip="Max term p-value") 
     237 
    226238        box = OWGUI.widgetBox(box, "Significance test") 
     239 
    227240        OWGUI.radioButtonsInBox(box, self, "probFunc", ["Binomial", "Hypergeometric"],  
    228241                                tooltips=["Use binomial distribution test",  
    229242                                          "Use hypergeometric distribution test"],  
    230243                                callback=self.Update) 
    231         OWGUI.checkBox(box, self, "useFDR", "Use FDR (False Discovery Rate)",  
    232                        callback=self.Update,  
    233                        tooltip="Use False Discovery Rate correction") 
    234244        box = OWGUI.widgetBox(self.filterTab, "Evidence codes in annotation",  
    235245                              addSpace=True) 
     
    261271 
    262272        # ListView for DAG, and table for significant GOIDs 
    263         self.DAGcolumns = ['GO term', 'Cluster', 'Reference', 'p value', 'Genes', 'Enrichment'] 
     273        self.DAGcolumns = ['GO term', 'Cluster', 'Reference', 'p-value', 'FDR', 'Genes', 'Enrichment'] 
    264274         
    265275        self.splitter = QSplitter(Qt.Vertical, self.mainArea) 
     
    276286        self.listView.header().setSortIndicatorShown(True) 
    277287        self.listView.setSortingEnabled(True) 
    278         self.listView.setItemDelegateForColumn(5, EnrichmentColumnItemDelegate(self)) 
     288        self.listView.setItemDelegateForColumn(6, EnrichmentColumnItemDelegate(self)) 
    279289        self.listView.setRootIsDecorated(True) 
    280290 
     
    288298        self.sigTerms.setSortingEnabled(True) 
    289299        self.sigTerms.setSelectionMode(QAbstractItemView.ExtendedSelection) 
     300        self.sigTerms.setItemDelegateForColumn(6, EnrichmentColumnItemDelegate(self)) 
    290301         
    291302        self.connect(self.sigTerms, SIGNAL("itemSelectionChanged()"), self.TableSelectionChanged) 
     
    651662        if clusterGenes: 
    652663            self.terms = terms = self.annotations.GetEnrichedTerms(clusterGenes, referenceGenes, evidences, aspect=aspect, 
    653                                                                    prob=self.probFunctions[self.probFunc], useFDR=self.useFDR, 
     664                                                                   prob=self.probFunctions[self.probFunc], useFDR=False, 
    654665                                                                   progressCallback=lambda value:pb.advance() ) 
     666            ids = [] 
     667            pvals = [] 
     668            for i,d in self.terms.items(): 
     669                ids.append(i) 
     670                pvals.append(d[1]) 
     671            for i,fdr in zip(ids, obiProb.FDR(pvals)): #save FDR as the last part of the tuple 
     672                terms[i] = tuple(list(terms[i]) + [ fdr ]) 
     673 
    655674        else: 
    656675            self.terms = terms = {} 
     
    681700         
    682701    def FilterGraph(self, graph): 
    683         if self.filterByPValue: 
    684             graph = obiGO.filterByPValue(graph, self.maxPValue) 
     702        if self.filterByPValue_nofdr: 
     703            graph = obiGO.filterByPValue(graph, self.maxPValue_nofdr) 
     704        if self.filterByPValue: #FDR 
     705            graph = dict(filter(lambda (k, e): e[3] <= self.maxPValue, graph.items())) 
    685706        if self.filterByNumOfInstances: 
    686             graph = dict(filter(lambda (id,(genes, p, rc)):len(genes)>=self.minNumOfInstances, graph.items())) 
     707            graph = dict(filter(lambda (id,(genes, p, rc, fdr)):len(genes)>=self.minNumOfInstances, graph.items())) 
    687708        return graph 
    688709 
     
    716737        enrichment = lambda t:float(len(t[0])) / t[2] * (float(len(self.referenceGenes))/len(self.clusterGenes)) 
    717738        maxFoldEnrichment = max([enrichment(term) for term in self.graph.values()] or [1]) 
     739 
    718740 
    719741        def addNode(term, parent, parentDisplayNode): 
     
    744766 
    745767        self.sigTerms.clear() 
    746         for i, (t_id, (genes, p_value, refCount)) in enumerate(terms): 
     768        for i, (t_id, (genes, p_value, refCount, fdr)) in enumerate(terms): 
    747769            item = GOTreeWidgetItem(self.ontology[t_id], 
    748                                     (genes, p_value, refCount), 
     770                                    (genes, p_value, refCount, fdr), 
    749771                                    len(self.clusterGenes), 
    750772                                    len(self.referenceGenes), 
     
    754776 
    755777        self.listView.expandAll() 
    756         for i in range(4): 
     778        for i in range(5): 
    757779            self.listView.resizeColumnToContents(i) 
    758780            self.sigTerms.resizeColumnToContents(i) 
    759         self.sigTerms.resizeColumnToContents(5) 
     781        self.sigTerms.resizeColumnToContents(6) 
    760782        width = min(self.listView.columnWidth(0), 350) 
    761783        self.listView.setColumnWidth(0, width) 
     
    768790             orange.FloatVariable("Cluster Frequency"), 
    769791             orange.FloatVariable("Reference Frequency"), 
    770              orange.FloatVariable("P-value"), 
     792             orange.FloatVariable("p-value"), 
     793             orange.FloatVariable("FDR"), 
    771794             orange.FloatVariable("Enrichment"), 
    772795             orange.StringVariable("Genes") 
     
    778801                  float(r_count) / len(self.referenceGenes), 
    779802                  p_value, 
     803                  fdr, 
    780804                  float(len(genes)) / len(self.clusterGenes) * \ 
    781805                  float(len(self.referenceGenes)) / r_count, 
    782806                  ",".join(genes) 
    783807                  ] 
    784                  for t_id, (genes, p_value, r_count) in terms] 
     808                 for t_id, (genes, p_value, r_count, fdr) in terms] 
    785809 
    786810        if terms: 
     
    917941    def sendReport(self): 
    918942        self.reportSettings("Settings", [("Organism", self.annotationCodes[min(self.annotationIndex, len(self.annotationCodes) - 1)]), 
    919                                          ("Significance test", ("Binomial" if self.probFunc == 0 else "Hypergeometric") + (" with FDR" if self.useFDR else ""))]) 
     943                                         ("Significance test", ("Binomial" if self.probFunc == 0 else "Hypergeometric") )]) 
    920944        self.reportSettings("Filter", ([("Min cluster size", self.minNumOfInstances)] if self.filterByNumOfInstances else []) + \ 
    921                                       ([("Max p-value", self.maxPValue)] if self.filterByPValue else [])) 
     945                                      ([("Max p-value", self.maxPValue_nofdr)] if self.filterByPValue_nofdr else []) + \ 
     946                                      ([("Max FDR", self.maxPValue)] if self.filterByPValue else [])) 
    922947 
    923948        def treeDepth(item): 
     
    927952            text = '<tr>' + '<td width=16px></td>' * level 
    928953            text += '<td colspan="%i">%s: %s</td>' % (treeDepth - level, item.term.id, item.term.name) 
    929             text += ''.join('<td>%s</td>' % item.text(i) for i in range(1, 4) + [5]) + '</tr>\n' 
     954            text += ''.join('<td>%s</td>' % item.text(i) for i in range(1, 5) + [6]) + '</tr>\n' 
    930955            for i in range(item.childCount()): 
    931956                text += printTree(item.child(i), level + 1, treeDepth) 
     
    934959        treeDepth = max([treeDepth(self.listView.topLevelItem(i)) for i in range(self.listView.topLevelItemCount())] + [0]) 
    935960         
    936         tableText = '<table>\n<tr>' + ''.join('<th>%s</th>' % s for s in ["Term:", "List:", "Reference:", "P-value:", "Enrichment:"]) + '</tr>' 
     961        tableText = '<table>\n<tr>' + ''.join('<th>%s</th>' % s for s in ["Term:", "List:", "Reference:", "p-value:", "FDR", "Enrichment:"]) + '</tr>' 
    937962         
    938963        treeText = '<table>\n' +  '<th colspan="%i">%s</th>' % (treeDepth, "Term:")  
    939         treeText += ''.join('<th>%s</th>' % s for s in ["List:", "Reference:", "P-value:", "Enrichment:"]) + '</tr>' 
     964        treeText += ''.join('<th>%s</th>' % s for s in ["List:", "Reference:", "p-value:", "FDR", "Enrichment:"]) + '</tr>' 
    940965         
    941966        for index in range(self.sigTerms.topLevelItemCount()): 
     
    966991        gc.collect() # Force collection 
    967992         
     993 
     994fmtp = lambda score: "%0.5f" % score if score > 10e-4 else "%0.1e" % score 
     995fmtpdet = lambda score: "%0.9f" % score if score > 10e-4 else "%0.5e" % score 
    968996 
    969997class GOTreeWidgetItem(QTreeWidgetItem): 
     
    9811009        fmt = "%" + str(-int(math.log(nRefGenes))) + "i (%.2f%%)" 
    9821010        self.setText(2, fmt % (enrichmentResult[2], 100.0*enrichmentResult[2]/nRefGenes)) 
    983         self.setText(3, "%.4f" % enrichmentResult[1]) 
    984         self.setText(4, ", ".join(enrichmentResult[0])) 
    985         self.setText(5, "%.2f" % (enrichment(enrichmentResult))) 
     1011        self.setText(3, fmtp(enrichmentResult[1])) 
     1012        self.setToolTip(3, fmtpdet(enrichmentResult[1])) 
     1013        self.setText(4, fmtp(enrichmentResult[3])) #FDR 
     1014        self.setToolTip(4, fmtpdet(enrichmentResult[3])) 
     1015        self.setText(5, ", ".join(enrichmentResult[0])) 
     1016        self.setText(6, "%.2f" % (enrichment(enrichmentResult))) 
     1017        self.setToolTip(6, "%.2f" % (enrichment(enrichmentResult))) 
    9861018        self.setToolTip(0, "<p>" + term.__repr__()[6:].strip().replace("\n", "<br>")) 
    987         self.sortByData = [term.name, len(self.enrichmentResult[0]), enrichmentResult[2], enrichmentResult[1], ", ".join(enrichmentResult[0]), enrichment(enrichmentResult)] 
     1019        self.sortByData = [term.name, len(self.enrichmentResult[0]), enrichmentResult[2], enrichmentResult[1], enrichmentResult[3], ", ".join(enrichmentResult[0]), enrichment(enrichmentResult)] 
    9881020 
    9891021    def data(self, col, role): 
  • setup.py

    r1880 r1883  
    1616DOCUMENTATION_NAME = 'Orange Bioinformatics' 
    1717 
    18 VERSION = '2.5a15' 
     18VERSION = '2.5a16' 
    1919 
    2020DESCRIPTION = 'Orange Bioinformatics add-on for Orange data mining software package.' 
Note: See TracChangeset for help on using the changeset viewer.